Docker上で稼働しているRedashのデータ永続化

* redash環境作ってみんなクエリがしがし作ってるけどyml変えて再起動したらこれ消えちゃうんだよね？？
* なんとかしなきゃ(；・∀・)


## はじめに
* redashは作成済み
* OS・コンテナ再起動してもRedashデータを消さないようにする
* ホストOS上に外部ボリュームを作成
* そこにコンテナ内PostGreSQL上Redashのデータを保存

## 外部ボリューム作成

* 外部ボリュームは任意です

```
$ df -h /data-001
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvdb        99G   63M   94G   1% /data-001
$ ls -ld /data-001/postgresql/data
drwxr-xr-x 2 appuser appuser 4096 Nov 12 17:18 /data-001/postgresql/data
```

## Redashデータをバックアップ

* データは一回消えてしまうのでバックアップしておく

```
$ cid=`docker ps | grep redash_postgres | awk '{print $1}'`
$ echo $cid
2820a2a88c79
$ docker exec ${cid} /bin/bash -c 'pg_dump -U postgres postgres | gzip > /usr/local/redash_backup.gz'
$ docker cp ${cid}:/usr/local/redash_backup.gz /data-001/postgresql/backup/redash_backup.gz
$ ls -lh /data-001/postgresql/backup/redash_backup.gz
-rw-r--r-- 1 appuser appuser 2.3M Nov 12 19:16 /data-001/postgresql/backup/redash_backup.gz
```
## コンテナを停止

```
$ docker-compose -f /home/appuser/redash/docker-compose.production.yml stop
Stopping redash_nginx_1_7686013e7f9a    ... done
Stopping redash_server_1_a3232ad33d74   ... done
Stopping redash_worker_1_e14a3e086a48   ... done
Stopping redash_postgres_1_a55528becf36 ... done
Stopping redash_redis_1_f04f2922999d    ... done
```

## ホスト側にマウントするDockerの設定を適用

```
$ vi /home/appuser/redash/docker-compose.production.yml
：
   - /data-001/postgresql/data:/var/lib/postgresql/data　※コメント外す
：
```

## コンテナを起動

```
$ docker ps
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                    NAMES
47cb94bac0cf        postgres:9.5.6-alpine   "docker-entrypoint.s…"   47 seconds ago      Up 42 seconds       0.0.0.0:5432->5432/tcp   jolly_kowalevski
$ docker inspect 47cb94bac0cf
$ docker run -d -v /data-001/postgresql/data:/var/lib/postgresql/data -p 5432:5432 postgres:9.5.6-alpine
47cb94bac0cfec2774cb0d469c7a1f4f3ec35f67d22834aa41aed2c6d1f0e515
```


## IPとコンテナIDを確定

```
$ cid=`docker ps | grep postgres | awk '{print $1}'`

$ dbip=`docker inspect ${cid} | jq .[].NetworkSettings.IPAddress`
$ echo $dbip
"172.17.0.2"
$ cid=`docker ps | grep postgres | awk '{print $1}'`
$ echo ${cid}
47cb94bac0cf
```

## データベース再作成

```
$ psql -h ${dbip} -U postgres template1
psql (9.2.24, server 9.5.6)
WARNING: psql version 9.2, server version 9.5.
         Some psql features might not work.
Type "help" for help.

template1=# DROP DATABASE IF EXISTS postgres;
DROP DATABASE
template1=# CREATE DATABASE postgres;
CREATE DATABASE
template1=# \q
```

## PostgresSQLコンテナ単体起動とデータリストア

```
$ docker cp /data-001/postgresql/backup/redash_backup.gz ${cid}:/usr/local/redash_backup.gz
$ docker exec -t ${cid} /bin/bash -c 'zcat /usr/local/redash_backup.gz | psql -U postgres -d postgres'
```

## コンテナ起動

