BIツール Redash v7をdockerでセットアップ

Redashの最新バージョン7がリリースされ、
久々に見たら結構セットアップ方法が変わっているので
dockerベースのセットアップメモ

https://github.com/getredash/redash

古いバージョンのセットアップメモについてはこちら
https://qiita.com/suzukihi724/items/91950450734e4c9913cf

#前提
・AWS EC2上で構築
・dockerベース
・OS：Ubuntu 18.04

#セットアップ手順

・AWS Marketplaceにセットアップ済みのAMIが提供されているが、最新版を入れたいので、githubからDLして自分でセットアップします。

##1) EC2に最低限必要なツールをセットアップ

とりあえずgitがあれば良い。
docker、docker-composeは後述のsetupスクリプトでインストール可能。

```
sudo apt-get install -y git
```

##2) Git Hubからredash一式をgit clone

```
git clone https://github.com/getredash/redash.git
```
結構構成が変更されています。
従来は「docker-compose.production.yml」がありましたがなくなり、
それ相当のものは redash/setup/docker-compose.yml が該当。
※redashフォルダ直下のものはdev用です。

#3) インストール
Redashのホームディレクトリを作成

```
sudo mkdir -p /opt/redash/
```

最新版では、下記のようなセットアップスクリプトが提供され、上記をベースに構築します。

```bash

#!/usr/bin/env bash
# This script setups dockerized Redash on Ubuntu 18.04.
set -eu

REDASH_BASE_PATH=/opt/redash

install_docker(){
    # Install Docker
    sudo apt-get update
    sudo apt-get -yy install apt-transport-https ca-certificates curl software-properties-common wget pwgen
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
    sudo apt-get update && sudo apt-get -y install docker-ce

    # Install Docker Compose
    sudo curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
    sudo chmod +x /usr/local/bin/docker-compose

    # Allow current user to run Docker commands
    sudo usermod -aG docker $USER
}

create_directories() {
    if [[ ! -e $REDASH_BASE_PATH ]]; then
        sudo mkdir -p $REDASH_BASE_PATH
        sudo chown $USER:$USER $REDASH_BASE_PATH
    fi

    if [[ ! -e $REDASH_BASE_PATH/postgres-data ]]; then
        mkdir $REDASH_BASE_PATH/postgres-data
    fi
}

create_config() {
    if [[ -e $REDASH_BASE_PATH/env ]]; then
        rm $REDASH_BASE_PATH/env
        touch $REDASH_BASE_PATH/env
    fi

    COOKIE_SECRET=$(pwgen -1s 32)
    SECRET_KEY=$(pwgen -1s 32)
    POSTGRES_PASSWORD=$(pwgen -1s 32)
    REDASH_DATABASE_URL="postgresql://postgres:${POSTGRES_PASSWORD}@postgres/postgres"

    echo "PYTHONUNBUFFERED=0" >> $REDASH_BASE_PATH/env
    echo "REDASH_LOG_LEVEL=INFO" >> $REDASH_BASE_PATH/env
    echo "REDASH_REDIS_URL=redis://redis:6379/0" >> $REDASH_BASE_PATH/env
    echo "POSTGRES_PASSWORD=$POSTGRES_PASSWORD" >> $REDASH_BASE_PATH/env
    echo "REDASH_COOKIE_SECRET=$COOKIE_SECRET" >> $REDASH_BASE_PATH/env
    echo "REDASH_SECRET_KEY=$SECRET_KEY" >> $REDASH_BASE_PATH/env
    echo "REDASH_DATABASE_URL=$REDASH_DATABASE_URL" >> $REDASH_BASE_PATH/env
}

setup_compose() {
    REQUESTED_CHANNEL=stable
    LATEST_VERSION=`curl -s "https://version.redash.io/api/releases?channel=$REQUESTED_CHANNEL"  | json_pp  | grep "docker_image" | head -n 1 | awk 'BEGIN{FS=":"}{print $3}' | awk 'BEGIN{FS="\""}{print $1}'`

    cd $REDASH_BASE_PATH
    REDASH_BRANCH="${REDASH_BRANCH:-master}" # Default branch/version to master if not specified in REDASH_BRANCH env var
    wget https://raw.githubusercontent.com/getredash/redash/${REDASH_BRANCH}/setup/docker-compose.yml
    sed -ri "s/image: redash\/redash:([A-Za-z0-9.-]*)/image: redash\/redash:$LATEST_VERSION/" docker-compose.yml
    echo "export COMPOSE_PROJECT_NAME=redash" >> ~/.profile
    echo "export COMPOSE_FILE=$REDASH_BASE_PATH/docker-compose.yml" >> ~/.profile
    export COMPOSE_PROJECT_NAME=redash
    export COMPOSE_FILE=$REDASH_BASE_PATH/docker-compose.yml
    sudo docker-compose run --rm server create_db
    sudo docker-compose up -d
}
```

