それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

gitlab のバックアップ・リストア+ダウングレード・失敗リカバリ

gitlab のバックアップ・リストア+ダウングレード・失敗リカバリ

gitlab のバックアップ

sudo gitlab-ctl backup-etc
sudo gitlab-backup create

gitlab のデータ

omnibus gitlab は次の場所にデータを持っている。 - /var/opt/gitlab - /var/log/gitlab - /opt/gitlab - /etc/gitlab

パス 内容
/var/opt/gitlab gitlabのデータ
/var/opt/gitlab/postgresql gitlabのデータベース
/var/opt/gitlab/git-data gitレポジトリ
/opt/gitlab gitlab自体のソース
/etc/gitlab/gitlab-secrets.json 暗号化キー
/etc/gitlab/gitlab.rb 設定
/var/log ログ関連

gitlabのデータ は、レポジトリ・PostgreSQLデータベース、redis 、バックアップ、 LFSなど、ユーザーデータが入ってる。

バックアップは暗号化、/etc/gitlab が必要

データベースなどgitlabのデータは暗号化されている。

バックアップも、暗号化された状態が取得されるので、読込には/etc/gitlabにある暗号化キーが必要になる。

暗号化キーは重要

バックアップ:フル

専用コマンドを使う

sudo gitlab-backup create

バックアップに名前を付ける

sudo gitlab-backup create BACKUP=dump

バックアップ:自動生成

バックアップは自動生成されることがある。 バックアップの名前は、次のようになっていた。

 # タイムスタンプ・日付・gitlabバージョン
 1661923506_2022_08_31_15.3.1_gitlab_backup.tar
 1661893331_2022_08_31_15.2.2_gitlab_backup.tar

バージョンアップ時など自動バックアップが取られることがある。 自動バックアップはデータベースについて取られる。

レポジトリなどの「git」に関するファイルはバージョンが取られてない。

自動バックアップはレポジトリがなかったりするので、過信は油断と同じ。

次の出力は、私のGitlabのバックアップのいちんだが、ファイルサイズが小さいものが、アップデートに取得されたものである。

ファイルサイズが小さいものをよく見ると、時刻がだいたい近く、同じバージョン名のものがない。 これは、自動アップデートでDBアップデート処理されたタイミングであることを如実に示している。

takuya@:~$ sudo ls -l /var/opt/gitlab/backups/
合計 4644540
-rw------- 1 git git    1034240  2月 26  2022 1645825437_2022_02_26_14.8.0_gitlab_backup.tar
-rw------- 1 git git    1034240  2月 28  2022 1645997098_2022_02_28_14.8.1_gitlab_backup.tar
-rw------- 1 git git    1044480  4月  6 06:58 1649195886_2022_04_06_14.8.2_gitlab_backup.tar
-rw------- 1 git git    1105920  4月 13 06:32 1649799169_2022_04_13_14.9.2_gitlab_backup.tar
-rw------- 1 git git    1105920  4月 23 06:52 1650664328_2022_04_23_14.9.3_gitlab_backup.tar
-rw------- 1 git git    1116160  5月  4 06:15 1651612499_2022_05_04_14.10.0_gitlab_backup.tar
-rw------- 1 git git    1116160  5月  7 06:18 1651871897_2022_05_07_14.10.1_gitlab_backup.tar
-rw------- 1 git git    1116160  5月 21 06:34 1653082489_2022_05_21_14.10.2_gitlab_backup.tar
-rw------- 1 git git    1116160  5月 24 06:09 1653340166_2022_05_24_14.10.3_gitlab_backup.tar
-rw------- 1 git git    1126400  6月  2 06:50 1654120235_2022_06_02_15.0.0_gitlab_backup.tar
-rw------- 1 git git    1126400  6月  7 06:52 1654552318_2022_06_07_15.0.1_gitlab_backup.tar
-rw------- 1 git git    1126400  6月 18 06:07 1655500031_2022_06_18_15.0.2_gitlab_backup.tar
-rw------- 1 git git 2364784640  6月 23 01:59 1655916823_2022_06_23_15.0.3_gitlab_backup.tar
-rw------- 1 git git    1126400  6月 23 23:33 1655994833_2022_06_23_15.0.3_gitlab_backup.tar
-rw------- 1 git git    1136640  6月 24 16:38 1656056322_2022_06_24_15.1.0_gitlab_backup.tar
-rw------- 1 git git    1157120  7月  2 06:09 1656709755_2022_07_02_15.1.0_gitlab_backup.tar
-rw------- 1 git git    1157120  7月  7 06:12 1657141951_2022_07_07_15.1.1_gitlab_backup.tar
-rw------- 1 git git    1167360  7月 20 15:55 1658300112_2022_07_20_15.1.2_gitlab_backup.tar
-rw------- 1 git git    1177600  7月 23 06:39 1658525990_2022_07_23_15.1.3_gitlab_backup.tar
-rw------- 1 git git    1198080  7月 30 06:55 1659131714_2022_07_30_15.2.0_gitlab_backup.tar
-rw------- 1 git git    1198080  8月  2 06:50 1659390611_2022_08_02_15.2.1_gitlab_backup.tar
-rw------- 1 git git    1239040  8月 24 06:34 1661290448_2022_08_24_15.2.2_gitlab_backup.tar
-rw------- 1 git git    1239040  8月 31 06:02 1661893331_2022_08_31_15.2.2_gitlab_backup.tar
-rw------- 1 git git    1239040  8月 31 14:25 1661923506_2022_08_31_15.3.1_gitlab_backup.tar
-rw------- 1 git git 2364989440  9月  2 14:45 1662097438_2022_09_02_15.3.2_gitlab_backup.tar

