wiki
docker
Crowi

dockerでcrowiを入れてみた

はじめに

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

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

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

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

環境

今回は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で起動するので、アクセスしてみましょう。

スクリーンショット 2017-10-28 15.58.23.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で再度起動しなおします。

無事、起動されました。
スクリーンショット 2017-10-28 15.58.23.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永続化の確認のため、アカウントとテストページを作成し、コンテナを作り直してみます。

それで、再度アクセスしてみると、
スクリーンショット 2017-10-28 17.15.36.png
アカウントの新規作成画面ではなく、ログイン画面が表示されればokです。

ログインしてみると、さきほど作成したテストページも無事残ってます。
スクリーンショット 2017-10-28 17.39.06.png

まとめ

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