Ubuntu 上で環境構築していた Redash を Docker 上で動作する環境に移行する手順

この記事は Redash Advent Calendar 2018 25日目。最終日の記事です!

adventar.org

参加いただいたみなさまも、読んでいただいた皆様もありがとうございます!

お題

現在、Redash の環境構築は Docker を使用する方法のみが公式ドキュメントなどでも記載されていますが、古くからの Redash ユーザーにとっては、Ubuntu の上にインストールする形で運用している方も多く、私もそのひとりです。

この記事では、旧来の Ubuntu 上に環境構築された Redash(以降、レガシーセットアップ)を Docker で構築された Redash(以降、Docker セットアップ)に移行する方法を紹介します。

注意事項

この記事で紹介する方法はあらゆる環境を網羅したものではありません。

お使いの環境を移行する際は、必ずご自身で検証してください。

また、この手順は私が業務で Redash を移行する際にも利用しているため、移行作業の結果によって、この記事を加筆修正する場合があります。

前提条件

この記事の検証で使用した Ubuntu と Docker、 Docker Compose のバージョンは以下となっています。

  • Ubuntu 16.04.4 LTS
  • Docker version 18.09.0, build 4d60db4
  • docker-compose version 1.8.0, build unknown

この記事では Docker の導入については割愛しますが、私は以下の記事を参考にして Docker を導入しました。

How To Install and Use Docker on Ubuntu 16.04 | DigitalOcean

手順

PostgreSQL 以外の Redash 関連のサービスを停止

PostgreSQL の DB ダンプを取得する前に、Redash 関連のサービスをすべて停止します。

$ sudo service nginx stop
$ sudo service supervisord stop
$ sudo service redis_6379 stop

サービス名は Redash をどのバージョンから利用しているかによって異なる場合があります。

既存の Redash から DB ダンプを取得する

Docker セットアップ環境で使用する PostgreSQL にリストアするための DB ダンプを取得します。 レガシーセットアップでは PostgreSQL に redash ユーザーを作成しますが、Docker セットアップでは postgres ユーザーを使いますが、そのため、既存環境のダンプファイル取得時にオーナー情報を除去しておきます。

$ sudo -u postgres bash -c "pg_dump --no-owner --no-acl redash | gzip > /tmp/dump.sql.gz"

ダンプファイルの出力先は /opt/docker/redash として、この記事内では以降の説明でも、このディレクトリ内で作業します

既存の PostgreSQL を停止

ダンプファイルを取得したら、既存の PostgreSQL は不要になるためサービスを停止します。

$ sudo service postgresql stop

docker-compose.yml をダウンロードする

移行先バージョンの docker-compose.production.yml をダウンロードします。

この記事では移行先に v5.0.2 を使用するため、GitHub 上でタグを指定してダウンロードしています。

$ wget -o /opt/docker/redash/docker-compose.yml https://raw.githubusercontent.com/getredash/redash/v5.0.2/docker-compose.production.yml

docker-compose.yml を書き換える

Docker セットアップで使用するバージョンに合わせて docker-compose.yml を書き換えます。

バージョンの指定

Docker イメージのタグ一覧 を参照し、利用したいバージョンのタグを指定します。

$ sed -i s/redash\\/redash:latest/redash\\/redash:5.0.2.b5486/g /opt/docker/redash/docker-compose.yml

postgres サービスのボリューム指定

PostgreSQL のデータを保持するボリュームを指定します。

postgres サービスの volumes がコメントアウトされているので、これをアンコメントしてホスト側のパスを書き換えます

...省略...
  postgres:
    image: postgres:9.5.6-alpine
    volumes:
      - /opt/docker/redash/postgres-data:/var/lib/postgresql/data
    restart: always
...省略...

環境変数を設定する

既存の Redash の .env から必要な設定を server, worker サービスの environment に設定します。

ここでは詳細な説明を省きますが、メールサーバーの設定などは .env にで設定することが多いので、忘れずに設定しましょう。

また、server のみに設定してしまい worker に環境変数が適用されないというケースもあるので、忘れずに両方の environment に設定してください。

Docker Compose で起動する

準備ができたら、サービスを起動します。

$ sudo docker-compose up -d

postgres にダンプファイルをコピーする。

新規インストールの手順であればここで create_db を実行するところですが、今回は既存環境からの移行なので、データベースの作成はせずに、先程取得したダンプファイルをリストアします。

そのため、ダンプファイルを postgres サービスが動いているコンテナにコピーします。

$ sudo docker cp /tmp/dump.sql.gz `sudo docker ps|grep postgres|awk '{print $1}'`:/tmp/

DB をリストアする

コピーしたダンプファイルを使って、以下のコマンドでリストアします。

$ sudo docker-compose exec postgres bash -c "zcat /tmp/dump.sql.gz | psql -U postgres"

マイグレーションを実行する

この時点で、DB は作られていますが、古いバージョンのテーブル構造のままになっているため、マイグレーションを実行して移行先のバージョンにあったテーブル構成にします。

$ sudo docker-compose run --rm server manage db upgrade

ここまででレガシーセットアップから Docker セットアップへの移行は完了です。

疎通確認

最後に、curl で簡単に疎通確認してみます。

$ curl -I localhost/api/config

JSON 文字列が表示されていれば、移行した Redash が動作していることが確認できています。

まとめ

バージョンアップにくらべ、さらに腰が重くなるような移行作業ですが、私も今後のアップグレードも見据えて移行を進めています。移行は計画的に進めましょう。