Redash を Docker で運用する

Redash

ご存知、いわゆる BIツール の OSS 版の元祖(?)です。

インストール方法

Docker(Docker Compose)でのインストール方法を含めたインストール方法の概要は公式ページに載っています。

Setting up a Redash Instance

基本的には上記に従うだけでインストールができます。今回は Docker(Docker Compose)でインストールをしてみます。

具体的な手順

具体的にインストールの手順を追っていきます。

1. リポジトリから clone する

まずは Redash のリポジトリから clone をします。

2. docker-compose.production.yml ファイルを編集する

clone したファイル群の中にある docker-compose.production.yml を編集します。docker-compose.yml というファイルもあり、こちらは開発用(試験用)ということになっています。

アプリケーションを利用する側の場合には開発用を使う必要は特に無いと思いますので、いきなりproduction用のファイルを編集してよいと思います。

3. 編集した docker-compose.production.yml をベタ貼り

以下、私が編集した docker-compose.production.yml の内容をそのまま貼り付けます。少々長いですが省略すると分かりづらくなるので、全て書きます。

# This is an example configuration for Docker Compose. Make sure to atleast update
# the cookie secret & postgres database password.
#
# Some other recommendations:
# 1. To persist Postgres data, assign it a volume host location.
# 2. Split the worker service to adhoc workers and scheduled queries workers.
version: '2'
services:
  server:
    image: redash/redash:3.0.0.b2996
    # image: redash/redash
    container_name: my-redash-server
    hostname: my_redash_server
    command: server
    depends_on:
      - postgres
      - redis
    ports:
      - "31001:5000" # nginx で振り分けているのでこの値は実質的には意味がない
    environment:
      PYTHONUNBUFFERED: 0
      REDASH_LOG_LEVEL: "INFO"
      REDASH_REDIS_URL: "redis://redis:6379/0"
      REDASH_DATABASE_URL: "postgresql://postgres@postgres/postgres"
      REDASH_COOKIE_SECRET: veryverysecret
      REDASH_WEB_WORKERS: 4
      REDASH_HOST: "http://redash.domain.name"
      REDASH_MAIL_SERVER: "smtp.gmail.com"
      REDASH_MAIL_PORT: 587
      REDASH_MAIL_USE_TLS: "True"
      REDASH_MAIL_USERNAME: "YOUR_ACCOUNT_NAME@gmail.com"
      REDASH_MAIL_PASSWORD: "YOUR_PASSWORD"
      REDASH_MAIL_DEFAULT_SENDER: "Redash Admin <YOUR_ACCOUNT_NAME@gmail.com>"
      REDASH_DATE_FORMAT: "YYYY-MM-DD"
      REDASH_ALLOW_SCRIPTS_IN_USER_INPUT: "True"
    restart: always
  worker:
    image: redash/redash:3.0.0.b2996
    # image: redash/redash
    container_name: my-redash-worker
    hostname: my_redash_worker
    command: scheduler
    environment:
      PYTHONUNBUFFERED: 0
      REDASH_LOG_LEVEL: "INFO"
      REDASH_REDIS_URL: "redis://redis:6379/0"
      REDASH_DATABASE_URL: "postgresql://postgres@postgres/postgres"
      QUEUES: "queries,scheduled_queries,celery"
      WORKERS_COUNT: 2
      REDASH_HOST: "http://redash.domain.name"
      REDASH_MAIL_SERVER: "smtp.gmail.com"
      REDASH_MAIL_PORT: 587
      REDASH_MAIL_USE_TLS: "True"
      REDASH_MAIL_USERNAME: "YOUR_ACCOUNT_NAME@gmail.com"
      REDASH_MAIL_PASSWORD: "YOUR_PASSWORD"
      REDASH_MAIL_DEFAULT_SENDER: "Redash Admin <YOUR_ACCOUNT_NAME@gmail.com>"
      REDASH_DATE_FORMAT: "YYYY-MM-DD"
      REDASH_ALLOW_SCRIPTS_IN_USER_INPUT: "True"
    restart: always
  redis:
    image: redis:3.0-alpine
    container_name: my-redash-redis
    hostname: my_redash_redis
    restart: always
  postgres:
    image: postgres:9.5.6-alpine
    container_name: my-redash-postgres
    hostname: my_redash_postgres
    # volumes:
    #   - /opt/postgres-data:/var/lib/postgresql/data
    volumes:
      - ./postgres-data:/var/lib/postgresql/data
    restart: always
  nginx:
    # image: redash/nginx:latest
    image: redash/nginx
    container_name: my-redash-nginx
    hostname: my_redash_nginx
    ports:
      - "31000:80"
    depends_on:
      - server
    links:
      - server:redash
    restart: always

4. 編集した箇所の詳細

編集した部分の細かな説明をします。

  • 全てのコンテナに restart: always を付与
    • マシン再起動時などに改めて docker-compose up しなくて済むように restart: alwaysを付与します
  • redashイメージは最新版を指定した
    • Redash の Docker イメージは latest ですと現在は 2.x が入りますが、3.x を試してみたいのでバージョンを明記して指定しました
  • serverの外側ポートに30001を指定した
    • コメントにもあるようにここは実質的にはあまり意味がないです
    • 既存ポートとのバッティングを避けるための変更ぐらいでしょうか*1
  • serverenvironmentREDASH_COOKIE_SECRETは可能ならば変えたほうがいい
    • 利用者の範囲が狭く、悪意のある操作などは起こりえないため、REDASH_COOKIE_SECRETはデフォルトのままにしました
  • serverenvironmentREDASH_HOST以下
    • メールのSMTPの設定です(Gmail を使用)
    • .envでの記述が推奨されていますが、ここではdocker-composeに押し込んでいます
  • workerenvironmentREDASH_HOST以下
    • 上記の「serverenvironmentREDASH_HOST以下」と同じです
  • postgresvolumesの場所
    • これは単に保存場所を変えただけです
    • 永続化のためにvolumesは設定したほうがいいでしょう
  • nginxportsの変更
    • ここのポート番号が外側にさらけ出されるポート番号になります

5. マイグレーションを行う

ここまで来ればあとは公式に従うだけです。マイグレーションをしましょう。

$ docker-compose -f docker-compose.production.yml run --rm server create_db

ここなんですが、私が実行した際には、1回目は以下のようなエラーが出てしまいます。

sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not connect to server: Connection refused
    Is the server running on host "postgres" (172.18.0.2) and accepting
    TCP/IP connections on port 5432?

しかしその後めげずに再度実行すると以下のように無事終了します。起動順が悪くて(docker-compose の記述が悪くて) PostgreSQL が見つからないのでしょうか?

[2017-08-28 04:11:58,412][PID:1][INFO][alembic.runtime.migration] Running stamp_revision  -> d1eae8b9893e

6. docker-compose up する

docker-compose upすれば Redash が起動するはずです。起動が確認でき、安定的に動作することが確認できたら、一度 docker-compose down をして、-d オプションを付けてデーモンで起動するとよいと思います。

$ docker-compose -f docker-compose.production.yml up

あとは公式サイトを参照する

起動できたならば Redash を運用していきます。公式のヘルプがまとまっていますので、そちらを読むといいでしょう。インストールでつまづいたり疑問に思ったことがあったりしたときには、インストールのヘルプも読むといいでしょう。

*1:それならばそもそも指定しないという方法も

Powered by はてなブログ