GROWI のデータをサルベージした話

こんにちは。いにしえの個人用 wiki メモおじさん芦刈です。
停電で mongodb の一部データが破損した上、Node.js のバージョン管理ミスで自宅のローカルPCに導入していた GROWI が動かなくなってしまいました。
そこで今回は可能な限りデータをサルベージして docker 上に再構築した GROWI へと移し替えます。

データのサルベージ

幸い一部を除いて mongodump が通ったので、まず mogodb から可能な限りデータをダンプします。

$ mongodump -d growi -c [コレクション名] -o [バックアップ先フォルダ]

growi データベースの中には17のコレクションがありますが、重要なのは下記です。
特に revisions は記事そのものを保存しているので、ここが復旧できないとアウトです。
データベースのみ指定して通るようだったら、c オプションによる[コレクション名]の指定はいりません。

[添付ファイル、画像類]
attachmentFiles.chunks
attachmentFiles.files
attachments

[記事につけたコメント]
comments

[記事関連]
pages
revisions

GROWI の再構築とデータのリストア

docker はDocker Desktop for windows を利用します。
WSL2の登場で、Windows でも docker が使いやすくなっていいですね。

GROWI のインストール自体は下記公式サイトの通り実施しました。

docs.growi.org

コンテナの起動が終わったら、mongodb が動いているコンテナに入って適当にフォルダを作り、ダンプファイルをそのフォルダにコピーします。

$ docker exec -i -t growi_mongo_1 bash
# mkdir work
# exit
$ docker cp [バックアップ先フォルダ] growi_mongo_1:/work

コピーが終わったらコンテナ内からデータのリストアを実行します。
この時点で ParserConsumer.BodyBSON でエラーが出る場合は、bson ファイルからそれっぽい個所を削ってください。

$ docker exec -i -t growi_mongo_1 bash
# cd work
# cd [バックアップ先フォルダ]
# mongorestore -d growi -c [コレクション名]

データのメンテナンス

リストアが終わったら壊れているデータを取り除きます。
記事本体は revisions.body に、コメント本体は comments.comment に保存されています。
下記コマンドでざっくり文字化けしてる記事を見つけて削除します。

# mongo
> use growi
> db.revisions.find({},{_id:1,body:1})
> db.comments.find({},{_id:1,comment:1})
> db.[コレクション名].remove({_id:[文字化けしてる記事のID]})

これでほとんど終わりですが、記事を非公開にしていた場合、下記のようにForbidden "Browsing of this page is restricted" と表示されて記事が見れません。

f:id:tashi_monex:20210607220242p:plain

適当なユーザを作成し、users コレクションをいじって非公開記事と id を合わせる、または revisions コレクション内の記事の所有者 id 自体を既存のユーザの id に置き換えると書いてあるものもありますが、pages コレクションの grant を 1 に設定するだけでいいです。
記事自体は path パラメータから探してください。
このとき、grant に設定する値にクォーテーションやダブルクォーテーションをつけて 文字列型にしてしまうとなぜか pages コレクションから該当レコードが消えてしまい、GROWI 上からも参照できなくなります。注意。

> db.pages.find({path:"[growi 内で表示されている記事のパス(日本語含む)]"})
> db.pages.update({_id:[記事のID]}, {$set:{grant:1}})

また、再度非公開にする場合は記事の編集から公開範囲を「自分のみ」にしてしまえば大丈夫だと思います。

おわりに

いにしえの時代と違い、今では EvernoteやNotion、開発に限って言えば Github wiki など、数多くのメモアプリ、共同編集サイトが存在します。
そんな中でも個人で使う分には Markdown に対応しており、機能過多でなく、開発関連以外のメモを残す先として GROWI が一番熱いと個人的には感じてます。
企業 wiki としては confluence なんかが有名ですが、特にプラグイン導入無しで Markdown、drow.io に対応していることと、表が使いやすく今まで Excel で管理していたものをサクッとコピペで持ってこれるのもいい感じですよと軽く布教して、今回は締めといたします。
f:id:tashi_monex:20210607220548p:plain