ホビー用途の mLab でリモートバックアップする
環境
- MongoDB 3.2.11
- dbxcli 1.4.0
- heroku-toolbelt 3.43.15
- heroku-buildpack-mongodb Rev. 59b9e8d
- heroku-buildpack-dbxcli Rev. d67845a
モチベーション
ホビー用途の Heroku アプリで mLab アドオンを Sandbox プランで利用している。
mLab の DB のバックアップは Sandbox プランでは提供されないので、リモートバックアップを設定したい。
ホビー用途なので、できればお金をかけない範囲で行いたい。
heroku-buildpack-mongodb
Heroku の buildpack に MongoDB のバイナリを使えるようにする heroku-buildpack-mongodb があるので、これを使って Heroku Scheduler で mongodump を呼び出せば、バックアップは取れそうである。
ストレージ
問題はストレージをどうするかである。
普通に考えたら S3 だが、ホビー用途で AWS はあまり使いたくない。IAM や MFA など、考えることが多いためだ。
そこで Dropbox を利用することを考えた。
dbxcli というワンバイナリで Dropbox を操作できるツールを Heroku Scheduler から使えれば良さそうだ。
heroku-buildpack-dbxcli
ということで heroku-buildpack-dbxcli という Buildpack を作った。
この Buildpack を使えば、dbxcli を Heroku 上から簡単に使うことができる。
Heroku 設定
まずは以下のような backup.sh を作って git commit しておく。
#!/bin/sh # backup xxx $ mongodump -h xxx.mongolab.com --port xxx -d heroku_appxxx -u heroku_appxxx -p xxx -o xxx_dump --excludeCollection=system.users # archive $ tar cvzf xxx_dump.tgz xxx_dump # upload to Dropbox $ dbxcli put xxx_dump.tgz Backups/xxx_dump.tgz
次にその Git リポジトリを Heroku に push する。
$ heroku create --buildpack http://github.com/goodeggs/heroku-buildpack-mongodb.git $ heroku buildpacks:add --index 2 http://github.com/mallowlabs/heroku-buildpack-dbxcli.git $ heroku config:add DROPBOX_AUTH_TOKEN=<your token> $ git push heroku master
Dropbox のトークンは、手元で dbxcli で一度ログインして ~/.config/dbxcli/auth.json の内容を見て取得する(ちょっとかっこ悪い)。
あとは backup.sh を Heroku Scheduler から呼び出せば、Dropbox に mongodump の結果が保存されるようになる。
まとめ
- dbxcli は便利!
- Heroku Buildpacks も便利!