dockerでcrowiを入れてみた

# はじめに
自分用のメモやタスク管理で探していたら良いの見つけたので入れてみました。
Markdownで書けて、自分用のwikiを簡単に持てるなんて素敵です。
他の人がアカウントを作ることもでき、ドキュメントの共有も簡単にできそうです。

crowi : http://site.crowi.wiki/

~~環境を汚したくなかったので、dockerで入れようと思ったらすでに良いのがあったので使わせて頂きました。~~
~~docker-crowi : https://github.com/crowi/docker-crowi~~

~~今回は、上記のdocker-crowiにnginxを追加、DBの永続化を行なってみました。~~

上記リンクが、DEPRECATEDになっていたので修正です。公式ページを参考にします。

https://github.com/crowi/crowi/

また、volumeマウントも公式のdocker-composeでマウントするようになったので、DBの永続化などの作業は不要になりました。本記事では、GCEにデプロイしてましたが、herokuをサポートするようになっていたので、実際に使う場合にはherokuにデプロイした方が楽かと思います。

master branchはunstableらしいので、その時点での最新っぽいタグをcheckoutします。

以下のコマンドで起動
`$ docker-compose -f docker-compose.development.yml up`

いろいろsetupに時間がかかりますが、しばらく待つと`localhost:3000`でいつも通りのcrowiの画面が表示されます。

以下の記事は、情報が古くなっているので参考程度で

# 環境
今回はGCPのVM上に構築します。

```
CentOS Linux release 7.4.1708 (Core) 
Docker version 17.10.0-ce
docker-compose version 1.14.0
```

# インストール
まずは、dockerのインストール。最新版を取ってきます。

```
sudo curl -o /usr/local/bin/jq -L https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64 && sudo chmod +x /usr/local/bin/jq
curl -fsSL get.docker.com | bash
```
docker-composeも入れます。

```
curl -L https://github.com/docker/compose/releases/download/1.14.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
```

あとは、cloneして、docker-composeを走らせるだけです。docker素晴らしいですね。

```
git clone https://github.com/crowi/docker-crowi.git
docker-compose up -d
```

デフォルト設定ではポート8080で起動するので、アクセスしてみましょう。


<img width="1320" alt="スクリーンショット 2017-10-28 15.58.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/204896/6152143c-c20a-8c5b-9f83-21a970a3b5a0.png">

無事、アカウント登録の画面が表示されました。


# DBの永続化、Nginxの追加
DBの永続化とNginxを追加するため、docker-composeを編集していきます。
## DB
そのままでは、コンテナを消してしまうとcrowiのデータも消えてしまうので、mongodbコンテナ内の/data/dbを外部にマウントします。docker-composeのmongodbのコンテナ生成の記述に、マウントするよう記述を追加します。

```
  mongo:
    image: mongo:latest
    volumes:
      - ./mongodb_data/db:/data/db #追加
```

## ユーザー
> コンテナの/dataをボリュームとして登録してあります。中にはPASSWORD_SEEDを保存するconfigファイルとFILE_UPLOADがlocalの時にアップロードされたファイルを保存するuploadsディレクトリがあります。

> このボリュームが失われるとPASSWORD_SEEDが失われることにより管理者を含めた既存ユーザーがCrowiにログインできなくなるので注意してください。

ということなので、こちらもマウントしておきます。

```
  crowi:
    build: .
    image: crowi:1.6.2
    environment:
      - MATHJAX=1
      - PLANTUML_URI=http://localhost:18080
    links:
      - mongo:db
      - redis:redis
      - elasticsearch:es
    ports:
      - 8080:3000
    volumes:
      - ./entrypoint.sh:/entrypoint.sh
      - ./crowi_data/config:/data/config #追加
      - ./crowi_data/uploads:/data/uploads　#追加
```


## Nginx
プロキシやキャッシュ、ロードバランサーとして利用できるように、crowiの前段にNginxを置いておきます。docker-composeにnginx用のコンテナを作成する記述を追加します。今回は、コンテナのポート80をホストのポート8181にフォワードしてます。

```
  nginx:
    image: nginx:1.13.5-alpine
    ports:
      - "8181:80"
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/log/access.log:/var/log/nginx/access.log
      - ./nginx/log/error.log:/var/log/nginx/error.log
    command: [nginx, '-g', 'daemon off;']
    links:
      - crowi:crowi
```
ログと設定ファイルを外部にマウントし、nginxからcrowiが見えるようにリンクさせておきます。
プロキシさせるため、nginxの設定ファイルに以下を追加します。

```
location / {
	proxy_pass http://crowi:3000;
        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;
}
```
これでひとまず、nginxにアクセスすることで、crowiにアクセスできるようになります。
キャッシュやロードバランシングの設定は、次の機会に設定します。

# 実行
先ほど作ったコンテナを一度削除し、docker-composeで再度起動しなおします。

無事、起動されました。
<img width="1320" alt="スクリーンショット 2017-10-28 15.58.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/204896/6152143c-c20a-8c5b-9f83-21a970a3b5a0.png">

nginxを経由してます。

```
$curl -I http://[IP]:8181
HTTP/1.1 302 Found
Server: nginx
Date: Sat, 28 Oct 2017 08:24:32 GMT
Content-Type: text/plain; charset=utf-8
Content-Length: 28
Connection: keep-alive
X-Powered-By: Express
Location: /login
Vary: Accept
```

DB永続化の確認のため、アカウントとテストページを作成し、コンテナを作り直してみます。

それで、再度アクセスしてみると、
<img width="1420" alt="スクリーンショット 2017-10-28 17.15.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/204896/20c23812-92f3-3d41-ae08-dbbaf55c17bd.png">
アカウントの新規作成画面ではなく、ログイン画面が表示されればokです。

ログインしてみると、さきほど作成したテストページも無事残ってます。
<img width="1426" alt="スクリーンショット 2017-10-28 17.39.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/204896/a8bb49d6-d1cb-713c-0591-1f116268f7da.png">


# まとめ
dockerを用いて、crowiを導入してみました。さらに、nginxの追加とDBの永続化を行いました。実際に使うには、crowiのアクセス制限の設定やアカウントの作成制限などの設定を行う必要がありそうです。今後は、crowi本体やDBの冗長化など行なってみようと思います。