```
$ docker-compose -f /home/appuser/redash/docker-compose.production.yml up -d
Starting redash_worker_1_e14a3e086a48 ...
Starting redash_redis_1_f04f2922999d  ...
Recreating redash_postgres_1_a55528becf36 ...
Starting redash_worker_1_e14a3e086a48     ... done
Starting redash_redis_1_f04f2922999d      ... done
Recreating redash_postgres_1_a55528becf36 ... done
Recreating redash_server_1_a3232ad33d74   ... done
Recreating redash_nginx_1_7686013e7f9a    ... done
```

## 起動とデータの確認

```
$ docker ps
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                              NAMES
df0214b8cdd6        redash/nginx:latest     "nginx -g 'daemon of…"   7 minutes ago       Up 7 minutes        0.0.0.0:80->80/tcp, 443/tcp        redash_nginx_1_7686013e7f9a
18515915aa2a        redash/redash:latest    "/app/bin/docker-ent…"   7 minutes ago       Up 7 minutes        5000/tcp, 0.0.0.0:5500->5500/tcp   redash_server_1_a3232ad33d74
009bf31f6fda        postgres:9.5.6-alpine   "docker-entrypoint.s…"   7 minutes ago       Up 7 minutes        5432/tcp                           redash_postgres_1_a55528becf36
47cb94bac0cf        postgres:9.5.6-alpine   "docker-entrypoint.s…"   16 minutes ago      Up 16 minutes       0.0.0.0:5432->5432/tcp             jolly_kowalevski
01ed0be50163        redash/redash:latest    "/app/bin/docker-ent…"   3 days ago          Up 7 minutes        5000/tcp                           redash_worker_1_e14a3e086a48
5deeac830d77        redis:3.0-alpine        "docker-entrypoint.s…"   3 days ago          Up 7 minutes        6379/tcp                           redash_redis_1_f04f2922999d

$ sudo ls -l /data-001/postgresql/data/

total 120
drwx------ 5 70 70  4096 Nov 12 19:26 base
drwx------ 2 70 70  4096 Nov 12 19:30 global
drwx------ 2 70 70  4096 Nov 12 19:20 pg_clog
drwx------ 2 70 70  4096 Nov 12 19:20 pg_commit_ts
drwx------ 2 70 70  4096 Nov 12 19:20 pg_dynshmem
-rw------- 1 70 70  4492 Nov 12 19:20 pg_hba.conf
-rw------- 1 70 70  1636 Nov 12 19:20 pg_ident.conf
drwx------ 4 70 70  4096 Nov 12 19:20 pg_logical
drwx------ 4 70 70  4096 Nov 12 19:20 pg_multixact
drwx------ 2 70 70  4096 Nov 12 19:20 pg_notify
drwx------ 2 70 70  4096 Nov 12 19:20 pg_replslot
drwx------ 2 70 70  4096 Nov 12 19:20 pg_serial
drwx------ 2 70 70  4096 Nov 12 19:20 pg_snapshots
drwx------ 2 70 70  4096 Nov 12 19:20 pg_stat
drwx------ 2 70 70  4096 Nov 12 19:36 pg_stat_tmp
drwx------ 2 70 70  4096 Nov 12 19:20 pg_subtrans
drwx------ 2 70 70  4096 Nov 12 19:20 pg_tblspc
drwx------ 2 70 70  4096 Nov 12 19:20 pg_twophase
-rw------- 1 70 70     4 Nov 12 19:20 PG_VERSION
drwx------ 3 70 70  4096 Nov 12 19:20 pg_xlog
-rw------- 1 70 70    88 Nov 12 19:20 postgresql.auto.conf
-rw------- 1 70 70 21218 Nov 12 19:20 postgresql.conf
-rw------- 1 70 70    24 Nov 12 19:20 postmaster.opts
-rw------- 1 70 70    85 Nov 12 19:20 postmaster.pid
```

## あとがき

* Redashをメンバーに開放する前に設定しておいたほうが良いですね。みんなが喜んでクエリ作り始めてからやると消しちゃうかもしれないので余計なプレッシャーを感じることになる(；・∀・)

## 参考にしたサイト

http://kuchitama.hateblo.jp/entry/redash_on_docker_backup