re:dash サーバーに Growiを同居させてみた

# /wiki-biサーバーの構築

# redash + growi on ubuntu

## ubuntuサーバーのインストール
2019年7月現在、growiがubuntu16.04推奨とのことだったので、ver 16.04をセットアップしました

aws上で、Ubuntu Server 16.04のインスタンスを起動した上で、ルートにてsshh接続  

クライアントのコンソールから
` ssh ubuntu@{{サーバーipアドレス}}  -i {{暗号化接続キー}} `  

ルートユーザーで接続後に、  

```
sudo apt update  
sudo apt upgrade  
sudo /sbin/shutdown -r now  
```

と、サーバーを更新し、再起動をしました。  

その後作業ユーザーを追加し、(例 wokingusr), sudo 権限をつけました  

```
sudo adduser workingusr

sudo gpasswd -a workingusr

visudo 
```  

※ visudoについてはこちらを参照しました  
https://eng-entrance.com/linux-command-visudo  

## re:dashのセットアップ
参考：https://qiita.com/p1nk5p1der/items/bd95a40a232976a4d8dd   

ubuntuサーバー構築後、ディレクトリ /opt/redash を作成し、そこに redashのgithubからsetup.shをダウンロード  

` curl -OL https://raw.githubusercontent.com/getredash/redash/master/setup/setup.sh `

メールサーバーはmaillgunを使っていたのでそちらを接続  

### redash の設定を確認

```
cd /opt/redash
cat docker-compose.yml
```

* server
* scheduler
* scheduled_worker
* adhoc_worker
* redis
* postgres
* nginx


### postgres
* 設定ファイル：/opt/redash/env
* データファイル：/opt/redash/postgres-data
* $REDASH_DATABASE_URL $POSTGRES_PASSWORD

### nginx
* 設定ファイル：/opt/redash/default.conf

### redash設定ファイル
*  設定ファイル： /opt/redash/env

## growiのセットアップ
この状態だと、nginxも含めて全てredashのdocker-compose.ymlで定義されたdocker内にいるわけで、そこにgorowi関係で必要なものも追加すればいいのかもしれないですが、今回はgrowi自体はhost内に直接セットアップして、redashのdocker-composeで定義されているnginxからアクセスさせることを試して見ました  

### 1. docker内のnginxの設定ファイルを上書きする

docker内のnginx設定を確認する  

servernameの確認  

`docker ps`  

redash_nginx_1である事が分かったので 起動中のコンテナのbashにアクセス  

`docer exec -it redash_nginx_1 bash`  

nginx.confの場所を確認  

`find / -name 'nginx.conf`  

/etc/nginx/nginx.conf だと言うことが分かったとしたら、その設定を確認し、  
サーバーの設定はどこにあるか見ます  

` cat /etc/nginx/nginx.conf`  

結果、   
  
> include /etc/nginx/conf.d/*/conf  

ということが分かりました。

` ls /etc/nginx/conf.d `  
で、redashサービスの設定は /etc/nginx/conf.d/default.conf に存在すると言うことが分かりました

この作業はホストの方から  

` docker cp redash_nginx_1:/etc/nginx/conf.d/default.conf ./redash.conf_bk`

で、growiの設定を上書きすべきnginx設定ファイルが手に入ったので、それを ./opt/redash/default.confにおいたとすると、docker-compose.yml のnginxの記述に次の2行を追加することで、設定が上書きできます。

```
    volumes:
      - /opt/redash/default.conf:/etc/nginx/conf.d/default.conf

```

変更前

```
  nginx:
    image: redash/nginx:latest
    ports:
      - "80:80"
    depends_on:
      - server
    links:
      - server:redash
    restart: always

```

変更後

```
  nginx:
    image: redash/nginx:latest
    ports:
      - "80:80"
    depends_on:
      - server
    volumes:
      - /opt/redash/default.conf:/etc/nginx/conf.d/default.conf
    links:
      - server:redash
    restart: always

```
まずはこの状態で、re:dashにアクセス出来るか確認します。  

## growiのセットアップ
growiを動作させるためには、nginxの他に
* node.js, npm
* elasticsearch
* mongodb
* (yarn, systemd)　
が必要なので、以下の手順でセットアップします。
Dockerでも提供されているのですが、ここではmonbodbのバックアップとかの関係でサーバーに直接セットアップをしていきます


https://docs.growi.org/guide/getting-started/ubuntu-server.html#growi

## nginx ファイルの上書き

```
upstream redash {
  server redash:5000;
}

server {
  listen   80 default;
  server_name bi.skill-connect.com

  gzip on;
  gzip_types *;
  gzip_proxied any;

  location / {
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;

    proxy_pass       http://redash;
  }
}

upstream growi {
    server 172.31.35.64:3000;
}

server {
    listen 80;
    server_name wiki.skill-connect.com;
    proxy_redirect                          off;
    proxy_set_header Host                   $host;
    proxy_set_header X-Real-IP              $remote_addr;
    proxy_set_header X-Forwarded-Host       $host;
    proxy_set_header X-Forwarded-Server     $host;
    proxy_set_header X-Forwarded-For        $proxy_add_x_forwarded_for;

    location / {
        proxy_pass http://growi/;
    }
}
```

## Growi S3 アクセス権限設定

S3バケットのアクセス権限 > パケットポリシー

```
{
    "Version": "2012-10-17",
    "Id": "S3PolicyId1",
    "Statement": [
        {
            "Sid": "IPAllow",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::jobrainbow-growi/*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": "[public ip of EC2 instance]/32"
                }
            }
        }
    ]
}
```

## 各種サービス再起動

### redash

```
cd /opt/redash
docker-compose up -d
```

### redash 接続

`docker-compose exec server bash`


## 主要データバックアップ

### バックアップ方針

Growi, redash の固有データベースのバックアップをs3にアップする

### 0. 準備

AWS CLIの導入

* growiでインストールして、アクセスキーを導入済み
### 1. Growi

```
#!/bin/bash

# 変数
TODAY=`date +"%Y%m%d"`
BACKUP_PATH=/home/*****/backup

# Backup
#### db-data
mkdir ${BACKUP_PATH}/${TODAY}
mongodump -d growi -o ${BACKUP_PATH}/${TODAY}
tar cfvz ${BACKUP_PATH}/mongo-${TODAY}.tar.gz ${BACKUP_PATH}/${TODAY}
rm -r ${BACKUP_PATH}/${TODAY}
aws s3 cp ${BACKUP_PATH}/mongo-${TODAY}.tar.gz s3://******-backup/growi/

# 中身の確認
# tar -zxvf ${BACKUP_PATH}/mongo-${TODAY}.tar.gz
~                                                  
```

### 2. redash


redash-backup.sh こちらはコンテナの中におくバックアップスクリプト

```
pg_dump -U postgres postgres | gzip > /var/backup/$1
```

bi-backup dockerのホスト側からの呼び出すバックアップスクリプト
docker-compose execにファイル出力を呼び出しても上手く動かなかった・・

```
TODAY=`date +"%Y%m%d"`
FLNM=back_$TODAY.gz

docker-compose exec postgres bash /var/backup/bi-backup.sh ${FLNM}
aws s3 cp ${BACKUP_PATH}${FLNM} s3://******-backup/redash/

```