GROWI(Docker&SynologyNAS)のアップデート備忘録
はじめに
SynologyNASのDockerで動作させていたGROWIのアップデートを行い、大失敗をし、復旧するまでのメモと次回以降のアップデート作業のための備忘録
環境
・GROWI 5.1.4 → 7.0.12へのアップデート
・Synology NAS DS916+ DSM 7.1.1-42962 Update 6
・Windows11からPoderosaでSSH接続し操作
・SSHは「sudo -i」でrootで操作
・コンテナ名
・app growi-app-1
・elasticsearch growi-elasticserch-1
・mongodb growi-mongo-1
最初に行ってしまった手順
・mongodumpでバックアップ
*このバックアップデータを確認していなかったのがまずダメ
# docker exec -d growi-mongo-1 mongodump --archive=mongodb.archive
# docker cp growi-mongo-1:mongodb.archive ./
・GROWIのフォルダをまるごとコピー
NAS上なので今回の場合「/volume1/docker」にあった
このまるごとコピーのおかげでなんとかなった
# cp -r growi growi.backup
GROWIを止める
# docker-compose stop
コンテナの削除
# docker-compose rm app
Going to remove growi-app-1 (y/N) y
# docker-compose rm elasticsearch
Going to remove growi-elasticsearch-1 (y/N) y
ボリュームの削除
# docker volume rm growi_es_data
イメージの削除
# docker images | grep growi
*ここで出てきたハッシュ値?の頭3文字を指定して削除するみたい
# docker rmi $$$ $$$ $$$
リポジトリの更新
変更を行ったファイルはバックアップし、git checkoutする。
「git pull」すると、その処理が必要なファイルが出るので行う。
# cp docker-compose.yml docker-compose.yml.bak
# cp Dockerfile Dockerfile.bak
# git checkout docker-compose.yml
# git checkout Dockerfile
# git pull origin master
変更したファイルの変更を新しいファイルに適用する
git pullすると新しいファイルになるので、上記でバックアップしたファイルを元に変更を行う。ポートやシード、ディレクトリの場所など
変更を行ったらビルドする
# docker-compose build
ここで問題が発生。
ビルドエラーが発生する。
調べた結果、NASに入っているdocker-composeのバージョンが1系で新たなコマンドが使えずにエラーが出ていることが判明
そのため、2系に入れ替えることにする
コマンドはパッケージインストールしたDockerに含まれるものを/usr/local/binにリンクしてあるので、パッケージの方を置き換える。
パッケージのバージョンアップとかで戻ると思われるので注意
今回の場合の場所は
「/var/packages/Docker/target/usr/bin/docker-compose」
下に出ているdocker composeのgithubから最新のをダウンロードする。
このときCPUアーキテクチャは要注意。
NASなのでARMも多いので。今回はx86_64です。
# cd /var/packages/Docker/target/usr/bin
# mv docker-compose docker-compose.old
# wget https://github.com/docker/compose/releases/download/v2.28.1/docker-compose-linux-x86_64
# mv docker-compose-linux-x86_64 docker-compose
これで新しいバージョンになったはずなので確かめる。
ダウンロードしたバージョンと同じのが表示されたらOK
# docker-compose version
Docker Compose version v2.28.1
これでビルドが通るようになったはずなので、改めてビルドしてupする
# docker-compose build
# docker-compose up -d
これでめでたしめでたしで終わると思っていたのだが問題発生
何が発生したのか
コンテナが無限に再起動するという状態になってしまった。
そのため、ブラウザからアクセスしても何も表示されない状態
原因は
この時点で考えられる原因を調べてみたところ
・mongodbは4→5→6と順番にアップデートが必要
という記載を見つけてこれでは無いかと思い以下を実行した
但し、後述するが以下はこのNASの場合は実行してはいけない
# vi docker-compose.yml
mongo:
image: mongo:6.0 → 5.0
# export MONGO_VERSION=5.0
# export MONGO_CONTAINER_NAME=growi-mongo-1
# docker exec $MONGO_CONTAINER_NAME mongo --eval 'db.adminCommand( { setFeatureCompatibilityVersion: "'$MONGO_VERSION'" } )'
# docker-compose stop
# docker-compose build
# docker-compose up -d
理屈上ではこれでとりあえず、4.4から5.0になるはずだったが。。。
相変わらずコンテナが再起動を繰り返す。
ここでフォルダごとコピーしたのを戻してみたりして動かしてみたが当然イメージのバージョンアップを行っているので動かない状態になる。
mongodumpでバックアップしたファイルを確認したがなんと中身が数行しかない状態で何も無し。
GROWIのバックアップは同一バージョンじゃ無いと戻せない
ここで、絶望感しか無い状態になる
いろいろ行ったが全部意味が無かったのでここでは省略
ほんとうの原因
MongoDB 5以降はCPUのAVX拡張命令セットが動作条件として必須になったこと
そう、このAVXが原因だったのだ。
DS916+はCPUがIntel Pentium N3710でAVXに非対応だったのだ。
それで、MongoDBが5や6にバージョンアップできずにエラーとなり、正常に起動できない状態になったのだった。
*最近のNASのCPUであればAVXに対応しているはずなのでこのような問題は起こらないと思う。
どうすれば良いのか
原因が判明したところでどうすれば良いのか。
そう、すごく単純な話でMongoDB 4.4のまま動作させることができたのだ。
ただ、これは非常に良くない話でMongoDBのバージョンが古いまま使い続けることによる不具合が発生する可能性があるので、早急に別のDocker環境を用意したいと考えている。
通常通りのアップデート作業の途中で。。。
最初に行ってしまった手順通りに再度進める
途中のdocker-compose.ymlの編集で以下を変更する
# vi docker-compose.yml
mongo:
image: mongo:6.0 → 4.4
そう、これを指定することでMongoDBのイメージバージョンを指定することができるので、4.4を指定したことになる。
後はビルドして起動すると。。。
起動しない。。。そうもう一つこの環境ならではの問題があったのだ。
もう一つの問題
調べたところ、権限がうまく与えられてないことでの再起動を繰り返すようだ。
以下の投稿のおかげで助かった。
# chown -R 1000:1000 /volume1/docker/growi
権限を与えて再度コンテナを起動する。
今度は起動したようで、再起動もしなくなった。
ログイン画面が表示された。一気に気が抜けたようだった。
まとめ
さて、一度はデータをすべて諦めていたが、なんとか復旧することができた。
やはり、今回の事から今後のことを考えねばならない。
・NASの環境は基本的に特殊であること
・古いバージョンのソフトを使っていることもあったり、ソフトのバージョンアップが難しい可能性も高いこと
・CPUが古い場合に要求される環境を満たさないことがあること
・バックアップはバックアップが取れていることを確認すること
今後どうするか
・今のNAS上で動かすのを止めて、他のDocker環境に移行する
・Docker上で動かすにも場合によってはオーバーヘッドが大きくとも、Linux環境をDocker上で動かし、そこでGROWIを動かすのもあり
独り言
昔はpukiwikiをメインに使っていたんだけど、開発が止まってしまったのと、Markdown形式が良いなってなっていろいろ探した結果GROWIに移行したわけなんだけど。
pukiwikiの良かった点は1ページ1ファイルだったのでバックアップやバージョンアップがとても簡単だった。当然ページ数が多くなると遅くなっていくんだけどね。
今のはリッチな環境で速度や機能がとても良いんだけど、バックアップが難しかったり、バージョンアップに手間がかかるようになったね。
GROWIにいつか、バックアップしたファイルを新しいバージョンでインポートできるようになると良いなと思う(現在は同一バージョンでないと読み込めない)