Growi を使って設計書を管理する。

#はじめに
　個人開発の設計書は、Googleスプレッドシートで管理していましたが、
　GrowiというオープンソースのWikiシステムを知り、せっかくなら楽しく（新しいシステムに触れながら）、
　開発したかったので、Growiを使って設計書を管理するようにしました。

　Growiは、QiitaのようにMarkdownでの記述が可能で、また以下のような特徴があります。
　　・検索が速い。
　　　ElasticSearchが使われおり、検索が速いです。
　　・ファイルの差分管理が可能
　　・UMLの記述も可能
　　　plantumlと連携することで、UMLも設計書に記述が可能です。

　簡単に導入が可能なので、まずは使って見て下さい。
　それでは、インストール、インストール後の設定及び
　簡単な設計書の作成までの手順について紹介します。
　※ 本投稿は、Mac OSを前提としています。
　　macOS Catalina 10.15.3で作業しています。

#前提条件
　docker-composeを使って、Growiの環境を用意します。
　docker-composeはDocker for Macに含まれていますので、
　Docker for Macがインストールされていない場合、
　最初にDocker for Macをインストールして下さい。
　※ 参考情報（Docker for Macのインストール）

#1. Growiのダウンロード
　(1) 任意の作業ディレクトリへの移動
　　任意の作業ディレクトリを用意し、移動して下さい。
　(2) Gitコマンドの実行
　　作業ディレクトリで、以下のコマンドを実行します。

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

　(3) growi への移動
　　上記で、growiディレクトリが作成されるので、移動します。

```php
$ cd growi
```

#2. 設定変更
　前項「#1. Growiのダウンロード」の状態でも、「docker-compose up -d」を実行すると、
　Growiの利用が可能になりますが、本投稿では幾つかの修正を行います。
　docker-compose.ymlの修正を行います。

##2-1. docker-compose.ymlの修正
　docker-compose.ymlを開き、以下の[修正後]の内容を記述して保存します。

[修正前]

```php
version: '3'

services:
  app:
    build:
      context: .
      dockerfile: ./Dockerfile
    ports:
      - 127.0.0.1:3000:3000    # localhost only by default
    links:
      - mongo:mongo
      - elasticsearch:elasticsearch
    depends_on:
      - mongo
      - elasticsearch
    environment:
      - MONGO_URI=mongodb://mongo:27017/growi
      - ELASTICSEARCH_URI=http://elasticsearch:9200/growi
      - PASSWORD_SEED=changeme
      # - FILE_UPLOAD=mongodb   # activate this line if you use MongoDB GridFS rather than AWS
      # - 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
      # - 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:
  mongo_configdb:
  mongo_db:
  es_data:
```

[修正後]

```php
version: '3'

services:
  app:
    build:
      context: .
      dockerfile: ./Dockerfile
    ports:
      - 127.0.0.1:3000:3000    # localhost only by default
    links:
      - mongo:mongo
      - elasticsearch:elasticsearch
    depends_on:
      - mongo
      - elasticsearch
    environment:
      - MONGO_URI=mongodb://mongo:27017/growi
      - ELASTICSEARCH_URI=http://elasticsearch:9200/growi
      - PASSWORD_SEED=changeme
      # - FILE_UPLOAD=mongodb   # activate this line if you use MongoDB GridFS rather than AWS
      - 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
      - PLANTUML_URI=http://localhost:8080/  # 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

  plantumlserver:
    image: plantuml/plantuml-server:jetty
    restart: unless-stopped
    ports:
      - "8080:8080"

volumes:
  growi_data:
    driver_opts:
      type: none
      device: $PWD/data/growi_data
      o: bind
  mongo_configdb:
    driver_opts:
      type: none
      device: $PWD/data/mongo_configdb
      o: bind
  mongo_db:
    driver_opts:
      type: none
      device: $PWD/data/mongo_db
      o: bind
  es_data:
    driver_opts:
      type: none
      device: $PWD/data/es_data
      o: bind
```

