Redash数据可视化工具在Rainbond部署以及应用制作

1. 简介

Redash是全球最受欢迎的开源实时数据可视化和商业智能(BI)软件,基于新一代云计算和数据分析技术,架构最先进、支持云部署、大并发、定时主动获取等特征;支持数据源种类最全、分析统计图最专业;响应式B/S架构、操作简单、自助使用、会写SQL就会定义报表、队列技术运行快捷、扩展性强、拥有成本低;广泛应用于企事业单位、政府机关等需要数据驱动、数据决策、数字化和数智化建设等领域。

2. 快速部署

Redash已发布到开源应用商店,可以直接从应用商店安装 Redash。

3.应用制作过程

已经制作好适用与Rainbond的DockerCompose,请参考Github

本次应用制作 参考官方的安装方式,使用docker-compose安装,官方docker-compose地址

打开官方Github地址进入data目录可看到docker-compose.yml文件,查看文件可看到有一些不是docker-compose的原生语法,比如&<<: 这些都是anchor 的YAML功能,并非Docker Compose特有。可参考 https://learnxinyminutes.com/docs/yaml/ 详细了解。

包括官方的yaml文件引入的环境变量方式是引入的文件。

以上在Rianbond的基于DockerCompose创建组件中是不支持的,只支持原生语法。

接下来修改DockerCompose.yml文件:

1. 首先修改DockerCompose文件中的 env_file: /opt/redash/env ,改为environment:引入

#编辑setup.sh脚本文件,注释掉最后几行,保留 create_config 用于生成环境变量配置文件
vim setup.sh

#install_docker
#create_directories
create_config
#setup_compose

#最后执行
sh setup.sh
#可在/opt/redash中看到env文件

2. 将输出后的env文件写入到DockerCompose文件中

可以看到官方DockerCompose文件开头的这部分,这部分意思是基础环境,&redash-service代表基础环境名称,供其他引用。

当然这部分也不是DockerCompose原生语法,在Rainbond是不支持的,完成后需要删掉这部分。

x-redash-service: &redash-service
  image: redash/redash:8.0.0.b32245
  depends_on:
    - postgres
    - redis
  env_file: /opt/redash/env
  restart: always

可以看到大部分模块都引用了<<: *redash-service,这意思是引用基础模块。我们需要把每个引用基础模块的部分复制到所需模块,需要更改所有引用了基础模块的部分。这里举个例子,例如:

server:
    image: redash/redash:8.0.0.b32245
    depends_on:
      - postgres
      - redis
    restart: always
    command: server
    ports:
      - "5000:5000"
    environment:
      REDASH_WEB_WORKERS: 4
      PYTHONUNBUFFERED: 0
      REDASH_LOG_LEVEL: INFO
      REDASH_REDIS_URL: redis://127.0.0.1:6379/0
      POSTGRES_PASSWORD: xDiTJI9b4851H3NPIrmW91TLKlomqK1g
      REDASH_COOKIE_SECRET: CBvWC682U8DvhkGThqsvLT84kHHqHtMD
      REDASH_SECRET_KEY: 3j0uYt2k0ugHIaoBK2BXePo4WsHkmoXK
      REDASH_DATABASE_URL: postgresql://postgres:xDiTJI9b4851H3NPIrmW91TLKlomqK1g@127.0.0.1/postgres

可以看到以上内容的environment部分,以及把生成的环境变量引入进来了。其中127.0.0.1是Rainbond中的连接方式,请参考文档组件通信。默认是DockerCompose的连接方式。

3. 修改初始化数据库

官方提供的初始化方式,使用命令初始化。

docker-compose run --rm server create_db

只有我觉得这种方式鸡肋吗!!

所以我在初始化后导了一份SQL文件重新做了镜像,使用pgsql官方镜像,把sql丢进/docker-entrypoint-initdb.d下,启动容器时自动初始化。

文件可查看Github仓库

也可使用制作好的镜像:registry.cn-hangzhou.aliyuncs.com/zqqq/redash-pgsql:9.5.6-alpine

FROM postgres:9.5.6-alpine
ADD public.sql /docker-entrypoint-initdb.d

还需要修改postgresvolumes字段:

volumes:
      - /opt/redash/postgres-data:/var/lib/postgresql/data
#修改为
volumes:
      - /var/lib/postgresql/data
#在Rainbond中只需要指定容器内需要挂载的路径

4. 修改nginx配置文件

官方镜像中的配置文件中的proxy_pass http://server:5000,这种方式是DockerCompose连接方式,在Rainbond中不支持,需要改为127.0.0.1。所以需要重新做个镜像。

文件可查看Github仓库

也可使用制作好的镜像:registry.cn-hangzhou.aliyuncs.com/zqqq/redash-nginx:latest

server {
  listen   80;

  gzip on;
  gzip_types *;
  gzip_proxied any;
  proxy_buffer_size 8k;

  location / {
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;

    proxy_pass       http://127.0.0.1:5000;
  }
}

5. 至此完成,下面是完整yml文件

