Supervisor型の旧Redash(v4)をDocker型の新バージョン(v8)へアップグレードする

こんにちは。DA事業本部の春田です。

Supervisor型の旧版Redashサーバーをホストしている方はそれなりにいらっしゃるかと思いますが、version8以降から bin/upgrade のサポートが廃止されているのはご存知ですか?( download_url がありません!)

$ curl https://version.redash.io/api/releases | jq
[
  {
    "id": 39,
    "version": "8.0.0",
    "channel": "stable",
    "download_url": "",
    "backward_compatible": false,
    "released_at": "2019-10-27T00:00:00.000Z",
    "description": "See [CHANGELOG](https://github.com/getredash/redash/blob/master/CHANGELOG.md#v800---2019-10-27) for the full release notes.\n\n---\n\n* Before doing an upgrade, please make sure you have a backup.\n* If you have any issues, please refer to the troubleshooting section in the [upgrade guide](https://redash.io/help/open-source/admin-guide/how-to-upgrade).\n* If the upgrade guide doesn't help, you can ask for help on the [forum](https://discuss.redash.io/c/support/support-self-hosted).\n",
    "docker_image": "redash/redash:8.0.0.b32245"
  },
  {
    "id": 37,
    "version": "7.0.0",
    "channel": "stable",
    "download_url": "https://s3.amazonaws.com/redash-releases/redash.7.0.0.b17535.tar.gz",
    "backward_compatible": false,
    "released_at": "2019-03-17T00:00:00.000Z",
    "description": "**Please read the following before upgrading:**\n\n1. If you're using the tarball deployment and not Docker, you might need to manually update some of the dependencies. Compare your current Python dependencies with the ones in the `requirements*.txt` files.\n\n2. This release adds encryption of your data sources configuration. By default it will use the `REDASH_COOKIE_SECRET` as encryption key. But we recommend setting a new key for it using the `REDASH_SECRET_KEY` environment variable. Note that you need to set this **before running migrations**. Otherwise everything will be encrypted with `REDSAH_COOKIE_SECRET`.\n\n---\n\n* Before doing an upgrade, please make sure you have a backup.\n* If you have any issues, please refer to the troubleshooting section in the upgrade guide:\n  https://redash.io/help/open-source/admin-guide/how-to-upgrade\n* If the upgrade guide doesn't help, you can ask for help on the forum (https://discuss.redash.io).\n\nFull CHANGELOG for this release: https://github.com/getredash/redash/blob/master/CHANGELOG.md",
    "docker_image": "redash/redash:7.0.0.b18042"
  },
  ...
]

すなわち、v8以降のバージョンにアップグレードするには、Docker型の新版Redashへ移行する必要があります。この作業にかなり手間がかかったので、本記事にログをまとめておきます。

準備と注意点

EC2でUbuntu16.04のRedash(v4.0.1)サーバーがある想定で進めます。移行先のDocker版Redash(v8.0.0)は、Ubuntu18.04を推奨しておりどのみちデータの移行も必要なので、新規にインスタンスを立てることにします。

注意点は、内部PostgreSQLのユーザーとデータベースがSupervisor型は redash Docker型が postgres と異なっている点です。調節は必要ですが、バージョンが同じであればテーブルやカラム自体に差異はありません。

また、アップグレードは1バージョンずつ行うことが推奨されているので、4.0.1 → 5.0.2 → 6.0.0 → 7.0.0 → 8.0.0というように段階を踏みながら行います。ちょっと面倒ですが、確実にいきたいところです。

Redashサーバーに固有の設定を加えていたり、DBを直接いじっていたり、純粋なRedashサーバーでない場合は、別途それらを反映させることもお忘れないように。

手順

  1. 現行のサーバーに入り、redash pg_dump でダンプファイルを作成
  2. /opt/redash/.envREDASH_COOKIE_SECRET を控えておく
  3. Ubuntu18.04のAMIで、EC2インスタンスを新規立ち上げ
  4. getredash/setupから v4.0.1.b4038 のDocker版Redashを立ち上げる
  5. 立ち上がったコンテナ内のDBに入り、リストアに必要なユーザーやデータベースを作成
  6. dumpファイルからリストア
  7. 再度コンテナDBの中に入り、 redash の所有権を変更し、 postgres と置き換える
  8. /opt/redash/env を修正
  9. 全てのコンテナを再起動して動作確認
  10. 問題なければ、docker-composeを使って1つずつバージョンを上げていく
    1. 4.0.1.b4038 -> 5.0.2.b5486 -> 6.0.0.b8537 -> 7.0.0.b18042 -> 8.0.0.b32245(latest)

