Gitlab自動バックアップにコンフィグを追加する話

Gitlabは毎日バックアップを作成しています。
毎日何時かにcron からバックアップシェルを実行しています。
でも、configは手動で気になった時にコピーしているんですよね。
これも日々のバックアップシェルに含めようかなと思いました。
今回はそのバックアップシェル作成のメモです。

なお、Gitlab本体のバックアップ関係は前回記事にて書いています

成果物

はじめに成果物をあげておきます。
ファイルは/usr/local/bin/gitlab_config_backupとして保存しました。

#!/bin/sh
cp /etc/gitlab/gitlab.rb /mnt/raid/backups/gitlab/config/gitlab.rb
cp /etc/gitlab/gitlab.rb /mnt/raid/backups/gitlab/config/gitlab_`date +%Y%m%d%H%M%S`.rb

# 世代管理
tgt=`ls -1 /mnt/raid/backups/gitlab/config/gitlab_*.rb|wc -l`
if [ $tgt -gt 13 ];
then
  ls -1tr /mnt/raid/backups/gitlab/config/gitlab_*.rb|head -1|xargs rm
fi

基本バックアップは単純コピーです

コンフィグファイルのバックアップはシンプルにファイルをコピー(cp)で終わりです。

cp /etc/gitlab/gitlab.rb /mnt/raid/backups/gitlab/config/gitlab.rb
cp /etc/gitlab/gitlab.rb /mnt/raid/backups/gitlab/config/gitlab_`date +%Y%m%d%H%M%S`.rb

はい、二つあるのがポイントです。
最新をgitlab.rbとして保存して、各日ごとにgitlab_202211241400.rbとか書式で保存します。

出来上がりファイルはこんな感じです

root@gitlab:~# ls -1 /mnt/raid/backups/gitlab/config/gitlab_*.rb
/mnt/raid/backups/gitlab/config/gitlab_20221124135239.rb
/mnt/raid/backups/gitlab/config/gitlab_20221124135445.rb
/mnt/raid/backups/gitlab/config/gitlab_20221124135715.rb
/mnt/raid/backups/gitlab/config/gitlab_20221124135844.rb

世代管理する

はい、1つ目の最新情報はいくらコピーしても問題がありません。
しかし、日付をつけているコンフィグファイルはコピーを続けるとどんどん増えます。
それを防ぐのが世代管理です。

今回は… なんとなく13代を残す様にしました。
理由としては… 現在、gitlab本体のバックアップが13代だったからですね。
具体的なgitlab本体のバックアップはgitlab.rbに値は指定されています

gitlab_rails['backup_keep_time'] = 604800

だから、1週間です。しかし、この値はバックアップファイルの生存時間なので同一日にバックアップをいっぱいするとファイルは増えていきます。ファイルのバックアップをした日が一週間を超えると削除するという設定です。時間管理はめんどくさいので今回は多めに7代ではなく13代としました。

世代管理の該当箇所はこんな感じです

# 世代管理
tgt=`ls -1 /mnt/raid/backups/gitlab/config/gitlab_*.rb|wc -l`
if [ $tgt -gt 13 ];
then
  ls -1tr /mnt/raid/backups/gitlab/config/gitlab_*.rb|head -1|xargs rm
fi

難しいことはありませんが、

  • lsを行単位で出力してwcで行を抽出した結果をファイル数としましてtgtに入れます。
  • それが13以上(gt)だったら、
  • lsで表示される最初のファイル(多分一番古いファイルが頭に出るはず)を削除
  • という処理ですね

あとは本体バックアップシェルに呼び出しを追加する

ファイルのバックアップシェルが出来上がりですのでcronが定期的に呼び出しているバックアップ実行シェル gitlab_backupに今回追加したコンフィグバックアップシェル gitlab_config_backupを呼び出せばバックアップのタイミングでコンフィグもバックアップとってくれます。

#!/bin/sh
gitlab-ctl stop unicorn
gitlab-ctl stop puma
gitlab-ctl stop sidekiq

gitlab-rake gitlab:backup:create CRON=1

/usr/local/bin/gitlab_config_backup

gitlab-ctl start unicorn
gitlab-ctl start puma
gitlab-ctl start sidekiq

終いに

今回はGitlabのコンフィグのバックアップを定期的に行うを行ってみました。

ま、書いてなんですが… 自分が変更しないとファイルに差分が生まれないので同じファイルが作成されていくだけだろうねw

応用としては世代管理をファイルの差がなければ保存しないとかするとか…
git使うとかも考えてもいいかななんて思いました。

作成途中で引っかかった問題

sudoのlsって*が使えない…

はい、単純なのですがパーミッションが別のところにバックアップをとっているとディレクトリ内にアクセスするにはsudoを使いますが… *を使うと動きません…

wataru@gitlab:~$ sudo ls /mnt/raid/backups/gitlab/config/gitlab*
ls: cannot access '/mnt/raid/backups/gitlab/config/gitlab*': No such file or directory

シェルを作っているとこの辺りはめんどくさいのでsudo -iでrootで動かしましょう

wataru@gitlab:~$ sudo -i
root@gitlab:~# ls /mnt/raid/backups/gitlab/config/gitlab*
/mnt/raid/backups/gitlab/config/gitlab_20221124135844.rb  /mnt/raid/backups/gitlab/config/gitlab_20221124140430.rb  /mnt/raid/backups/gitlab/config/gitlab_20221124140452.rb  /mnt/raid/backups/gitlab/config/gitlab_20221124140539.rb  /mnt/raid/backups/gitlab/config/gitlab.rb