DBのデータが飛んだので先日書いたReactについての記事は下書きから復元した。

原因はCoreOSが自動アップデートしたため、Postgresを動かしていたDockerコンテナが停止してしまったためだ。

実は先日こっそりとブログのサーバーをherokuからVPSに移動していた (Dockerで運用してみたかったのだ)。OSはCoreOSを使いホスティングはVultrを選択した。

移行の際、データベースもDockerで動かすことにしていた。PostgreSQLでデータベースコンテナを作成していたのだけれど、バックアップの仕組みはつい後回しにしていたのだ。

しかし間の悪いことについ昨日CoreOS(stable)のアップデートが入ってしまった。自分は知らずに運用していたのだがCoreOSはOSアップデートを自動で適用し、デフォルトだとそのまま再起動してしまう。そのためデータベースもコンテナごと落ちてしまいデータが飛んでしまったのだ。自動アップデート&OS再起動は、Immutableなコンテナを分散して運用する前提での設定だと思うのだがシングルホストだとあんまり美味しくない。とはいえ、セキュリティ面では自動アップデート戦略は安心感があるし、個人ブログのホスティングサーバが多少の時間落ちていても大して困らないのでこのままデフォルト設定で行くことにする。

さて再起動しても自動で復旧するにはコンテナのデータを永続化することとコンテナの起動を自動化することの2つが必要となる。取り急ぎ今回は永続化について対応してみた。

永続化といってもpg_dumpで定期的にdumpを取るだけである(自分がPostgresの運用の知識がないのでもっといいやり方があるのかもしれないけど、データ量も少ないしシンプルなので上のやりかたでいく)。dumpファイルはDockerのvolume機能を使ってホストOS上に置くことにする。

とりあえず、現在はdumpするスクリプトだけ作成してある。しかし手動実行はつらいので自動で定期的に回すようにしたい。定期的に実行する手段としては、コンテナの中でcronを回すか、専用のコンテナを作って、fleetで定期的に起動するかのどちらかを考えている。

fleetはCoreOSの主要な機能の一つで、systemdを分散してスケジューリング、実行するためのミドルウェアのようだ。自分はsystemdの知識があまりないのでcronでもよいかと思ったのだが(systemdにタスクスケジューラの機能があることも知らなかった)、せっかくCoreOSを使っているのでfleet/systemd を使う方向で考えたいと思う。

自動復旧のためのコンテナ起動についてもfleetを使えば良さそうだ。

またうまく仕組み化できたら報告したい。