MacにDockerでGrowiを導入する

# 概要
growiをmacのローカル環境に構築してみる。CentOS上に一つずつコマンド等でインストールして構築もできましたが、Dockerだと本当にあっという間に終了します。

今回はMacで行いましたが、CentOS7環境でも特に問題なく構築できました(2020/03/01)

# Growiドキュメント
https://docs.growi.org/ja/guide/

# 環境確認
※Dockerとdocker-composeはそれぞれインストール済みとします


## Mac
```bash
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.13.4
BuildVersion:	17E202
```
## ホームディレクトリの確認
hogeユーザーでログインして作業しているとします。

```bash
$ echo ~
/Users/hoge
```

## Docker
```bash
$ docker --version
Docker version 19.03.2, build 6a30dfc
```
## docker-compose
```bash
$ docker-compose --version
docker-compose version 1.24.1, build 4667896b
```

# 手順

## 作業場所の決定
以下のように決定して作業します。

| 項目 | パス |備考|
|:-----------|:------------|:------------|
| docker関連保存場所 |~/srv/docker/growi        |git cloneするとgrowi-docker-composeディレクトリが生成される|
| データ保存場所 | ~/srv/docker/growi/data       |データをホスト間で明示的に永続化するため|

※ ~/srvでなくても、任意の場所で構いません。適宜読み替えてください

## growi-docker-compose のダウンロード

```bash
$ mkdir -p ~/srv/docker/growi
$ cd ~/srv/docker/growi
$ git clone https://github.com/weseek/growi-docker-compose.git
$ cd growi-docker-compose
```

## docker-compose.ymlの編集
以下を可能にする変更を行います。