インストール（セットアップ）は上記内容のsetup.shスクリプトを実行するのみ

```bash
sh redash/setup/setup.sh
```

この中で実行されるdocker-compose.ymlは以下

メインのredash serverのほか、scheduler、scheduled_worker、adhoc_workerと言うコンポーネントで構成されている。
その他キャッシュDBにredis、通常DBにPostgres、フロントにnginx。

Postgresのデータはデフォルトでホストの`/opt/redash/postgres-data`にマウントされ永続化されている。



```bash
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
```
うまくいけば各コンテナが起動する

```
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                                      NAMES
XXXXXXXXXX        nginx:latest                 "nginx -g 'daemon of…"   6 hours ago         Up 3 hours          0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   redash_nginx_1
XXXXXXXXXX        redash/redash:7.0.0.b18042   "/app/bin/docker-ent…"   6 hours ago         Up 3 hours          5000/tcp                                   redash_scheduler_1
XXXXXXXXXX        redash/redash:7.0.0.b18042   "/app/bin/docker-ent…"   6 hours ago         Up 3 hours          5000/tcp                                   redash_scheduled_worker_1
XXXXXXXXXX        redash/redash:7.0.0.b18042   "/app/bin/docker-ent…"   6 hours ago         Up 3 hours          5000/tcp                                   redash_adhoc_worker_1
XXXXXXXXXX        redash/redash:7.0.0.b18042   "/app/bin/docker-ent…"   6 hours ago         Up 3 hours          0.0.0.0:5000->5000/tcp                     redash_server_1
XXXXXXXXXX        postgres:9.5-alpine          "docker-entrypoint.s…"   6 hours ago         Up 3 hours          5432/tcp                                   redash_postgres_1
XXXXXXXXXX        redis:5.0-alpine             "docker-entrypoint.s…"   6 hours ago         Up 3 hours          6379/tcp                                   redash_redis_1

```

#4) アクセス

ホストサーバのIPにアクセスすれば利用可能
初回のみAdminユーザ設定画面となる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112537/afa6c3df-f291-fe94-98c1-3f8de66c75fa.png)

#5) SSL設定

デフォルトでは80 portのHTTPですが、nginxの設定でSSL化も可能。
手順は下記。
https://gist.github.com/arikfr/64c9ff8d2f2b703d4e44fe9e45a7730e

独自の証明書を利用する場合は、
`/opt/redash/nginx/nginx.conf`
の下記の要素を変更し、格納したcrt、keyファイルのパスに合わせる

・ssl_certificate
・ssl_certificate_key 

※その他、「server_name」も自身のドメインに変更

### httpsがhttpにリダイレクトされてしまう場合

nginxプロキシが、redashアプリ側に適切なプロトコルを通知できてないらしい。下記で解消。

nginx.conf 61Lの

`proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;`

を

`proxy_set_header X-Forwarded-Proto $scheme;`

に変更する

参考：
https://github.com/getredash/redash/issues/4048

#6) sqliteファイルの読み込み

DBインポートでsqliteをサポートしているが、docker実装の場合、sqliteファイルの格納先をマウントする必要がある。

具体的には、docker-composeファイルのredash server、scheduled_worker、adhoc_workerの各要素にて、volumeタグでホスト上の格納場所とdocker内のpathを対応づける必要あり。