🐸

AMIで建てたRedash(v8)を自前で作る環境のRedash(v10)に乗り換える

2023/03/05に公開

事前に分かってること

AMIで建てた環境はDockerが敷かれていてこんな感じらしい

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

postgresqlのデータを抜き出す

まずpostgresqlの中のデータを抜き出す
docker ps で覗くと postgres:9.6-alpine があったのでこいつをdumpしていく

$ sudo docker ps
$ sudo docker exec {container_id} pg_dump -U postgres  > dump.sql

サーバーの外に持ってきておく

$ scp {...}:/home/ubuntu/dump.sql .

新環境にDockerを入れる

今回はec2でubuntuを建てました

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.1 LTS
Release:        22.04
Codename:       jammy

Docker入れていく

https://docs.docker.com/engine/install/ubuntu/

sudoなしでも実行できるようにする

$ sudo gpasswd -a ubuntu docker
$ sudo systemctl restart docker
$ exit

docker-compose.ymlとenvを書く

/opt の下に redash ディレクトリを作ってここに置いておきます

$ cd/opt
$ sudo mkdir redash
$ sudo vim docker-compose.yml
$ sudo vim env
$ sudo chmod 755 -R redash

v8の時と似たようなyml置いておけば良さそうですが、今回はDB(※)をインスタンス外に繋ぎに行きたかったので、そこだけ変えています

※ 分析データが入っているデータではなく、redashのユーザーデータやクエリーデータを保存するDB

公式が指示するv8→v10のマイグレーション作業にも従いました

https://github.com/getredash/redash/releases/tag/v10.0.0

docker-compose.yml

version: "3.9"
x-redash-service: &redash-service
  image: redash/redash:10.0.0.b50363
  depends_on:
    - redis
  env_file: ./env
  restart: always

services:
  server:
    <<: *redash-service
    command: server
    ports:
      - "5000:5000"
    environment:
      REDASH_WEB_WORKERS: 4
  scheduler:
    <<: *redash-service
    command: scheduler
  scheduled_worker:
    <<: *redash-service
    command: worker
    environment:
      QUEUES: "scheduled_queries,schemas"
      WORKERS_COUNT: 1
  worker:
    <<: *redash-service
    command: worker
    environment:
      QUEUES: "periodic emails default"
      WORKERS_COUNT: 1
  adhoc_worker:
    <<: *redash-service
    command: worker
    environment:
      QUEUES: "queries"
      WORKERS_COUNT: 2
  redis:
    image: redis:5.0-alpine
    restart: always
  nginx:
    image: redash/nginx:latest
    ports:
      - "80:80"
    depends_on:
      - server
    links:
      - server:redash
    restart: always

env

PYTHONUNBUFFERED=0
REDASH_LOG_LEVEL=INFO
REDASH_REDIS_URL=redis://redis:6379/0
REDASH_COOKIE_SECRET={ランダムな値}
REDASH_SECRET_KEY={ランダムな値}
REDASH_DATABASE_URL=postgresql://{ユーザー名}:{パスワード}@{ホスト}/{DB名}

ちなみに、REDASH_COOKIE_SECRETとかで使っているランダムな値は

$ python -c 'import secrets; print(secrets.token_hex())'

で取ると良いらしい。 参照: https://redash.io/help/open-source/admin-guide/secrets

DBを外部に建てたのでPostgreSQL関連の記述を全て消しています

起動してみる

先程のdump.sqlは一旦スルーして、起動してみます

$ docker compose run --rm server create_db 
$ docker compose up -d
$ open {host}:80

出てきた 🎉

バックアップを復元

DBに繋いで一旦試しに動かしてみた時のデータを葬ります

$ psql -h {ホスト名} -U {ユーザー名} -d postgres --password
=> DROP DATABASE {DB名};
=> CREATE DATABASE {DB名};

dump.sqlを新しい環境に持っていく

$ scp ./dump.sql {...}:/home/ubuntu/

そしてdump.sqlを流し込む

$ psql -h {ホスト名} -U {ユーザー名} -d {DB名} --password -f ./dump.sql

このままだと、データの暗号化周りでエラーが出て使い物にならないので、まず/opt/redash/envREDASH_COOKIE_SECRETREDASH_SECRET_KEY を前環境で使っていた値に戻し、以下を実行

$ docker compose run --rm server manage database reencrypt {古いREDASH_SECRET_KEY} {新しいREDASH_SECRET_KEY}

これで再度REDASH_COOKIE_SECRETREDASH_SECRET_KEY を新しいものに差し替え、 docker compose up -d すると正常にアクセスが出来る

SSL化

redash公式から案内がある以下gistに従う
https://gist.github.com/arikfr/64c9ff8d2f2b703d4e44fe9e45a7730e

Googleログインを有効化

https://redash.io/help/user-guide/users/authentication-options#Google-Login-(OAuth)

まずGoogle cloudでプロジェクト作成します。

OAuth同意画面

次に画面のサイドバーから「OAuth同意画面」の設定をします
User Type は「内部」
同意画面はお好みで入力 (Googleログインの際に確認画面に出てくる情報です」
スコープは何も編集せず進む

認証情報の設定

「認証情報」→「認証情報を作成」→「OAuthクライアントID」

アプリケーションの種類: ウェブアプリケーション
名前: お好み (今回は redash にしました )
承認済みリダイレクトURI: https://{redashがホストされているホスト名}/oauth/google_callback

これでクライアントIDクライアントシークレット が有効になります

各情報をenvにセット

/opt/redash/env に以下を追記します

REDASH_GOOGLE_CLIENT_ID={クライアントID}
REDASH_GOOGLE_CLIENT_SECRET={クライアントシークレット}

再起動

$ docker compose down
$ docker compose up -d

Discussion