growiを使いたい。
QNAPのNASがあって、ContainerStation(Docker)が動く。
growi、mongodb、elasticsearchを別々に入れようとしたが、elasticsaerchだけ連携がうまくいかない。
結局growi-docker-composeを用いて、手動で入れる。
NASはTS-453Beでメモリを8GBに増設してある。
NASにContainerStationを入れる
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のNASにsshで接続して、以下を実行する。
sudo sysctl -w vm.max_map_count=262144
確認
しかしこれは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の実行を許可する。
内容が確認できる。
再起動すれば
vm.max_map_countの値は意図したとおりになっていると思う。
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を見る。
この状態になれば
https://{NASのIPアドレス}: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がインストールされているので、よかった。