自分が管理しているRedashをv5.0からv7.0にバージョンアップしました。

今回、docker-compose.ymlのサービス構成が結構変わっていたので見ていきます。

docker-compose.ymlの変更点

v5.0のdocker-compose.yml

まず変更前のv5.0のdocker-compose.ymlを見ていきます。

https://github.com/getredash/redash/blob/v5.0.0/docker-compose.production.yml

  • Redashはserverとworkerの2サービス構成
  • 環境変数はそれぞれのサービスにenvironmentは定義されている
# 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:latest
    command: server
    depends_on:
      - postgres
      - redis
    ports:
      - "5000:5000"
    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
    restart: always
  worker:
    image: redash/redash:latest
    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
    restart: always
  redis:
    image: redis:3.0-alpine
    restart: always
  postgres:
    image: postgres:9.5.6-alpine
    # volumes:
    #   - /opt/postgres-data:/var/lib/postgresql/data
    restart: always
  nginx:
    image: redash/nginx:latest
    ports:
      - "80:80"
    depends_on:
      - server
    links:
      - server:redash
    restart: always

v7.0のdocker-compose.yml

続いてv7.0の方を見ていきます。

https://github.com/getredash/redash/blob/master/setup/docker-compose.yml

リポジトリのパスもsetupフォルダに移動され、ファイル名もdocker-compose.production.ymlからdocker-compose.ymlに変更されています。

  • server/scheduler/scheduled_worker/adhoc_workerの4サービス構成になった
  • サービスの定義の共通部分はx-redash-serviceとして定義され共有されるようになった
  • 環境変数はenv_fileに定義してサービス間で共有するようになった
version: '2'
x-redash-service: &redash-service
  image: redash/redash:7.0.0.b18042
  depends_on:
    - postgres
    - redis
  env_file: /opt/redash/env
  restart: always
services:
  server:
    <<: *redash-service
    command: server
    ports:
      - "5000:5000"
    environment:
      REDASH_WEB_WORKERS: 4
  scheduler:
    <<: *redash-service
    command: scheduler
    environment:
      QUEUES: "celery"
      WORKERS_COUNT: 1
  scheduled_worker:
    <<: *redash-service
    command: worker
    environment:
      QUEUES: "scheduled_queries,schemas"
      WORKERS_COUNT: 1
  adhoc_worker:
    <<: *redash-service
    command: worker
    environment:
      QUEUES: "queries"
      WORKERS_COUNT: 2
  redis:
    image: redis:5.0-alpine
    restart: always
  postgres:
    image: postgres:9.5-alpine
    env_file: /opt/redash/env
    volumes:
      - /opt/redash/postgres-data:/var/lib/postgresql/data
    restart: always
  nginx:
    image: redash/nginx:latest
    ports:
      - "80:80"
    depends_on:
      - server
    links:
      - server:redash
    restart: always

/opt/redash/envが必要なので作成します。
ホストOSがUbuntuだったらsetup.shを実行すれば作成できるんですが、ホストOSはCentOS7で使っているのでsetup.shを参考に作成します。

PYTHONUNBUFFERED=0
REDASH_LOG_LEVEL=INFO
REDASH_REDIS_URL=redis://redis:6379/0
POSTGRES_PASSWORD=postgres
REDASH_COOKIE_SECRET=veryverysecret
REDASH_SECRET_KEY=veryverysecret
REDASH_DATABASE_URL=postgresql://postgres:postgres@postgres/postgres

アップグレード手順

以前は公式サイトに手順が書いてなかったのでQiitaに記事を書いたのですが、現在は公式サイトを見ながらアップデートします。

https://redash.io/help/open-source/admin-guide/how-to-upgrade

構成が変わっていますが、docker-compose.ymlを最新化して、 コンテナ停止、DBマイグレート、サービス起動でアップグレードできるはずです。

実際にアップデートしてみる

  • まずアップデート前にDBのバックアップをしておきます。公式サイトにもあるようにRedisのデータは一時的ですのでバックアップする必要ありません。