1. localhost以外からのアクセスを許可
1. パスワードのSEEDをchangemから変更
1. MATHJAXを有効にする(必須ではない）
1. ファイルアップロードをローカルで受け付ける
1. データをホスト間で明示的に共有する

```bash
$ cp -p docker-compose.yml docker-compose.yml.org
$ vi docker-compose.yml
```

```docker-compose.yml

version: '3'

services:
  app:
    build:
      context: .
      dockerfile: ./Dockerfile
    ports:
      ### - 127.0.0.1:3000:3000    # localhost only by default
      - 3000:3000    ### 外部からのアクセスを受け付ける
    links:
      - mongo:mongo
      - elasticsearch:elasticsearch
    depends_on:
      - mongo
      - elasticsearch
    environment:
      - MONGO_URI=mongodb://mongo:27017/growi
      - ELASTICSEARCH_URI=http://elasticsearch:9200/growi
      - PASSWORD_SEED=tekitounihenkou 	### changemを適当な文字に変更する
      # - FILE_UPLOAD=mongodb   # activate this line if you use MongoDB GridFS rather than AWS
      - FILE_UPLOAD=local     ### ファイルアップロードはローカルで受け付ける
      - MATHJAX=1             # activate this line if you want to use MathJax
      # - PLANTUML_URI=http://  # activate this line and specify if you use your own PlantUML server rather than public plantuml.com
      # - HACKMD_URI=http://    # activate this line and specify HackMD server URI which can be accessed from GROWI client browsers
      # - HACKMD_URI_FOR_SERVER=http://hackmd:3000  # activate this line and specify HackMD server URI which can be accessed from this server container
      # - FORCE_WIKI_MODE='public'    # activate this line to force wiki public mode
      # - FORCE_WIKI_MODE='private'   # activate this line to force wiki private mode

    command: "dockerize
              -wait tcp://mongo:27017
              -wait tcp://elasticsearch:9200
              -timeout 60s
              npm run server:prod"
    restart: unless-stopped
    volumes:
      - growi_data:/data

  mongo:
    image: mongo:3.6
    restart: unless-stopped
    volumes:
      - mongo_configdb:/data/configdb
      - mongo_db:/data/db

  elasticsearch:
    build:
      context: ./elasticsearch
      dockerfile: ./Dockerfile
    environment:
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms256m -Xmx256m"  # increase amount if you have enough memory
    ulimits:
      memlock:
        soft: -1
        hard: -1
    restart: unless-stopped
    volumes:
      - es_data:/usr/share/elasticsearch/data
      - ./elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml

volumes:    ### 以下のようにホストのディレクトリを追記する ###
   growi_data:
      driver_opts:
        type: none
        device: /Users/hoge/srv/docker/growi/data/growi_data
        o: bind
   mongo_configdb:
      driver_opts:
        type: none
        device: /Users/hoge/srv/docker/growi/data/mongo_configdb
        o: bind
   mongo_db:
      driver_opts:
        type: none
        device: /Users/hoge/srv/docker/growi/data/mongo_db
        o: bind
   es_data:
      driver_opts:
        type: none
        device: /Users/hoge/srv/docker/growi/data/es_data
        o: bind
   es_plugins:
      driver_opts:
        type: none
        device: /Users/hoge/srv/docker/growi/data/es_plugins
        o: bind
```
※device:はフルパスを指定する必要があります。

## ホスト側のディレクトリを作成

```bash

$ mkdir -p ~/srv/docker/growi/data
$ cd ~/srv/docker/growi/data
$ mkdir growi_data mongo_configdb mongo_db es_data es_plugins
```

## Dockerを起動する
```bash
$ cd ~/srv/docker/growi/growi-docker-compose
# backgroudで起動する
$ docker-compose up -d
```

3000番ポートで稼働していることが確認出来ます。

```bash
$ docker ps -a
CONTAINER ID        IMAGE                                COMMAND                  CREATED             STATUS              PORTS                    NAMES
fe9d79e89411        growi-docker-compose_app             "/docker-entrypoint.…"   2 days ago          Up 2 days           0.0.0.0:3000->3000/tcp   growi-docker-compose_app_1
647e08d93ed7        mongo:3.6                            "docker-entrypoint.s…"   2 days ago          Up 2 days           27017/tcp                growi-docker-compose_mongo_1
8b4bfb0cdfa4        growi-docker-compose_elasticsearch   "/usr/local/bin/dock…"   2 days ago          Up 2 days           9200/tcp, 9300/tcp       growi-docker-compose_elasticsearch_1
```

#### docker-composeコマンドでも確認することが出来ます
```console
$ docker-compose ps
                Name                              Command               State           Ports
------------------------------------------------------------------------------------------------------
growi-docker-compose_app_1             /docker-entrypoint.sh dock ...   Up      0.0.0.0:3000->3000/tcp
growi-docker-compose_elasticsearch_1   /usr/local/bin/docker-entr ...   Up      9200/tcp, 9300/tcp
growi-docker-compose_mongo_1           docker-entrypoint.sh mongod      Up      27017/tcp
```


## URlアクセス確認
http://localhost:3000 にアクセス
初回アクセスはセットアップ画面が表示されます。
最初に作成されるアカウントには、自動的に管理者権限が付与されます。

![スクリーンショット 2019-10-25 1.03.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222012/3b634ea7-2b57-868c-32bf-73fb450aba43.png)


# バックアップとリストア

上記手順でインストールしたGrowiのバックアップとリストアを手動で行ってみます。公式サイトでは別途手順があるかと思いますので、そちらも参照してください。

## バックアップ

### アプリケーションの停止

```bash
  cd ~/srv/docker/growi/growi-docker-compose
  docker-compose stop
```

### データファイル全てのバックアップ

```bash
  cd ~/srv/docker/growi/
  tar cvfz  data-growi.20200223.tar.gz data

  # 現在時刻でバックアップを作成する場合
  tar cvfz  data-growi.`date +%Y%m%d-%H%M%S`.tar.gz data
```

## リストア

### dataディレクトリを復元したいバックアップで置き換える
```bash
  mv data data_org
  tar xvfz data-growi.20200223.tar.gz
```

### アプリケーションの起動
```bash
  cd ~/srv/docker/growi/growi-docker-compose
  docker-compose start
```

## 確認

http://localhos3000/