前座
大前提としてユーザーの個人情報を預かるサービスではGoogle Cloud Storageなり S3などしかるべき安全な場所にバックアップを保存すべきです!!(自分が運営している個人開発サービスではもちろんそうしています!)
でも例えば個人ブログだったり、Misskeyの個人用インスタンスだったりはパブリッククラウドのストレージを使うほどの手間とコストを掛ける気にならないんですよね……そもそも自作のサービスであればGCPなりのSDKを引っ張ってきてバッチ処理でバックアップを取ったりしやすいですが、ブログもMisskeyも既存のロジックに気軽に組み込むことができません。
そんなことを言い訳にして従来はバックアップ無し or 定期的にメインのPCに保存スタイルでした。その結果Misskeyインスタンスをぶっ壊して復活しなくなったりしちゃいましたが……
ほしいもの
- 導入のための実装に手間がかからない
- 維持費がかからない
- 冗長性はある程度で十分。本番かバックアップのどちらかが生き残れば良いレベル
- 重度の機密データを扱う訳ではない
と考えていくとラズパイNAS的な感じでできるといいですよね。
rsync
Linuxにはrsyncという大変便利なコマンドがあります。sshで接続していい感じに差分をダウンロードを1コマンドでできます。
事前にサーバーと鍵で認証つなげて.sshのconfigに書いておくことで、
rsync -avhz server-name:/hogehoge/usuyuki_blog_v2/backend/images/ /hogehoge/server_backup/blog.usuyuki.net/blog_img
みたいなコマンド一発で完了です。
差分でダウンロードしてくれるのはもちろん、オプション引数で消えたファイルをローカルでも消すといったミラーリング運用もできるのは強いです。
Linux下暗し
HDDも安くなったとは言えrsync用のサーバーを用意するのはコストが掛かります……ふと考えてみれば、今使っているWindows11にはWSLがあるじゃないですか!
ということで、WSLでcronジョブ経由でrsync叩ければ追加のマシン無しでできますよね!!!
WSLでもできるcron
WSLでもcronできちゃうんです。WSL上でcronのserviceを有効化してWindowsのスタートアップスクリプトをちょっこっと書いて所定の位置に置くだけです。(具体的な方法は他の方が書かれた記事に譲ります)
実際の運用
本体(日常使いのメインPC)
WSLからcronジョブでrsyncを叩く!
ブログ
cronジョブでMySQLをダンプしてtarで固めたファイル+画像ディレクトリがrsyncされる
Misskey
filesディレクトリ+cronジョブでPostgreSQLをダンプしてtarで固めたファイルがrsyncされる
後座
この運用をしている方を他で見たことなかったので記事にしてみました!
個人的な要求としてはこの運用で大満足です。パソコン起動してなければcronジョブ動かない問題はありますが、ミラーリング的な運用な上、個人のデータなので無くなったら困るけど首切られるレベルです。数日に1回動けば良いレベルです。そういった要件には相性がとても良い構成にできました。そしてrsyncは本当に便利なコマンドです。
ただ……1つ致命的な問題があって、MisskeyとメインPCは同じ部屋にあるので火事や自然災害では助かりません。家を失ったらデータも終わりです。