ダンプファイルを作成

redashのメタデータのダンプファイルは、 redash pg_dump コマンドによって作成できます。

$ sudo -u redash pg_dump -Fc redash > old_redeash.dump

環境ファイルにある、暗号化に使用しているシークレットキーも控えておきます。

$ vim /opt/redash/.env
#### 以下を控えておく
# REDASH_COOKIE_SECRET=**************************

新規インスタンス立ち上げ

Ubuntu18.04のAMIで、旧インスタンスと同じ設定で新規のインスタンスを立ち上げます。先に、後で使うPostgreSQLのクライアントをインストールしておきます。

$ sudo apt install postgresql-client zip -y

GitHubからRedashセットアップ用のリポジトリを落とし、 setup.sh に修正を加えた後、実行します。スクリプトの修正では、バージョンの指定と、PostgreSQLクライアントからコンテナ内のDBへ接続するための、docker-compose.ymlへの追記を行っています。

$ git clone https://github.com/getredash/setup.git
$ chmod +x setup/setup.sh
$ vim setup/setup.sh
#### 以下をL58とL63の下に追加
# LATEST_VERSION="4.0.1.b4038"
# sed -i -e "44i \ \ \ \ ports:\n      - \"5432:5432\"" docker-compose.yml
####
$ ./setup/setup.sh

Dockerの設定

setup.sh によるセットアップが完了した後、一旦DB以外のコンテナを全て停止させます。

$ cd /opt/redash
$ sudo docker-compose stop server scheduler scheduled_worker adhoc_worker nginx redis

その後、 psql でコンテナ内のDBに入り、redashのユーザーとデータベースを追加します。

$ sudo docker exec -it redash_postgres_1 psql -U postgres
#### psql
# CREATE USER redash;
# CREATE DATABASE redash OWNER redash;

DBのリストア

先ほど作成した旧Redashサーバーのdumpファイルをscpなどで転送し、新RedashのPostgreSQLへリストアを行います。パスワードは環境ファイルの /opt/redash/env の中です。

$ pg_restore -h localhost -U postgres -d postgres -cC -Fc old_redeash.dump

リストアが完了したら、ユーザーとデータベースの調節を行うために、再びコンテナの中に入ります。redashのDBやテーブルの所有権をpostgresに変更し、データベースを置換します。

$ sudo docker exec -it redash_postgres_1 psql -U postgres
#### psql
# ALTER DATABASE redash OWNER TO postgres;
# SELECT 'ALTER TABLE ' || schemaname || '.' || tablename || ' OWNER TO postgres;' FROM pg_tables WHERE tableowner = 'redash'; -- 吐き出されたSQLを実行
# DROP DATABASE postgres;
# ALTER DATABASE redash RENAME TO postgres;

次に、先ほど控えておいた旧環境のシークレットキーを、環境ファイルに追加します。旧環境から移行する場合、 REDASH_COOKIE_SECRETREDASH_SECRET_KEY は同じ値になるそうです。

$ vim /opt/redash/env
#### 以下を置換&実施
# REDASH_COOKIE_SECRET=**************************
# REDASH_SECRET_KEY=**************************

コンテナを再起動し、動作確認を取ります。問題なければ、最後にdockerイメージを使って1つずつバージョンを上げていきましょう。

$ vim docker-compose.yml
#### バージョンは一つずつ上げる
# 4.0.1.b4038 -> 5.0.2.b5486 -> 6.0.0.b8537 -> 7.0.0.b18042 -> 8.0.0.b32245(latest)

$ sudo docker-compose stop server scheduler scheduled_worker adhoc_worker
$ sudo docker-compose run --rm server manage db upgrade
$ sudo docker-compose up -d

今回はv4からアップグレードを行いましたが、dockerイメージとして配布されているv4以上のバージョンなら対応が可能です。v3以下のバージョンを使用している場合は、従来の bin/upgrade の方法でバージョンをv4以上に上げてからDockerに移行しましょう。

redash/redash Tags - Docker Hub

最後に

かなり煩雑な手順でしたが、参考になれば幸いです。別インスタンスを立ち上げれば、現行の環境を汚さなくても新しいバージョンが試せるので、旧版をお使いの方は試してみてください!

参照