Dockerを利用せずにredashを構築する(ver 4.0.x)

# はじめに
Dockerを利用せずに構築したredashを再構築しないといけない場面に遭遇した。
すると、redashのバージョンが上がったことでDockerを利用しない構築手順がredashのドキュメントから消えてしまった。
redashの構築ではsetup用のスクリプトを利用することになるが、最新のsetupスクリプトではUbuntuの18.04から対応している。私の場合、Ubuntuの16.04で構築する必要があった。
redashのドキュメントはまだ整備されきれておらず、試行錯誤を経てredashの構築を行なった。
本記事はその際の構築手順をまとめたものである。

> 参考: redashドキュメント
> https://redash.io/help/

> 参考: redash setupスクリプトについて
> https://github.com/getredash/redash/tree/master/setup

# redashとは？
* OSSで提供されているダッシュボードツール
* RDBやBigQuery、Prestoといった様々なデータソースとの連携が可能。
* Active Directoryとの連携が可能で、LDAPによりシングルサインオンも実現可能。

> 参考: redashで連携可能なデータソース一覧
![スクリーンショット 2019-01-22 11.47.40.png](https://qiita-image-store.s3.amazonaws.com/0/338857/89b82d68-bb38-7278-b05a-a3f22cfd4230.png)

# 注意
* 本手順は2018年11月時点で正常に動作した手順である。
* 最新以外のバージョンを入れる手順は非公式であるため、急にできなくなってしまうことも考えられるので本手順は参考程度に見てもらえると良い。

# バージョン情報
* redash
    * 4.0.x
* OS
    * Ubuntu 16.04
* Python
    * 2.7.12

# 準備
redashを利用するにあたり、最低限必要となるもの(以下5つ)を事前にインストールする。

* Python(2.7)
* npm(3.10.10)
* Node.js(v6以上)
* PostgreSQL(9.3以上)
* Redis(2.8.3以上)

## Pythonインストール
virtualenvが推奨されているが、この時は普通に入れた。

* インストール

```
sudo apt-get install python-dev python-dev
```

* 確認

```
$ python -V
Python 2.7.12
$ pip -V
pip 8.1.1 from /usr/lib/python2.7/dist-packages (python 2.7)
```

## npmインストール
Node.jsインストールのためにnpmを利用するため、先にnpmをインストールする。
Ubuntu 16.04の公式リポジトリにあるnpmではバージョンが足りないため、意図的にバージョンを指定し、インストールする。

* インストール

```
sudo apt-get install -y build-essential
curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
sudo apt-get install -y nodejs
```

* 確認

```
$ npm --version
3.10.10

$ node --version
v6.14.4
```

## PostgreSQLインストール
* インストール

```
sudo sh -c "echo 'deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main' > /etc/apt/sources.list.d/pgdg.list"
wget --quiet -O - http://apt.postgresql.org/pub/repos/apt/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get update
sudo apt-get install postgresql
```

* 確認

```
$ which psql
/usr/bin/psql
$ ps aux | grep postgres | grep -v grep
postgres 14271  0.1  1.2 310900 26088 ?        S    16:42   0:00 /usr/lib/postgresql/11/bin/postgres -D /var/lib/postgresql/11/main -c config_file=/etc/postgresql/11/main/postgresql.conf
postgres 14273  0.0  0.1 310900  3932 ?        Ss   16:42   0:00 postgres: 11/main: checkpointer   
postgres 14274  0.0  0.1 310900  3932 ?        Ss   16:42   0:00 postgres: 11/main: background writer   
postgres 14275  0.0  0.4 310900  8952 ?        Ss   16:42   0:00 postgres: 11/main: walwriter   
postgres 14276  0.0  0.3 311328  6628 ?        Ss   16:42   0:00 postgres: 11/main: autovacuum launcher   
postgres 14277  0.0  0.1 165816  3424 ?        Ss   16:42   0:00 postgres: 11/main: stats collector   
postgres 14278  0.0  0.2 311192  4896 ?        Ss   16:42   0:00 postgres: 11/main: logical replication launcher 
```

## Redisインストール

Ubuntu 16.04の公式リポジトリにあるRedisでは古い(2.3.0.6-1)ので、新たにリポジトリを登録する

* リポジトリ登録

```
sudo add-apt-repository ppa:chris-lea/redis-server
sudo apt update
```

* リポジトリ確認

```
$ sudo apt show redis-server
Package: redis-server
Version: 5:4.0.11-1chl1~xenial1
Priority: optional
Section: database
Source: redis
Maintainer: Chris Lamb <lamby@debian.org>
Installed-Size: 162 kB
Depends: adduser, lsb-base (>= 3.2-14), redis-tools (= 5:4.0.11-1chl1~xenial1), init-system-helpers (>= 1.18~)
Download-Size: 90.9 kB
APT-Sources: http://ppa.launchpad.net/chris-lea/redis-server/ubuntu xenial/main amd64 Packages
Description: Persistent key-value database with network interface
 Redis is a key-value database in a similar vein to memcache but the dataset
 is non-volatile. Redis additionally provides native support for atomically
 manipulating and querying data structures such as lists and sets.
 .
 The dataset is stored entirely in memory and periodically flushed to disk.

N: There is 1 additional record. Please use the '-a' switch to see it
```

* インストール

```
sudo apt install redis-server
```

* インストール確認

```
$ redis-cli --version
redis-cli 5.0.0
$ redis-server --version
Redis server v=5.0.0 sha=00000000:0 malloc=jemalloc-5.1.0 bits=64 build=12e155be0a2852d9
```

* 起動

```
sudo systemctl start redis-server
```

* 起動確認

```
$ ps aux | grep redis
redis    16358  0.1  0.4  53328  8432 ?        Ssl  16:48   0:00 /usr/bin/redis-server 127.0.0.1:6379
ubuntu   16363  0.0  0.0  14192  1020 pts/0    S+   16:48   0:00 grep --color=auto redis
```

# redash構築
## インストール資材ダウンロード
最新版ではDocker以外での構築ができないため、1つ古いバージョンの資材をダウンロードする。

```
cd /usr/local/
sudo git clone -b release/4.0.x https://github.com/getredash/redash.git
```

* ダウンロード確認

```
$ cd /usr/local/redash
$ git branch
* release/4.0.x
```

## rdashセットアップ
* セットアップ前の準備
    * 今回の手順でダウンロードしたsetupスクリプトではかなり古いバージョンのredashがダウンロードされてしまうため、setupスクリプトを修正し、比較的新しいバージョンのものがダウンロードされるようにする。
    * スクリプトの上段にある`REDASH_BRANCH`と`REDASH_VERSION`を下記に変更する

```ConfigFile:./setup/ubuntu/bootstrap.sh
REDASH_BRANCH="${REDASH_BRANCH:-release/4.0.x}" # Default branch/version to master if not specified in REDASH_BRANCH env var
REDASH_VERSION=${REDASH_VERSION-4.0.1.b4038} # Install latest version if not specified in REDASH_VERSION env var
```

* setupスクリプト実行

```
sudo sh bootstrap.sh
```

## Pythonパッケージインストール

```
cd /opt/redash/current
sudo pip install -r requirements.txt -r requirements_dev.txt
```

## Node.jsパッケージインストール

```
cd /opt/redash/current
sudo npm install
```

## ビルド
* ビルドする前に一部コードに手を加える。

```
sudo vi /opt/redash/redash.4.0.1.b4038/client/app/pages/dashboards/dashboard-list.js
```

* 以下の行(最上段あたり)を

```
const TAGS_REGEX = /(^([\w\s]|[^\u0000-\u007F])+):|(#([\w-]|[^\u0000-\u007F])+)/ig;
```

* 以下のように変更する。

```
/* eslint-disable no-control-regex */
const TAGS_REGEX = /(^([\w\s]|[^\u0000-\u007F])+):|(#([\w-]|[^\u0000-\u007F])+)/ig;
/* eslint-enable no-control-regex */
```

* 上記対応後に下記コマンドでビルドする。

```
sudo npm run build
```

> 参考:
> no-control-regexについて
> https://code.i-harness.com/ja/docs/eslint/rules/no-control-regex
> redashのソースの一部に制御文字が含まれており、今回導入したnpmではno-control-regexがデフォルトで有効になってしまっているため、そのままビルドしようとするとエラーが起きてしまう。
> 本手順では制御文字を利用している部分にのみ一時的に制御文字を許可するようにソースを変更することで対応した。

## Postgreの設定
redashでは、ユーザの管理などにPostgreを利用している。今回の手順では、Postgreは別にインストールしているため、redashの設定でインストールしたPostgreを指定する必要がある。

* redashの設定ファイルを編集

```
sudo vi /opt/redash/.env
```

* 設定ファイル内に下記の設定値があるので、正しいものに変更する(ユーザ名、ホスト名、ポート番号等)

```
export REDASH_DATABASE_URL="postgresql://postgres:postgres@localhost:5432/postgres"
```

## データベースの作成
* データベースにpostgresユーザでログイン

```
sudo su postgres
psql -U postgres
```

* DBにログイン後、下記コマンドにてpostgresユーザのパスワードを変更

```
alter role postgres with password '新規パスワード';
```

* ログイン確認

```
psql postgresql://postgres:postgres@localhost:5432/postgres
```

* データベースの作成を行う

```
cd /opt/redash/current
bin/run ./manage.py database create_tables
```

# redash webサーバの起動
```
sudo supervisorctl start all
```

# Web UIの設定
* `http://[ホストIP]`にアクセスする。
* Adminユーザの作成を促されるため、作成する。作成後、通常利用が可能となる。

# 最後に
今回の手順はDockerを利用せずにredashをインストールする手順でしたが、公式ではDockerのインストールを推奨しているため、特別な事情がない限りはDockerを利用した方が良いと思います。
ただし、今回の私のように同じバージョンを入れなくてはならないような場合に本手順が参考になれば幸いです。