ホビー用途の 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 も便利!