e-tipsmemo

ごった煮

QNAP NASにgrowi-docker-composerを入れる

growiを使いたい。
QNAPのNASがあって、ContainerStation(Docker)が動く。
growi、mongodb、elasticsearchを別々に入れようとしたが、elasticsaerchだけ連携がうまくいかない。
結局growi-docker-composeを用いて、手動で入れる。

NASはTS-453Beでメモリを8GBに増設してある。

NASにContainerStationを入れる

f:id:katakanan:20220220183309p:plain

NASへのSSH接続を許可する

f:id:katakanan:20220220183142p:plain
admin権限を持っていないといけない。

vm.max_map_countを変える

Elasticsearchに関して、以下のようなエラーが出ることが予想されるので、予め対策しておく。

ERROR: [1] bootstrap checks failed. You must address the points described in the following [1] lines before starting Elasticsearch.
bootstrap check failure [1] of [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
ERROR: Elasticsearch did not exit normally - check the logs at /usr/share/elasticsearch/logs/docker-cluster.log

vm.max_map_countを変更するにはQNAPのNASsshで接続して、以下を実行する。

sudo sysctl -w vm.max_map_count=262144

確認
f:id:katakanan:20220212225901p:plain

しかしこれはNASが再起動すると、値はもとに戻ってしまう。
一般的には /etc/sysctl.confを設定することによって、kernel parameterを設定できるはずだが、
QNAPはsysctrl.confは再起動すると、消されてしまう。
よって、QNAPが提供する方法に沿ってautorun.shを設定する。

HOWTO: Install Elasticsearch in QNAP : qnap
Running Your Own Application at Startup - QNAPedia

NASにはTS-453Beを使用しているので
以下のコマンドによって、bootパーティション?をマウントできた。

mount $(/sbin/hal_app --get_boot_pd port_id=0)6 /tmp/config

vim /tmp/config/autorun.sh にvm.max_map_countを変更するコマンドを記述したら
マウントを解除して、
QNAPの設定画面からautorun.shの実行を許可する。

f:id:katakanan:20220212234558p:plain
内容が確認できる。

再起動すれば
vm.max_map_countの値は意図したとおりになっていると思う。

growi-docker-compose.zipを持ってくる

gitが入っていないのでgithubからzipでダウンロード。
NASの共有フォルダとかに置く。
共有フォルダの位置は/share以下

mongodbとgrowi用のフォルダを作る。

mongodbとgrowiのデータが入る場所を作る。
そこにmongodbのデータや、growiのアップロードしたファイルなどが置かれる。

例えば、dataという共有フォルダを作って、以下のようにした。

/share/data/db
/share/data/configdb
/share/data/growi_db

dbの中は空じゃないと、mongodbの起動?に失敗する。
(Elasticsearchのインデックが保存される先のフォルダも作ってもいいが、あんまり意味ないかもしれない。)
共有フォルダの下にあることで、一応Windowsとかからもアクセスできる。

docker-compose.ymlの編集

growiのポート設定

    ports:
      - 3000:3000    # localhost only by default
      #- 127.0.0.1:3000:3000    # localhost only by default

"127.0.0.1:"を消すことで、localhost以外からアクセスできるようになる。(LAN内だけからしか使用しない)

growiの環境変数設定

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

すでにmongodbとelasticsearchのURIが入っており、
FILE_UPLOAD=localを有効にする。
MathJaxも使いたかったら有効にする。

volumesの変更

growiの環境変数の設定と先ほど作成したフォルダの指定をする。

growiのデータ保存先。

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

mongodbのデータ保存先。

  mongo:
    image: mongo:4.4
    restart: unless-stopped
    volumes:
      - /share/data/configdb:/data/configdb:rw
      - /share/data/db:/data/db:rw

volumesのプロパティを編集する。
[dockerの外のディレクトリ] : [docker内のディレクトリ]:rw
という対応らしいので、コロンの左側に、先ほど作成したディレクトリのパスを書く。rwは権限?(一応書いておく)

これを書いたらdocker-compose.ymlの最後の growi_data、mongo_configdb、mongo_dbがいらなくなる。

volumes:
  growi_data:   #いらない
  mongo_configdb:  #いらない
  mongo_db:  #いらない
  es_data:  #Elasticsaerch用のデータのディレクトリを作ってあれば、いらない

Elasticsearchのメモリ

      - "ES_JAVA_OPTS=-Xms2g -Xmx2g"  # increase amount if you have enough memory

NASには8GB積んであるので、
256m から 2gにした。

docker-composeでビルドする。

docker-compose build

起動

docker-compose up

ログが流れ始める。

QNAP NASのContainerStationを見る。

f:id:katakanan:20220220191344p:plain
この状態になれば
https://{NASIPアドレス}:3000
にアクセスできて、初回アクセスで、管理者アカウントを作成することになる。

もしymlに変更を加えて、イメージをbuildしなおしたくなったら

【GROWI】docker-composeで行うアップグレード手順(3.x→4.x) | インフラエンジニアの技術LOG
の手順に従う。

その他

ContainerStationから作成しているわけじゃないので、ContainerStationから操作することができなさそう?
その時はSSHでつなげて、dockerのコマンドをたたくしかない。

もしかしたらmongodbの使用するフォルダの所有者が、999でないといけないかもしれない?。(なんで)
少なくともこれに沿って、
ContainerStationからmongodbのコンテナを作成したときは、指定したフォルダの所有者が、勝手に、999になった。

VMware player上のUbuntuでお試しでやった時は
analysis-kuromoji のインストールに失敗したので、その時は
growi-docker-compose/elasticsaerch/Dockerfileの、
analysis-kuromoji とanalysis-icuコメントアウトして、
growi、mongodb、elasticsearchのコンテナが起動した後に、

docker exec -it [elasticsaerchのコンテナid] "bin/bash"

で中に入ってから、

bin/elasticsearch-plugin install analysis-kuromoji
bin/elasticsearch-plugin install analysis-icu

を行い。

docker-compose.ymlの場所で

docker-compose restart

を使用し、すべてのコンテナを再起動する。
最後に、growiから、「インデックのリビルド」を行うことで、
全文検索機能が機能するようになった。

growiにはすでに、growi-plugin-lsxがインストールされているので、よかった。

感想

NASでdockerが動くようになっているのはかなり便利だなと思うが、NASの構成が、普通のPCと違うので、それなりに手間はかかってしまった。
しかしTS-453BeはCeleronで動いているので、「aarch64だと云々」のようなトラブルがないのは安心だった。
Synologyのほうが、よいとも聞くので次に買うことがあったら、Synologyのを買おうと思う。