QNAPのContainerStationでGrowiをDocker-Composeで構築・アップデートした話

## 社内WiKiにGrowiを立てた

社内WiKiを立ち上げることになり、いろいろと調べた結果、活発にバージョンアップをしている、Growiを使用することに。

まずは、社内の仮想サーバ上CentOS作って立てました。

この時は、何も考えず、手順通りにDocker-Composeを使い、何ら問題なく試用開始。

使ってみて便利なので、本稼働させることに。
より安全で容量の大きなサーバで運用したかったので、丁度会社で購入した、QNAP NAS上に展開することに。

## ContainerStation の罠(Growi v4.5)

そもそもDockerを理解していないのがまずいのですが、ContainerStationの作成機能で、検索して出てきたweseek/growiをインストール。
ほどなくして、立ち上がってきたので使いかけたときに、検索できないことに気づきました。
あ、Elasticsearch入れないといけないんだな。と理解し、同じく検索して出てきたものをインストールたものの、連携の仕方がわからないため、頓挫。
やっぱり、Docker-Composeでインストールしなきゃダメか…ということで、
作成のアプリケーションの作成(Docker-Compose)を行うことに。

特にGrowiはDocker-Composeで完結せず、サブフォルダのDockerファイルを見たりしているので厄介でしたが、思いつくままやってみたところ、うまくいきました。

QNAPにエクスプローラでアクセスし、Containerフォルダ直下にGrowiフォルダを作成して、

https://github.com/weseek/growi-docker-compose

のZipの中身をすべていれました。

docker-compose.ymlの中身を
アプリケーションの作成に書きこんで、YAMLを検証し、作成。

紆余曲折あり、下記のようにすることでうまくいきました。
ファイルの実態をフルパスで書くとうまくいきました。
dockerfileの指定は、相対で良かったのかも。
フルパスは、誤ったファイル指定をすることで推測ができると思います。
あと、アプリケーション名はすごく重要なので、ちゃんと覚えておきましょう。


```yml
version: '3'

services:
  app:
    build:
      context: /share/CACHEDEV1_DATA/Container/growi
      dockerfile: /share/CACHEDEV1_DATA/Container/growi/Dockerfile
    ports:
      - 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

    entrypoint: "dockerize
                  -wait tcp://mongo:27017
                  -wait tcp://elasticsearch:9200
                  -timeout 60s
                  /docker-entrypoint.sh"
    command: ["yarn migrate && node -r dotenv-flow/config --expose_gc dist/server/app.js"]

    restart: unless-stopped
    volumes:
      - growi_data:/data

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

  elasticsearch:
    build:
      context: /share/CACHEDEV1_DATA/Container/growi/elasticsearch
      dockerfile: /share/CACHEDEV1_DATA/Container/growi/elasticsearch/Dockerfile
    environment:
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms256m -Xmx256m"  # increase amount if you have enough memory
      - LOG4J_FORMAT_MSG_NO_LOOKUPS=true # CVE-2021-44228 mitigation for Elasticsearch <= 6.8.20/7.16.0
    ulimits:
      memlock:
        soft: -1
        hard: -1
    restart: unless-stopped
    volumes:
      - es_data:/usr/share/elasticsearch/data
      - /share/CACHEDEV1_DATA/Container/growi/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml

volumes:
  growi_data:
  mongo_configdb:
  mongo_db:
  es_data:
```
出来上がったコンテナ群をチェックして開始。

無事立ち上がり、めでたしめでたし。

## バージョンアップの試練(Growi v4.5 -> v5)

しばらくバタバタしていて、
本稼働には至ってなかったので、使うための準備。

確認すると、メジャーバージョンアップしていた！

まだ本稼働してないから、今の間に練習しとかなきゃ。
ということで、やってみる。

公式ガイドでは、下記のように案内されていた。

https://docs.growi.org/ja/admin-guide/upgrading/50x.html#elasticsearch-7-x-%E3%81%AE%E3%82%B5%E3%83%9B%E3%82%9A%E3%83%BC%E3%83%88

特に、Docker-Composeの場合は、下記の手順でのこと。

https://github.com/weseek/growi-docker-compose/wiki/Upgrade-Elasticsearch-from-6.x-to-7.x

コマンドなら、そのままなんだろうけど、ContainerStationなんで、GUIからどうやれば!?

と検索すると、下記にあたった。

https://www.5cho-me.com/archives/180677

なんでも、コンテナを停止して、消してやれば良いとのこと。

なので、コンテナ停止　->　コンテナ削除
イメージも消した方が良いかな？と思ったので、イメージも削除。
ただし、mongodbは手をつけず、アプリケーション名_appとアプリケーション名_elasticsearchを削除。
コンテナ削除しないと、このあたりのは削除できなかった。

最初と同様に、

https://github.com/weseek/growi-docker-compose

のZipの中身をすべて、前回のフォルダと同じ名前のところにいれました。
念のため、前の分はリネームしました。


docker-compose.ymlを確認すると、まったく変わっていなかったので、
前回と全く同じものを流し込み。
この時に、アプリケーション名も前回と同じものをいれました。
おそらくこれにより、ボリュームに保存されているデータが引き継がれるのでは？
と踏んでいました。

作成を押したあと、コンテナの起動を行い、しばらく待つと、ちゃんとデータが引き継がれたGrowiが立ち上がりました。

v4.5からv5へのバージョンアップでしたので、データのコンバートが必要とのこと。

コンバートも無事に終わり、アップデート完了しました。

あと何回かバージョンアップして確実性を確認したいところ。

## 最後に

Dockerわからんけど、なんとかなった。