リストア

バックアップを指定の位置に配置して、リストアコマンド

sudo gitlab-backup restore BACKUP=$NAME

$NAMEのところには、バックアップの名前を付ける。

バックアップは次の箇所にある。

sudo ls -l  /var/opt/gitlab/backups/

バックアップの名前は、次のようになっていた。

 # タイムスタンプ・日付・gitlabバージョン
 1661923506_2022_08_31_15.3.1_gitlab_backup.tar
 1661893331_2022_08_31_15.2.2_gitlab_backup.tar

ただし、バージョンが合わないと、だめ。 バージョンを合わせるためにため、ダウングレードが必要

15.2.2 が必要な例

1661893331_2022_08_31_15.2.2_gitlab_backup.tar

ダウングレード

apt でやる。

sudo apt remove gitlab
sudo apt install gitlab-ce=15.2.2-ce.0
sudo gitlab-ctl reconfigure

https://docs.gitlab.com/ee/update/package/downgrade.html

うっかりpurgeしてしまうと、暗号化キーやレポジトリも消えちゃうかもしれないので注意

ダウングレードの失敗リストアの失敗は、データベースが新しくなってて戻らないことが原因だと思う。

ダウングレード+リストア

データベースを削除するのが確実

DBだけのバックアップがあれば、DBだけ戻せる。

sudo ls -l  /var/opt/gitlab/postgoresql/
sudo mv  /var/opt/gitlab/postgoresql{,.bak}
sudo gitlab-ctl reconfigure
sudo gitlab-ctl restore BACKUP=DB_BACKUP

DBバックアップは、バージョンアップ時に、自動バックアップで生成されてる。

リストアの失敗

リストアが失敗した場合

ダウングレード+リストアを行う。

データベースを削除して新規インストール、暗号化キー(/etc/gitlab)を配置して reconfigure

gitのレポジトリ自体も暗号化されているが、データ自体は、リストアにはあまり関係がないので、そのまま。

レポジトリ全体をバックアップ

/var/opt/gitlab/git-data にレポジトリはある。

でも、暗号化されたデータをバックアップしても使えない。暗号化キーとセットでコマンドを使う。

gitaly-backupを設定しておけば、レポジトリをバックアップを取っておける。

マニュアルでバックアップしたい

データを取得して、バージョンをあわせてリストア。これでいちおうは問題なさそうですよね。実際試してみたが、それで動いたわ。 ただ、Gitlabの仕様変更で今後もこの手段で行けるとは限らない。

バックアップ

sudo rsync -av  /var/log/gitlab/ my_gitlab-var-log/    
sudo rsync -av  /var/opt/gitlab/ my_gitlab-var-opt/    
sudo rsync -av  /etc/gitlab/     my_gitlab-etc/
sudo rsync -av  /opt/gitlab/     my_gitlab-opt/ 

初回インストール / gitlab の初回インストール

multipass launch sample01 -d 20G
sudo apt update && sudo apt upgrade -y
sudo apt-get install -y curl openssh-server ca-certificates tzdata perl
sudo locale-gen --purge "ja_JP.UTF-8"
sudo dpkg-reconfigure --frontend noninteractive locales
sudo apt-get install -y curl openssh-server ca-certificates tzdata perl && \
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash && \
sudo apt-get install gitlab-ce

書き戻し

## 同じバージョンのgitlabを入れる
sudo apt install gitlab-ce=15.2.2-ce.0
## データ戻し
sudo rsync -av  my_gitlab-var-log/ /var/log/gitlab/ 
sudo rsync -av  my_gitlab-var-opt/ /var/opt/gitlab/ 
sudo rsync -av  my_gitlab-etc/     /etc/gitlab/     
sudo rsync -av  my_gitlab-opt/     /opt/gitlab/     
sudo gitlab-ctl reconfigure

書き戻し二失敗した場合は、いったん別ホストでRestoreを試す。

容量に注意

バックアップは、けっこうな量になる。

個人的な見解

github は強すぎるので、競合はもっと頑張ってほしいと思う。

バックアップが壊れたとき、ユーザーやIssueは諦めてるとしても、ソースコードだけは、バックアップ取ってきたいと思う。暗号化されているので、その点だけには注意したいと思います。

ソースコードのバックアップのためにGitlabを使っている場合、Gitlabは多機能すぎるので、他のソフトウェア(gogs / gitea ) を使ってもいいかもしれないし、ベアレポジトリを選択してもいいと思う。そのgithub/gitlab 本当に必要ですか。バックアップのためのGitlabで、さらにバックアップが煩雑になるのはちょっと違う気がするのです。

小規模事業者なら、mattermost やOAuthプロバイダとして動作するので、Gitlabは特に優秀。ただソースコードを保管したい閲覧したい目的だとGitlabはヘビィすぎる気もする。Gogsでいいんじゃないかと思ってきた。