WSL2 UbuntuにRe:dashの環境構築してみる

## はじめに
船井総研デジタルのoswです。`Re:dash`というものを業務で初めて知り、便利だったのでローカルに構築してみました。

## 学習環境
- Win 11 Home / 22H2
- WSL2 / Ubuntu 22.04.3 LTS
- Docker Desktop 4.23.0

## この記事のゴール
下記をゴールとします。
- dockerコンテナでRe:dash環境を構築
- サンプルDB（MySQL）を作成し、Winのブラウザ経由でDBの内容を閲覧出来るようにする

## Re:dashとは
Re:dashはOSSでデータソースを登録することで、それらのデータをブラウザベースで閲覧することが出来るようになります。

一部ですが登録出来るデータソースには下記のようなものがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820803/5d2da573-0ee0-e54a-ea00-6e772434b442.png)

## 環境構築
### データソースの作成
まずはRe:dashで参照するデータソースを作成します。今回はMySQLでサンプルDBを作成し、それを閲覧できるようにします。

下記構成でデータソースを作成することにします。

```
MySQL
├── DB
│   └── sample.sql
├── Dockerfile
├── compose.yml
└── my.cnf
```

```sql:DB/sample.sql
CREATE DATABASE redash;

CREATE TABLE redash.test (
    id INT NOT NULL AUTO_INCREMENT,
    name CHAR(30) NOT NULL,
    PRIMARY KEY (id)
);

INSERT INTO
    redash.test (name)
VALUES
    ("user01"),
    ("user02"),
    ("user03"),
    ("user04"),
    ("user05"),
    ("user06"),
    ("user07"),
    ("user08"),
    ("user09"),
    ("user10");
```

```dockerfile:Dockerfile
FROM mysql
EXPOSE 3306
ADD ./my.cnf /etc/mysql/conf.d/my.cnf
CMD ["mysqld"]
```

```yaml:compose.yml
services:
    mysql:
        container_name: redash-mysql
        build: .
        image: redash-mysql
        command: --default-authentication-plugin=mysql_native_password
        volumes:
            - ./DB:/docker-entrypoint-initdb.d
        environment:
            - MYSQL_ROOT_PASSWORD=root
        networks:
            - redash
networks:
    redash:
        # Re:dash公式リポジトリで利用するネットワークを参照。MySQLコンテナと通信可能にする
        external: true
        name: redash_default
```

```sql:my.cnf
[mysqld]
character-set-server=utf8

[mysql]
default-character-set=utf8

[client]
default-character-set=utf8
```

### Re:dashの入手
Re:dashはAWS EC2のインスタンスとしても提供されているようですが、今回はgithubの公式リポジトリを利用しローカルにコンテナを作成します。

そこで下記でクローンします。
```bash
$ git clone https://github.com/getredash/redash.git
```

次にクローンした`redash`ディレクトリ直下に次のファイルを作成します。
```sql:.env
REDASH_SECRET_KEY=redash
REDASH_COOKIE_SECRET=redash
GOOGLE_CLIENT_ID=redash
```

### Re:dashコンテナの起動
```bash
$ cd redash
$ docker compose up -d
$ docker compose run --rm server create_db
```

upにそれなりに時間が掛かりますが、ひとまず下記でRe:dashにアクセス出来るようになります。

- http://localhost:5001

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820803/99cf5d46-7666-1db7-d8aa-996d73ff3122.png)


### Re:dashの環境設定
#### UIを整える
視認性が悪いのでUIを整えます。下記コマンド実行時、要求するnodeのバージョンと異なっているとエラーが出る場合は条件に合うバージョンを選定してください。

かなり時間がかかりますが、これでUIの視認性が良くなります。

```bash
$ yarn --frozen-lockfile
$ yarn build

# 参照するデータソース(MySQL)のコンテナを起動。MySQLディレクトリ直下で実行
$ docker compose up -d
```

念のため普段自分が使ってるアドレスを設定し、adminユーザを作成してログインします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820803/d26cac57-2594-6ac2-1089-4a4cec139f3e.png)

#### データソースの設定
ログイン後、画面左下にある`Settings` -> `+New Data Source` -> `mysql`と入力し選択可能なデータソースから`MySQL`を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820803/831b50da-5add-2938-2969-3e0d552b1ef9.png)

続いて下記のように設定します。今回はあくまでテスト環境なのでrootでそのままアクセスしています。
|     項目      |       詳細       |
| :-----------: | :--------------: |
|     Name      |     SampleDB     |
|     Host      |      mysql       |
|     Port      |      未入力      |
|     User      |       root       |
|   Password    |       root       |
| Database Name |      redash      |
|  それより下   | すべてデフォルト |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820803/c073bab0-dd6b-c97d-09e5-7e74576d6345.png)

設定を保存し、「Test Connection」で`Success`となれば設定完了です。

#### クエリの作成
DBに接続できるようになったので、Re:dashで閲覧するために必要となるクエリを作成します。

`サイドメニュー` -> `Create` -> `New Query`を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820803/12559c66-67e5-6a1a-fb40-19ad20c5a652.png)

今回は単純に次のように作成しています。

- クエリ名
    - Test Query
- クエリ詳細
    - `SELECT * FROM redash.test;`

デフォルトでDBが選択されている状態なので、クエリをそのまま入力するだけで問題ありません。右下の`Execute`で実行して確認することもできます。

問題ないことを確認したら`Save`で保存、右上の`Publish`を押下します。（`Publish`しておかないとダッシュボードで作成したクエリが参照できません）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820803/4a63d668-ca52-af0f-40f4-acb0b4ba3ebe.png)

### ダッシュボードの作成
`サイドメニュー` -> `Create` -> `New Dashborad`を選択、任意の名前を入力します。

ダッシュボードの編集画面に遷移後、右下の`Add Widget` -> `先程作成したクエリ`を選択 -> `Add to Dashboard` -> `Done Editing`を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820803/415465f7-2d49-c8d8-cd21-9b7f55367bfd.png)

これでダッシュボードを開くと作成した各クエリが実行され、すぐに確認出来るようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820803/88d6df5c-21ab-d4cf-fa93-1878f143dd66.png)

## おわりに
あくまでテスト環境なのでそのまま本番用に使う訳にはいきませんが、構築しておくと開発する際に非常に便利だと思います。触って色々試してみようと思います。