$ docker exec -i redash_postgres_1 pg_dump -U postgres > redash.dump
  • コンテナを停止します
$ docker-compose stop
Stopping redash_nginx_1    ... done
Stopping redash_mysql_1    ... done
Stopping redash_server_1   ... done
Stopping redash_worker_1   ... done
Stopping redash_redis_1    ... done
Stopping redash_postgres_1 ... done
  • docker-compose.xmlをv7.0に対応したものへ更新します。

  • manage db upgradeでDDLの変更を反映させます。

$ docker-compose run --rm server manage db upgrade
WARNING: Found orphan containers (redash_worker_1) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
Starting redash_postgres_1 ... done
Starting redash_redis_1    ... done
[2019-05-11 19:06:05,865][PID:1][INFO][root] Generating grammar tables from /usr/lib/python2.7/lib2to3/Grammar.txt
[2019-05-11 19:06:05,903][PID:1][INFO][root] Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt
[2019-05-11 19:06:09,296][PID:1][INFO][alembic.runtime.migration] Context impl PostgresqlImpl.
[2019-05-11 19:06:09,298][PID:1][INFO][alembic.runtime.migration] Will assume transactional DDL.
[2019-05-11 19:06:09,327][PID:1][INFO][alembic.runtime.migration] Running upgrade 71477dadd6ef -> 640888ce445d, Add new scheduling data.
[2019-05-11 19:06:09,373][PID:1][INFO][alembic.runtime.migration] Running upgrade 640888ce445d -> e7f8a917aa8e, Add user details JSON column.
[2019-05-11 19:06:09,391][PID:1][INFO][alembic.runtime.migration] Running upgrade e7f8a917aa8e -> 73beceabb948, bring_back_null_schedule
[2019-05-11 19:06:09,396][PID:1][INFO][alembic.runtime.migration] Running upgrade 73beceabb948 -> 98af61feea92, add_encrypted_options_to_data_sources
[2019-05-11 19:06:09,407][PID:1][INFO][alembic.runtime.migration] Running upgrade 98af61feea92 -> e5c7a4e2df4d, remove_query_tracker_keys
  • あとはコンテナを起動してアップデート完了になります。
$ docker-compose up -d
redash_redis_1 is up-to-date
redash_postgres_1 is up-to-date
Creating redash_scheduler_1        ... done
Creating redash_scheduled_worker_1 ... done
Creating redash_server_1           ... done
Creating redash_adhoc_worker_1     ... done
Creating redash_nginx_1            ... done

redash_worker_1は不要なので削除しておいてください。

今回やったDBを作り直す手順

通常は上記の手順で簡単にアップグレードできます。
ただ、今回はPostgreSQLのデータの持ち方を改善したくてDBを作り直しました。

明示的にVolume名を指定せずにコンテナを作ってしまうと下記のように名前がハッシュ値になってどれが何に使われているか非常に分かりにくいです。

$ docker volume ls
DRIVER              VOLUME NAME
local               661270afe92d791b0f456f6b107ead6bfcbcdfc4bc4f1dd89fc1183f4d9498e2
local               71a75d13aab20564523737a2ea3bc1ab69bf2040c0c53ca06cc8b592eba6d219
local               7b48223e0438d227735400f932c3d5eb256446bb59c478593fc5ad36ff095c53

ボリューム名はリネームできないようですし、ホスト側にマウントする方式の方が何かと便利なので作り直しました。 /var/lib/postgresql/dataをカレントディレクトリにマウントするようにdocker-compose.ymlを書き換えています。

  postgres:
    image: postgres:9.5-alpine
    env_file: /opt/redash/env
    volumes:
      - ./postgres-data:/var/lib/postgresql/data

手順

  • 前述した通り、PostgreSQLのデータだけあれば戻せるのでpg_dumpでバックアップしておきます。
$ docker exec -i redash_postgres_1 pg_dump -U postgres > redash.dump
  • もうコンテナは不要なのですべて削除します。