　[修正した箇所の説明]
　　① ファイルのアップロード先の変更
　　　"- FILE_UPLOAD=local" がコメントアウトされているので、コメントアウトを外します。 
　　　ファイルのアップロード先がローカル（Dockerホストのボリューム内）となります。
　　② MATHJAXの有効化
　　　"- MATHJAX=1" がコメントアウトされているので、コメントアウトを外します。 
　　③ plantumlの有効化
　　　"- PLANTUML_URI=http://" がコメントアウトされているので、コメントアウトを外し、 
　　　PLANTUML_URIに[http://localhost:8080/]()を設定します。
　　　また、plantumlserver:の設定を追記します。
　　④ volumesの変更
　　　growi_data mongo_configdb mongo_db es_dataについて、
　　　Dockerホストのボリューム内にマウントします。

##2-2. マウント先の作成
　volumesに指定したgrowi_data mongo_configdb mongo_db es_dataについて、
　ディレクトリを作成します。

```php
$ mkdir data
$ cd data
$ mkdir growi_data mongo_configdb mongo_db es_data
```

　[ここまでのファイル構成]

```php
$ tree .
.
├── Dockerfile
├── LICENSE
├── README.md
├── data
│   ├── es_data
│   ├── growi_data
│   ├── mongo_configdb
│   └── mongo_db
├── docker-compose.dev.yml
├── docker-compose.yml
├── elasticsearch
│   ├── Dockerfile
│   └── config
│       ├── elasticsearch.yml
│       └── log4j2.properties
├── examples
│   ├── backup-mongodb-data
│   │   ├── README.md
│   │   ├── crontab
│   │   │   └── root
│   │   └── docker-compose.override.yml
│   ├── https-portal
│   │   ├── README.md
│   │   └── docker-compose.override.yml
│   ├── integrate-with-hackmd
│   │   ├── README.md
│   │   └── docker-compose.override.yml
│   └── multi-app
│       ├── README.md
│       └── docker-compose.yml
└── hackmd
    ├── Dockerfile
    ├── apply-growi-agent.sh
    └── config.json
```

#3. Growiの作成
#3-1. docker-compose up -dの実行
　以下のコマンドを実行します。

```php
$ docker-compose up -d
```

#3-2. Dockerの確認

　(1) Dockerプロセスの確認

```php
$ docker ps -a
CONTAINER ID        IMAGE                            COMMAND                  CREATED              STATUS              PORTS                      NAMES
09ee25e4b028        growi_app                        "/sbin/tini -e 143 -…"   About a minute ago   Up 15 seconds       127.0.0.1:3000->3000/tcp   growi_app_1
157ddbc96f45        growi_elasticsearch              "/usr/local/bin/dock…"   About a minute ago   Up About a minute   9200/tcp, 9300/tcp         growi_elasticsearch_1
a7676ac10a7d        plantuml/plantuml-server:jetty   "/docker-entrypoint.…"   About a minute ago   Up About a minute   0.0.0.0:8080->8080/tcp     growi_plantumlserver_1
646fb8f4ffe0        mongo:3.6                        "docker-entrypoint.s…"   About a minute ago   Up About a minute   27017/tcp                  growi_mongo_1
```

　(2) Dockerイメージの確認

```php
$ docker images
REPOSITORY                                      TAG                 IMAGE ID            CREATED             SIZE
growi_app                                       latest              ee8c446d8db9        5 minutes ago       264MB
growi_elasticsearch                             latest              e45b339dbf2a        7 minutes ago       860MB
plantuml/plantuml-server                        jetty               4fba4aa0dc27        9 hours ago         404MB
mongo                                           3.6                 c95b2c69031b        2 days ago          439MB
weseek/growi                                    3                   a9079d4edf10        2 weeks ago         255MB
docker.elastic.co/elasticsearch/elasticsearch   6.6.1               c6ffcb0ee97e        14 months ago       842MB
```

　(3) Dockerボリュームの確認

```php
$ docker volume ls
DRIVER              VOLUME NAME
local               growi_es_data
local               growi_growi_data
local               growi_mongo_configdb
local               growi_mongo_db
```

#3-3. 動作確認
　(1) ブラウザを開き、"[http://localhost:3000/installer](http://localhost:3000/installer)"にアクセスし、
　下記のように表示されていることを確認します。
　　![FireShot Capture 015 - セットアップ - GROWI - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165180/23773383-1368-ef97-50c7-738b63cd7d69.png)

　(2) アカウント情報の入力
　　管理アカウントの情報を入力して下さい。
　　以下のページが開きます。
　　　![FireShot Capture 017 - App settings - GROWI - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165180/de474a36-43ae-d75c-224d-0a0f22a9552b.png)

　(3) Site URL settingsの設定
　　Site URL settingsを設定しないと、幾つかの機能に制限が掛かります。
　　本投稿では、[http://127.0.0.1:3000]()を設定します。
　　　![FireShot Capture 020 - App settings - GROWI - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165180/0bdd2466-96d0-b022-f4bc-5f3a3b037da3.png)








ここまでが、Growiの環境構築までの手順となります。
次項では、設計書を作成します。

#4. 設計書の作成
　(1) 最初に、画面右上の「New」ボタンを押下します。
　　![FireShot Capture 017 - App settings - GROWI - localhost2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165180/466f1714-fa29-4940-0be7-9150fac26c1e.png)

　(2) 次にファイル名を入力し、「Create」ボタンを押下します。
　　![FireShot Capture 026 - App settings - GROWI - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165180/e25f918b-2393-7f95-4b14-aa47b3334c76.png)

　(3) ページの内容を記述し、「Create」ボタンを押下します。
　　ここでは、Markdown、plantumlがそれぞれ記述できるか確認しています。
　　![FireShot Capture 027 - _user_ryota_test_2020_05_03_firstpage - GROWI - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165180/ded9ed29-528d-a464-b519-a38d7d67b63e.png)

　　そうすると、以下のようにページが作成されます。
　　![FireShot Capture 028 - _user_ryota_test_2020_05_03_firstpage - GROWI - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165180/c55826f9-be66-9ac4-f756-538c2242f9b3.png)

以上となります。

Elasticsearch の検索は割愛しましたが、
他にも機能が豊富なので、色々と試して下さい。

#参考情報（Docker for Macのインストール）
　Docker for Macをダウンロードする際、Dockerの公式サイトにログインする必要があります。
　Dockerの公式サイトにログインするためのユーザを作成して下さい。
#1. Docker for Mac
　最初にDocker for Macのインストールを行います。
　Docker Composeは、Docker for Macに含まれています。
##1-1. ダウンロード
　以下のサイトからダウンロードします。
　https://docs.docker.com/docker-for-mac/install/

　(1) 「Download from Docker Hub」ボタンを押下します。
　　![FireShot Capture 192 - Install Docker Desktop on _ - https___docs.docker.com_docker-for-mac_install_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165180/328494b2-745b-6bd6-dfb2-3b059d766499.png)

　(2) 「Download Docker Desktop for Mac」ボタンを押下します。
　　Docker.dmg がダウンロードされます。
　　![FireShot Capture 193 - Docker Hub - https___hub.docker.com__overlay=onboarding.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165180/68a0922f-5436-0bdf-9d9d-01d65087a93f.png)

##1-2. インストール
　(1) Docker.dmgの実行
　　ダウンロードした Docker.dmg を実行して下さい。

　(2) Applicationsに移動
　　DockerをApplicationsに移動させます。
　　<img width="714" alt="スクリーンショット 2020-02-09 18.57.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165180/b9ce98df-7d30-f48a-3323-9fb0f7584f5d.png">

　(3) Dockerの実行
　　アプリケーションからDockerを実行して下さい。

##1-3. 確認
　(1) ターミナルを開き、"docker --version"を実行します。
　　インストールしたDockerのバージョンを確認します。

```php
$ docker --version
Docker version 19.03.5, build 633a0ea
```

　(2) 次に、"docker-compose --version"を実行します。
　　Docker Composeのバージョンを確認します。

```php
$ docker-compose --version
docker-compose version 1.25.4, build 8d51620a
```



#参考元
[Growi本家](https://docs.growi.org/en/admin-guide/getting-started/docker-compose.html#overview)
[Growi(Markdown記法によるWikiプラットフォーム)をdocker-composeで稼働させる](https://qiita.com/myoshimi/items/f7029c3d86869dc13ae5)
[DockerでGrowiをセットアップする](https://qiita.com/hawk777/items/2c87327f6a2d83b4bad7)
[Growi：ユーザーズガイド](https://docs.growi.org/ja/guide/tutorial/create_page.html#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E5%BE%8C)