Growi(Markdown記法によるWikiプラットフォーム)をdocker-composeで稼働させる


# TL;DR

* Markdown記法で書けるオープンソースなWikiプラットフォーム [GROWI](https://growi.org/) のセットアップ方法です
    * docker-composeでコンテナとして立ち上げるので，ホストの環境を汚しません
    * growiのdocker-compose版(2019/03/29時点)では，elasticsearchのイメージタグがoss版になっていないので，修正点をメモします

# Growi概要

* Growiは，数式，UML図などを含め，サイドバイサイドに編集できる高機能なWikiシステムです
* ユーザ認証，公開設定など，複数人での編集にも効果を発揮します
* リバースプロキシでhttps対応できます(簡単)

![growi.jpg](https://qiita-image-store.s3.amazonaws.com/0/309617/15af41d9-53e7-78e4-a0f6-18bd6fe45d09.jpeg)

# Dockerコンテナ群の立ち上げ

* X-Pack絡みでElasticsearchコンテナがエラーを吐くので，OSS版Elasticsearchを使用するとスムーズです
* growiサービスは，以下の手順で立ち上げることができます．
    1. docker-compose版のgrowiをgit cloneする
    1. docker-compose.ymlの記述をコンテナ環境に応じて修正する
    1. docker-compose upする

## growi-docker-composeの取得

* [growi-docker-compose](https://github.com/weseek/growi-docker-compose)をgit cloneします

```shell
git clone https://github.com/weseek/growi-docker-compose.git growi
```

## 設定情報(docker-compose.yml)の修正

* Growi本体の設定と，elasticsearchのコンテナイメージを若干修正します．
* 修正対象は以下の2つのファイルです
    * Growiのdocker-compose構成ファイル(docker-compose.yml)
    * ElasticsearchのDockerfile(elasticsearch/Dockerfile)

### growi/docker-compose.yml

* (必須)ファイルアップロード先をローカル（Dockerホストのボリューム内）に設定し，[MathJAX](https://www.mathjax.org/)を有効化します

```diff
-      # - FILE_UPLOAD=local     # activate this line if you use local storage of server rather than AWS
-      # - MATHJAX=1             # activate this line if you want to use MathJax
+      - FILE_UPLOAD=local     # activate this line if you use local storage of server rather than AWS
+      - MATHJAX=1             # activate this line if you want to use MathJax
```

* (任意)Growiのデータを，Docker Volume管理の場所から，ローカルディレクトリに変更します
    * Docker管理のボリュームを使う場合は，変更不要です

```diff
-      - growi_data:/data
+      - ./growi_data:/data
```

* (任意)mongodbのデータ置き場を，ローカルディレクトリに変更します
    * Docker管理のボリュームを使う場合は，変更不要です

```diff
-      - mongo_configdb:/data/configdb
-      - mongo_db:/data/db
+      - ./mongo/mongo_configdb:/data/configdb
+      - ./mongo/mongo_db:/data/db
```

* (任意)elasticsearchのデータ置き場を，ローカルディレクトリに変更します
    * Docker管理のボリュームを使う場合は，変更不要です

```diff
-      - es_data:/usr/share/elasticsearch/data
+      - ./es_data:/usr/share/elasticsearch/data
```

* (任意)前項の，ローカルディレクトリに変更したDocker Volumeは不要なので，削除します．

```diff
-volumes:
-  growi_data:
-  mongo_configdb:
-  mongo_db:
-  es_data:
```

### growi/elasticsearch/Dockerfile

* (必須)oss版のelasticsearchのDockerイメージを使用するよう変更します

```diff
-FROM docker.elastic.co/elasticsearch/elasticsearch:6.6.1
+FROM docker.elastic.co/elasticsearch/elasticsearch-oss:6.6.1
```

## docker-composeでコンテナの立ち上げ

```shell
docker-compose up
```

### [注意] elasticsearchのデータ置き場を変更した場合

* ```docker-compose up```より前に，下記のようにディレクトリを作り，elasticsearchコンテナからアクセスできるようにしておく必要があります
    * この設定を行っていないと，elasticsearchコンテナが```Failed to created node environment```例外を発行して再起動を繰り返してしまいます

```shell
mkdir es_data
sudo chown -R 1000:1000 es_data
```

## 接続確認

* ブラウザで```localhost:3000```にアクセスし，growiの初期設定画面が見られることを確認します．
    * アクセス制限がlocalhost限定になっているので，他のホストから接続したい場合は，docker-compse.ymlのappコンテナのports設定を修正してください．
    * ポートの変更も同じ場所(appコンテナのports設定)で対応できます．
* 初期設定画面
* <img src="https://qiita-image-store.s3.amazonaws.com/0/309617/190d9773-63f6-2aaa-9fc0-2b7ba65ad147.jpeg" width=50%>
* ログイン画面
    * <img src="https://qiita-image-store.s3.amazonaws.com/0/309617/b7b85e2a-4dab-1b7e-033c-5c63de6016fc.jpeg" width=50%>
    * ログインすると，冒頭の作業画面で作業を開始できます
* https対応は，別途nginxコンテナを立ててリバースプロキシすると良いです

# 参考

* [github.com/weseek/growi-docker-compose](https://github.com/weseek/growi-docker-compose)
* [おしゃれなMarkdown対応wiki : Growiを構築運用する](https://qiita.com/sasayabaku/items/ae276f15ec4f614f0542)
* [Failed to created node environment #21](https://github.com/elastic/elasticsearch-docker/issues/21)