version: "2"
services:
  server:
    image: redash/redash:8.0.0.b32245
    depends_on:
      - postgres
      - redis
    restart: always
    command: server
    ports:
      - "5000:5000"
    environment:
      REDASH_WEB_WORKERS: 4
      PYTHONUNBUFFERED: 0
      REDASH_LOG_LEVEL: INFO
      REDASH_REDIS_URL: redis://127.0.0.1:6379/0
      POSTGRES_PASSWORD: xDiTJI9b4851H3NPIrmW91TLKlomqK1g
      REDASH_COOKIE_SECRET: CBvWC682U8DvhkGThqsvLT84kHHqHtMD
      REDASH_SECRET_KEY: 3j0uYt2k0ugHIaoBK2BXePo4WsHkmoXK
      REDASH_DATABASE_URL: postgresql://postgres:xDiTJI9b4851H3NPIrmW91TLKlomqK1g@127.0.0.1/postgres
  scheduler:
    image: redash/redash:8.0.0.b32245
    depends_on:
      - postgres
      - redis
    restart: always
    command: scheduler
    environment:
      QUEUES: "celery"
      WORKERS_COUNT: 1
      PYTHONUNBUFFERED: 0
      REDASH_LOG_LEVEL: INFO
      REDASH_REDIS_URL: redis://127.0.0.1:6379/0
      POSTGRES_PASSWORD: xDiTJI9b4851H3NPIrmW91TLKlomqK1g
      REDASH_COOKIE_SECRET: CBvWC682U8DvhkGThqsvLT84kHHqHtMD
      REDASH_SECRET_KEY: 3j0uYt2k0ugHIaoBK2BXePo4WsHkmoXK
      REDASH_DATABASE_URL: postgresql://postgres:xDiTJI9b4851H3NPIrmW91TLKlomqK1g@127.0.0.1/postgres
  scheduled_worker:
    image: redash/redash:8.0.0.b32245
    depends_on:
      - postgres
      - redis
    restart: always
    command: worker
    environment:
      QUEUES: "scheduled_queries,schemas"
      WORKERS_COUNT: 1
      PYTHONUNBUFFERED: 0
      REDASH_LOG_LEVEL: INFO
      REDASH_REDIS_URL: redis://127.0.0.1:6379/0
      POSTGRES_PASSWORD: xDiTJI9b4851H3NPIrmW91TLKlomqK1g
      REDASH_COOKIE_SECRET: CBvWC682U8DvhkGThqsvLT84kHHqHtMD
      REDASH_SECRET_KEY: 3j0uYt2k0ugHIaoBK2BXePo4WsHkmoXK
      REDASH_DATABASE_URL: postgresql://postgres:xDiTJI9b4851H3NPIrmW91TLKlomqK1g@127.0.0.1/postgres
  adhoc_worker:
    image: redash/redash:8.0.0.b32245
    depends_on:
      - postgres
      - redis
    restart: always
    command: worker
    environment:
      QUEUES: "queries"
      WORKERS_COUNT: 2
      PYTHONUNBUFFERED: 0
      REDASH_LOG_LEVEL: INFO
      REDASH_REDIS_URL: redis://127.0.0.1:6379/0
      POSTGRES_PASSWORD: xDiTJI9b4851H3NPIrmW91TLKlomqK1g
      REDASH_COOKIE_SECRET: CBvWC682U8DvhkGThqsvLT84kHHqHtMD
      REDASH_SECRET_KEY: 3j0uYt2k0ugHIaoBK2BXePo4WsHkmoXK
      REDASH_DATABASE_URL: postgresql://postgres:xDiTJI9b4851H3NPIrmW91TLKlomqK1g@127.0.0.1/postgres
  redis:
    image: redis:5.0-alpine
    restart: always
    ports:
      - "6379:6379/tcp"
  postgres:
    image: registry.cn-hangzhou.aliyuncs.com/zqqq/redash-pgsql:9.5.6-alpine
    environment:
      PYTHONUNBUFFERED: 0
      REDASH_LOG_LEVEL: INFO
      REDASH_REDIS_URL: redis://127.0.0.1:6379/0
      POSTGRES_PASSWORD: xDiTJI9b4851H3NPIrmW91TLKlomqK1g
      REDASH_COOKIE_SECRET: CBvWC682U8DvhkGThqsvLT84kHHqHtMD
      REDASH_SECRET_KEY: 3j0uYt2k0ugHIaoBK2BXePo4WsHkmoXK
      REDASH_DATABASE_URL: postgresql://postgres:xDiTJI9b4851H3NPIrmW91TLKlomqK1g@127.0.0.1/postgres
    volumes:
      - /var/lib/postgresql/data
    restart: always
    ports:
      - "5432:5432/tcp"
  nginx:
    image: registry.cn-hangzhou.aliyuncs.com/zqqq/redash-nginx:latest
    ports:
      - "80:80"
    depends_on:
      - server
    links:
      - server:redash
    restart: always

最后:Redash有中文版,有兴趣的小伙伴可根据以上思路,制作一个中文版的。制作成功的小伙伴如果有意向贡献给开源商店,请加官方技术群,在群聊中@Q 经过审核后可在开源商店中上架哦,当然了应用描述中也会有你的署名。欢迎贡献:clap::clap::clap: