Redashのローカル環境構築手順

# 最初に

様々なデータソースと接続ができ、簡単にダッシュボードが構築できる [Redash](https://redash.io/) を、ローカルでdocker-composeを利用して簡単に構築する手順です。

# 環境

* Windows10

# 前提

[公式ドキュメント](https://redash.io/help/open-source/dev-guide/docker)? に従うと [redash](https://github.com/getredash/redash) リポジトリをgit cloneし、用意されているdocker-composeを利用する手順が記載されていますが、こちらはRedashそのものの開発者のを対象したものになります。

開発者用の docker-compose.yml を利用すると、Redash自体のコンテナイメージをビルドするため、npm installやpip installなどが発生して、かなりビルド時間がかかるためオススメはしません。

単純にローカルでRedashを利用したいだけの人は、このリポジトリを利用します。
https://github.com/getredash/setup

今回は、こちらのリポジトリを利用します。


# 構築手順

まずはリポジトリをgit cloneします。

```sh:git_clone
git clone https://github.com/getredash/setup
cd setup
```

そのまま、 `setup.sh` を実行すればOK...と言いたいところですが、この `setup.sh` は `Ubuntu 18.04` 前提です。すこしsetup.sh を修正します。WSLでUbuntuのBashが使える前提で、 `C:\opt\redash` をインストールフォルダにします。そのため、 `REDASH_BASE_PATH=/mnt/c/opt/redash` と書き換え、フォルダ作成も自分でやってしまいます。

<details><summary>修正した setup.sh</summary><div>

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

REDASH_BASE_PATH=/mnt/c/opt/redash

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
    GIT_BRANCH="${REDASH_BRANCH:-master}" # Default branch/version to master if not specified in REDASH_BRANCH env var
    wget https://raw.githubusercontent.com/getredash/setup/${GIT_BRANCH}/data/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=/opt/redash/docker-compose.yml" >> ~/.profile
    export COMPOSE_PROJECT_NAME=redash
    export COMPOSE_FILE=/opt/redash/docker-compose.yml
    sudo docker-compose run --rm server create_db
    sudo docker-compose up -d
}

#create_directories
#create_config
setup_compose
```
</div></details>

続いて、手動でフォルダを作成します。

```sh
mkdir C:\opt\redash
```

このまま、WSL Bashでsetup.shを実行します。

```sh:setupの実行
sh setup.sh
```
そうすると、`C:\opt\redash` 配下に `docker-compose-yml` および `env` ファイルが作成されていると思います。

そこでそのままdocker-composeで動くような気がしましたが、どうもPostgreSQLのVolumeマウントが上手く行かないので `docker-compose.yml` を修正します。

<details><summary>修正したdocker-compose.yml</summary><div>

```yml:docker-compose.yml
version: "2"
x-redash-service: &redash-service
  image: redash/redash:8.0.0.b32245
  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.6-alpine
    env_file: /opt/redash/env
    volumes:
      - pg-data:/var/lib/postgresql/data  # 修正
    restart: always
  nginx:
    image: redash/nginx:latest
    ports:
      - "80:80"
    depends_on:
      - server
    links:
      - server:redash
    restart: always
volumes:                                  # 修正
  pg-data:                                # 修正
    external: true                        # 修正
```
</div></details>

上記のように修正するとやっとおしまいです。
あとは、以下のようにdockerコマンドで volumne を作成し、 PostgreSQLにスキーマを作成し、起動するだけです。

```sh
> docker volume create --name pg-data
> docker-compose run --rm server create_db
> docker-compose up -d
```

ブラウザで `http://localhost:5000/` にアクセスすればRedashの初期画面が表示されます。
お疲れさまでした！

# まとめ

* Redashはdocker-composeで簡単に起動できる、と思ったんですがちょっと調整が必要
* PostgreSQLのVolumne Mount、Windowsだと上手くいかない時がある
* ローカルで動くと安心しますね。ローカルより、AWSだとAMIが存在するのでむしろ構築が早い気もしますが、手元でまず検証したい人にオススメします