狙い
Crowiを運用して2年が経ってしまった。仮初のバックアップはあったが実はしていない。
会社でも他の部署も使い始めそうである。
クラッシュしても知らん、の精神だったがそろそろ思い腰をあげようと思った。
ちなみにdockerのやつが動いてる
方法
今回はMongoDBのバックアップとリストアでどうにかする予定である。
手順
mongodbのコンテナ名を確認する
> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f79c89b228c8 crowi_crowi "docker-entrypoint.s…" 17 minutes ago Up 17 minutes 0.0.0.0:3000->3000/tcp crowi_crowi_1
d0b5a3892e46 mongo:3.6.3 "docker-entrypoint.s…" 17 minutes ago Up 17 minutes 0.0.0.0:27017->27017/tcp crowi_mongodb_1
c53732c51848 redis:4.0.8 "docker-entrypoint.s…" 4 hours ago Up 17 minutes 0.0.0.0:6379->6379/tcp crowi_redis_1
5307508ede61 plantuml/plantuml-server:latest "/docker-entrypoint.…" 4 hours ago Up 17 minutes 0.0.0.0:8080->8080/tcp crowi_plantuml_1
mongodbのコンテナにログインする。
> docker exec -it crowi_mongodb_1 /bin/bash
ログイン後に、backフォルダを作成してmongodumpバックアップを実施
root@d0b5a3892e46:/home# mkdir back
root@d0b5a3892e46:/home# cd back/
root@d0b5a3892e46:/home/back# ls
root@d0b5a3892e46:/home/back# mongodump
本作業で該当フォルダに「dump」と言う名称のファイルが復元される。
ログインから復帰して、その出力したdumpファイルをローカルに持ってくる
> docker cp crowi_mongodb_1:/home/back/dump ~/prog/crowi/
この後に、今回はリハのため一度downしてコンテナを削除し、再度docker-compose up によりまっさらなcrowiのシステムを作成します。
で、戻します。「back」フォルダ作らんでよかったですね
> sudo docker cp dump crowi_mongodb_1:/home/dump
リストア実施
root@3f3c2d2ddfd9:/home# mongorestore dump/
で復元完了、、、、ユーザーも記事も問題なし。
[追記]
remoteでもバックアップいけるわ
> mongodump --host 127.0.0.1:27017
トラブル
本手順だとdockerコンテナログイン時はrootユーザでログインするのでリストアしても一部記事が反映されない。
簡略な方法としては以下である。
- コンテナログイン時までは一緒
- dump用のフォルダを作成する
- 以下のコマンドを打ってユーザーを切り替える
$ su mongodb
- mongodumpでダンプする
これで全部の記事が吐き出さられる。
まとめると巷にあふれるcrowi + docker のmongoコンテナで動いてるmongodbはmongodbユーザーに所有権があると言うことになります、
おそらく、mongodbの中でユーザーを作成してそのユーザーでログインすれば問題ないのだと思う。
が、まだやっていない。