数ヶ月前から、私の作業机の足元ではGitlabが実行環境を転々としながら(といっても大きな入れ替えは1回だけ)動いております。
数日前からようやくまともな環境で安定運用に入った訳ですが、バックアップをアホみたいにとるようにしています。
そのやり方が自分はあまりやらないやり方だったので、ここに控えました。

Gitlabとのお付き合い

みなさんもうご存知かと思いますが(一回も自分の口から言った事ない)、RoboCupの新興SSLチームである、Team ibisに現在身を置いております。
このチームではメカ屋として在籍中な訳ですが、カナダに行ったときのTeam TUPACのWeb周りをやっていたのもあって、チームの開発インフラの運用も兼任中です。(情報屋に転身した訳じゃないよ)
で、Team ibisのGitサーバにGitlabを導入して運用しています。
最初は中古の安い業務用デスクPCにUbuntuの仮想環境を入れ、その上で運用していましたが、
・PCのストレージがRAID1組んでないからデータの冗長性に欠ける
・PCのスペック低すぎて時々メンテ不能になる
・スペックが低いからかレスポンスが悪い
といった感じで、チームの財産を管理するツールとしてはヤバみしかない状況だった訳です。
近いうちに改善しないといけないなーと思いながら激安サーバを探していると、これ本当に中古??って疑うくらいの優良物件が7000円で売られていたので、この機会を逃すわけにはいくまいとポチッとな。
RAIDコントローラ付き&HDDx2台と4GB RAMとPentiumがプリインストールの状態でこれですから、まさに探していた通りの物件でした。
届いて早々にRAID1組んでUbuntuとGitlabインストールして、旧環境で取ったバックアップでデータ移動させて移行完了。
ついでに定期バックアップも・・・と思ったらちょっとトラブったわけです。


理想

  • Gitlabのバックアップを取りたい
  • けどバックアップをサーバのローカルに取ったんじゃ意味がない(サーバが逝ったらバックアップも人質)
  • そのうち分散バックアップにも対応したいから外部のNAS宛にバックアップしたい
  • 定期的に(とりあえず毎日)バックアップ取りたい


現実

  • NASをWebDavでマウントさせたはいいけど、直接そのディレクトリ指定してバックアップ取らせたら許可がないって怒られる
  • サーバ管理用端末からSSH通してGitlabマシンをつついてるから、慣れないCLIでつらい
  • コマンドでCronを編集するのつらい
  • 夜中に1時間単位で実行させてたから眠い(Cronで分単位の時刻を指定する方法を知らなかった)


解決方法

  1. バックアップはとりあえずローカルにとる
  2. バックアップフォルダを丸ごと外部NASにコピる
この一連の動作をするシェルスクリプトを組んで、毎日4:00AMに実行するようにCronに登録する。
でもこのスクリプトは管理者権限でやらないといけないから、普通にユーザのCronに登録するわけにはいかない。(ここがミソ、ユーザのCronではsudoつけると毎日4:00AMにパスワードの入力を求められる、らしい)
というわけでrootのCronに登録して、強引にバックアップとコピーをやってもらう。


やり方

1. スクリプトを書く

セキュリティ面のことを考えるなら、2行くらい直接Cronに書いちゃうほうがいいんでしょうが、同時に実行されると意味がないので、スクリプトを書くことにします。

基本GUIでやりたいので、SSHでのログインは-XオプションをつけてGUI画面をこっちに持ってこれるようにしてログインかけてます。
sudo gedit
でテキストエディタを起動し、次の2行を書き、適当な場所に保存します。(間違っても外部からアクセスできるようなところに置いちゃダメよ)
保存名はなんでもいいのですが、今回は「gitlab_backup.sh」にしたことにします
#!/bin/bash
sudo gitlab-rake gitlab:backup:create
sudo cp -rf /var/opt/gitlab/backups /mnt/XXXX
XXXは/mnt/にマウントしたWebDavとかのストレージのディレクトリです。
あくまでこのスクリプトはgitlabの設定は標準のまま、バックアップ機能だけオンにした(gitlab.rbのバックアップのコメントアウトを外した)状態で実行するためのものです。
バックアップ先をgitlab.rbで変更している場合はコピー元のディレクトリもそれに合わせて指定する必要があります。
gitlab.rbのバックアップ設定については、「gitlab バックアップ」で検索すれば日本語文献もいっぱい出てくるので、そちらを参考にしてください。

2. rootのCronに登録する

sudo crontab -e -u root
でcronに下記を登録します。
0 4 * * * bash /XXX/gitlab_backup.sh
登録後の終了の仕方とかは画面に出てるので、それに従います。

これが終わったら、指定時刻にバックアップの生成を始め、コピーし出すと思います。
当然Gitlabで管理しているソースコードが多ければ多いほど、バックアップを生成するのに時間がかかりますし、コピーするのにも時間がかかります。


今後の展望

ローカルのバックアップを保存している外部NASというのは、QNAP製のNASのことです。
なぜ外付けストレージではなくQNAPなのかと言いますと、「Hybrid Backup Sync」なる機能を使うことで、これまたWebDav経由で他所に置いたQNAPとバックアップを同期させることができるからです。(本当はたまたま使ってたからです)
つまり、分散バックアップ用のQNAP(多分QNAPじゃなくてもいい)を他のチームメンバーの家(例えばオカダの家)において、うちにあるバックアップをオカダ宅と共有しておけば、仮にうちが天変地異に襲われても、ゴジラが来ても、データは生き残るわけです。
あとはGitlabサーバを立てれる人が新たにサーバを立てて、オカダ宅のバックアップから復旧させればデータは助かる、そういう目論見です。
下手なVPSよりバックアップ体制は強い気がしませんか・・・?
まあ、お金かかるのでまだできませんが・・・