自分が管理している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
おわりに
コンテナの構成がだいぶ変わったので大変かと思いましたが、やってみたらそうでもありませんでした。