$ docker-compose down
Stopping redash_nginx_1    ... done
Stopping redash_server_1   ... done
Stopping redash_worker_1   ... done
Stopping redash_postgres_1 ... done
Stopping redash_redis_1    ... done
Removing redash_nginx_1    ... done
Removing redash_server_1   ... done
Removing redash_worker_1   ... done
Removing redash_postgres_1 ... done
Removing redash_redis_1    ... done
Removing network redash_default
  • volumeを削除します。今回はすべて削除して良かったのでpruneしましたが、必要に応じて個別に削除してください。
$ docker volume prune
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
661270afe92d791b0f456f6b107ead6bfcbcdfc4bc4f1dd89fc1183f4d9498e2
71a75d13aab20564523737a2ea3bc1ab69bf2040c0c53ca06cc8b592eba6d219
7b48223e0438d227735400f932c3d5eb256446bb59c478593fc5ad36ff095c53
  • 続けてcreate_dbでDBスキーマを作成します。
$ docker-compose run --rm server create_db
Creating network "redash_default" with the default driver
Creating redash5_redis_1    ... done
Creating redash5_postgres_1 ... done
[2019-05-12 02:32:26,164][PID:1][INFO][root] Generating grammar tables from /usr/lib/python2.7/lib2to3/Grammar.txt
[2019-05-12 02:32:26,218][PID:1][INFO][root] Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt
[2019-05-12 02:32:30,056][PID:1][INFO][alembic.runtime.migration] Context impl PostgresqlImpl.
[2019-05-12 02:32:30,058][PID:1][INFO][alembic.runtime.migration] Will assume transactional DDL.
[2019-05-12 02:32:30,097][PID:1][INFO][alembic.runtime.migration] Running stamp_revision  -> e5c7a4e2df4d
  • バックアップからリストアするため、publicスキーマを一旦削除して再作成します。
$ docker exec -i redash_postgres_1 psql -U postgres -c 'drop schema public cascade; create schema public' 
  • バックアップしておいたv5.0のdumpファイルをリストアします。
$ cat redash.dump | docker exec -i redash_postgres_1 psql -U postgres
  • DDLの変更を反映するため、manage db upgradeを実行します。
$ docker-compose run --rm server manage db upgrade
Starting redash_redis_1 ... done
Starting redash_postgres_1 ... done
[2019-05-12 02:36:33,903][PID:1][INFO][root] Generating grammar tables from /usr/lib/python2.7/lib2to3/Grammar.txt
[2019-05-12 02:36:33,972][PID:1][INFO][root] Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt
[2019-05-12 02:36:37,126][PID:1][INFO][alembic.runtime.migration] Context impl PostgresqlImpl.
[2019-05-12 02:36:37,128][PID:1][INFO][alembic.runtime.migration] Will assume transactional DDL.
[2019-05-12 02:36:37,151][PID:1][INFO][alembic.runtime.migration] Running upgrade 71477dadd6ef -> 640888ce445d, Add new scheduling data.
[2019-05-12 02:36:37,187][PID:1][INFO][alembic.runtime.migration] Running upgrade 640888ce445d -> e7f8a917aa8e, Add user details JSON column.
[2019-05-12 02:36:37,210][PID:1][INFO][alembic.runtime.migration] Running upgrade e7f8a917aa8e -> 73beceabb948, bring_back_null_schedule
[2019-05-12 02:36:37,221][PID:1][INFO][alembic.runtime.migration] Running upgrade 73beceabb948 -> 98af61feea92, add_encrypted_options_to_data_sources
[2019-05-12 02:36:37,236][PID:1][INFO][alembic.runtime.migration] Running upgrade 98af61feea92 -> e5c7a4e2df4d, remove_query_tracker_keys
  • あとはコンテナを起動してアップデート完了になります。
$ docker-compose up -d
redash_redis_1 is up-to-date
redash_postgres_1 is up-to-date
Creating redash_scheduler_1        ... done
Creating redash_scheduled_worker_1 ... done
Creating redash_server_1           ... done
Creating redash_adhoc_worker_1     ... done
Creating redash_nginx_1            ... done

おわりに

コンテナの構成がだいぶ変わったので大変かと思いましたが、やってみたらそうでもありませんでした。