docker-composeを使ってnginxとmattermostをたてる

# 状況
- ローカルにたてているmattermostをAWSに移行したい
- 移行先のAWSではポートが自由にあけられない(tsurai)ため、nginxでリバースプロキシをたてる必要がある
- 1つのサーバー上に様々なアプリケーションを動かす可能性があるためdockerを使いたい

# 環境
AWSのEC2上
OS: CentOS7.5

## 構成

作りたいシステムの構成は以下のとおりです
![構成.png](https://qiita-image-store.s3.amazonaws.com/0/210944/aa2cdec0-3442-8bbf-b43b-750defba259b.png)

そして最終ディレクトリ構成は以下のようになります。

```
├── dev-nginx
│   ├── Dockerfile
│   └── nginx.conf
└── docker-compose.yml
```

## docker-composeの設定

複数dockerコンテナを立てるのであればdocker-composeが便利だよ、という記事を見たので今回はdocker-composeを使っていきます。
docker-composeの細かい説明は[ドキュメント](http://docs.docker.jp/compose/toc.html)を参考にしてください。

### docker-composeのインストール

```
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
```

上記でインストール完了。
インストールされていることを確認します。

```
$ docker-compose --version
docker-compose version 1.23.2, build 1110ad01
```

### 簡単なdocker-compose.ymlで構成をつくる

まずは簡単なdocker-compose.ymlでうまくdocker-composeが動くことを確認します。

```docker-compose.yml
---
proxy:
    image: nginx
    links:
        - mattermost:mattermost
    ports:
        - "80:80"
mattermost:
    image: mattermost/mattermost-preview
    ports:
        - "8065:8065"
```

そして起動

```
$ docker-compose up -d
Creating works_mattermost_1 ... done
Creating works_proxy_1      ... done
```

`<IP>:8080`にアクセスするとWelcome to nginx!と挨拶される。
お気づきだと思いますが、nginxの設定ファイルをいじっていないのでmattermostにはアクセスできません。
doneって言ってるしきっとmattermostも起動しているはず･･･感じるぜ･･･mattermostの力をよぉ:relieved:

一旦消す:raised_hand:

```
$ docker-compose stop
Stopping works_proxy_1      ... done
Stopping works_mattermost_1 ... done
$ docker-compose rm
Going to remove works_proxy_1, works_mattermost_1
Are you sure? [yN] y
Removing works_proxy_1      ... done
Removing works_mattermost_1 ... done
```


## nginxの設定

つづいてnginxの設定をしていきます。
mattermostの[ドキュメント](https://docs.mattermost.com/install/config-proxy-nginx.html)を参考にnginx.confを作成します

```nginx.conf
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mattermost_cache:10m max_size=3g inactive=120m use_temp_path=off;

    # include /etc/nginx/conf.d/devnginx.conf;
    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;
        #access_log  /var/log/nginx/host.access.log  main;

        location ~ /api/v[0-9]+/(users/)?websocket$ {
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            client_max_body_size 50M;
            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 $scheme;
            proxy_set_header X-Frame-Options SAMEORIGIN;
            proxy_buffers 256 16k;
            proxy_buffer_size 16k;
            client_body_timeout 60;
            send_timeout 300;
            lingering_timeout 5;
            proxy_connect_timeout 90;
            proxy_send_timeout 300;
            proxy_read_timeout 90s;
            proxy_pass http://mattermost:8065;
        }
        location / {
            client_max_body_size 50M;
            proxy_set_header Connection "";
            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 $scheme;
            proxy_set_header X-Frame-Options SAMEORIGIN;
            proxy_buffers 256 16k;
            proxy_buffer_size 16k;
            proxy_read_timeout 600s;
            proxy_cache mattermost_cache;
            proxy_cache_revalidate on;
            proxy_cache_min_uses 2;
            proxy_cache_use_stale timeout;
            proxy_cache_lock on;
            proxy_http_version 1.1;
            proxy_pass http://mattermost:8065;
        }


        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }

    }
}
```

先ほどdocker-composeで立ち上げたnginxではデフォルトのnginx.confが使用されるため、このnginx.confを使うdocker imageをビルドします。

ビルドするためのDockerfileはこちら

```Dockerfile
FROM nginx
COPY nginx.conf /etc/nginx/nginx.conf
CMD nginx -g "daemon off;"
```

docker-composeの`build`にDockerfile及び必要な設定ファイル（ここではnginx.conf)のディレクトリを指定すると、ビルドを自動で行ってくれます！便利:relaxed:

## 最終的なdocker-compose.yml

というわけで、nginxのビルドを含めたdocker-compose.ymlは以下のようになります。

```
---
proxy:
    build: dev-nginx
    links:
        - mattermost:mattermost
    ports:
        - "80:80"
mattermost:
    image: mattermost/mattermost-preview
    ports:
        - "8065:8065"
    volumes:
        - /docker/mattermost/mysql:/var/lib/mysql
```

こちらをもとにdocker-composeを実行します

```
$ docker-compose up -d
Building proxy
Step 1/3 : FROM nginx
 ---> 568c4670fa80
Step 2/3 : COPY nginx.conf /etc/nginx/nginx.conf
 ---> 7d08e795c3bd
Step 3/3 : CMD -g daemon off;
 ---> Running in 6e9f4b301844
Removing intermediate container 6e9f4b301844
 ---> be43b58a3503
Successfully built be43b58a3503
Successfully tagged works_proxy:latest
WARNING: Image for service proxy was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating works_mattermost_1 ... done
Creating works_proxy_1      ... done
```

これで無事mattermostが使えるようになりました！！:clap::angel:

## mattermostのバックアップリストア:point_up:

さて、本題とは少しそれてしまいますが、今回mattermostのバックアップリストアも実施する必要があったため、そちらの手順も残したいと思います。

前の環境もdockerだったので、[mattermostのbackupドキュメント](https://docs.mattermost.com/administration/backup.html)と[dockerのドキュメント](https://docs.docker.com/v17.03/engine/tutorials/dockervolumes/#backup-restore-or-migrate-data-volumes)を参考にバックアップリストアを行います。

### mattermostで使用しているDBをバックアップする

dockerのドキュメントを参考にしながら実行します。

```
$ sudo docker run --rm --volumes-from mattermost-preview -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar <mattermostのsqlディレクトリ>
```

この`mattermostのsqlディレクトリ`ですが、私の場合/var/lib/mysqlにありました。

### バックアップしたDBをリストアする

これやり方本当にあっているのかわからないのですが、私はこうしました:information_desk_person:

1. バックアップしたtarファイルを任意の場所に置き、解凍する
2. 解凍場所をdocker-composeで指定する

```
    volumes:
        - /docker/mattermost/mysql:/var/lib/mysql
```

上のdocker-compose.ymlで書かれているこの部分ですね。

### DB以外のバックアップリストア

mattermostのドキュメントを見ると、DB以外で保存されている設定ファイルがあるのでバックアップリストアしてくださいとありました。

- config/config.json
    - サーバーの設定が書かれているファイル
    - SAMLを使用している場合はconfigディレクトリごとバックアップしてくださいとあります
- ./dataディレクトリ
    - デフォルトではここに添付ファイルなどが格納されている
    - デフォルトじゃない場合config.jsonにDirectoryに設定されている
    - S3に添付ファイルを保存する設定にしている人は特に何もしなくても大丈夫

私は面倒でこの2つまだやってないです:relieved:

# 参考
以下の記事を参考にしました！
https://qiita.com/y_hokkey/items/d51e69c6ff4015e85fce
https://qiita.com/mikoski01/items/7d71ef7d167a6b78219a