2022年11月5日土曜日

GitLabバックアップ・リストア手順

自宅環境のGitLabでは、自分が作成したAnsibleのPlaybookやPythonスクリプトだけだなく、各種技術情報などをWikiで管理するようにしており、GitLabで保存されているデータの重要性が高くなってきた。

そのため、万が一自宅環境のディスク障害などに備え、バックアップを取得することにした。幸い、GitLabではバックアップ・リストアをするためのコマンドが標準で用意されている。

今回は、GitLabの機能を用いてバックアップ・リストアを行う手順を記載する。

環境

GitLabのOSはAlmaLinuxを用いる。ただし、Red Hat系のディストリビューションであるCentOSやRocky Linuxなどでも同様の手順で対応できると想定する。

  • OS : AlmaLinux 8.5
  • GitLab : 15.3.4

また、本記事では同一サーバに対してリストアすることを想定するが、バックアップファイルを用いて別のサーバに対してリストアすることもできるようだ。その手順については、別途検証した際に公開することにしたい。

バックアップ

1. `バックアップ取得

GitLabのバックアップは、gitlab-rake gitlab:backup:createコマンドを実行するだけで完了する。本コマンドは特にGitLabのサービス停止などは不要となる。

Backup [バックアップ名] is done.と表示されれば問題なくバックアップは完了となる。

# gitlab-rake gitlab:backup:create
2022-07-29 21:24:15 +0900 -- Dumping database ...
Dumping PostgreSQL database gitlabhq_production ... [DONE]
2022-07-29 21:24:19 +0900 -- Dumping database ... done
2022-07-29 21:24:19 +0900 -- Dumping repositories ...
{"command":"create","gl_project_path":"gitlab-instance-870ba0ef.wiki","level":"info","msg":"started create","relative_path":"@groups/d4/73/d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35.wiki.git","storage_name":"default","time":"2022-07-29T12:24:19.686Z"}

~(中略)~

2022-07-29 21:24:20 +0900 -- Deleting tar staging files ... done
2022-07-29 21:24:20 +0900 -- Deleting backups/tmp ...
2022-07-29 21:24:20 +0900 -- Deleting backups/tmp ... done
2022-07-29 21:24:20 +0900 -- Warning: Your gitlab.rb and gitlab-secrets.json files contain sensitive data
and are not included in this backup. You will need these files to restore a backup.
Please back them up manually.
2022-07-29 21:24:20 +0900 -- Backup 1659097455_2022_07_29_15.1.2-ee is done.

2. バックアップファイルの確認

バックアップファイルが/var/opt/gitlab/backupsに生成されていることを確認する。バックアップファイルは[時間]_[月]_[日]_[バージョン]_gitlab_backup.tarという名前で生成される。

# ls -l /var/opt/gitlab/backups
-rw------- 1 git git 25518080 10月 29 01:30 1666974616_2022_10_29_15.3.4-ee_gitlab_backup.tar

3. 設定ファイルのバックアップ

バックアップファイルにはGitLabの設定ファイルは含まれないため、以下ファイルを任意の場所にバックアップしておく。

  • /etc/gitlab/gitlab.rb
  • /etc/gitlab/gitlab-secrets.json

容量はそこまで大きくないことから、tarで固めてディレクトリ全体をバックアップしても問題ない。

# tar zcvf gitlab_config_20221029.tgz /etc/gitlab
tar: メンバ名から先頭の `/' を取り除きます
/etc/gitlab/
/etc/gitlab/gitlab-secrets.json
/etc/gitlab/trusted-certs/
/etc/gitlab/trusted-certs/public.crt
/etc/gitlab/trusted-certs/6b8ba5bf.0
/etc/gitlab/gitlab.rb

以上でGitLabのバックアップは完了となる。

GitLabリストア手順

1. 前提条件確認

前提として、バックアップファイルは/var/opt/gitlab/backupsに配置する。また、バックアップファイルとリストア先のGitLabのバージョンは一致させることが必要となる。

今回は以下の通り、バックアップファイルとリストア先のGitLabのバージョンは15.3.4で一致していることを確認した。

# ls -l /var/opt/gitlab/backups
-rw------- 1 git git 25518080 10月 29 01:30 1666974616_2022_10_29_15.3.4-ee_gitlab_backup.tar

# rpm -qa | grep gitlab
gitlab-ee-15.3.4-ee.0.el8.x86_64

また、今回はリストアされたことを確認できるよう、tuser001/linux_configというプロジェクトを事前に削除し、リストアすることで復旧することを確認する。

2. サービス停止

GitLabを構成するサービスのうち、pumasidekiqを停止する。

# gitlab-ctl status
run: alertmanager: (pid 3127640) 1418103s; run: log: (pid 1528) 3140631s
run: gitaly: (pid 3127689) 1418101s; run: log: (pid 1504) 3140631s
run: gitlab-exporter: (pid 3127638) 1418103s; run: log: (pid 1526) 3140631s

~(中略)~

run: sidekiq: (pid 3127807) 1418099s; run: log: (pid 1496) 3140631s
# gitlab-ctl stop puma
ok: down: puma: 0s, normally up
# gitlab-ctl stop sidekiq
ok: down: sidekiq: 0s, normally up
# gitlab-ctl status
run: alertmanager: (pid 3127640) 1418465s; run: log: (pid 1528) 3140993s
run: gitaly: (pid 3127689) 1418463s; run: log: (pid 1504) 3140993s
run: gitlab-exporter: (pid 3127638) 1418465s; run: log: (pid 1526) 3140993s

~(中略)~

down: puma: 17s, normally up; run: log: (pid 1495) 3140993s
~(中略)~
down: sidekiq: 8s, normally up; run: log: (pid 1496) 3140993s

3. リストア

リストアは、gitlab-rake gitlab:backup:restoreを利用する。この際にバックアップファイル名を引数として指定するが、ファイル名の拡張子(.tar)は不要となるので注意する。途中2回ほど継続しても問題ないか確認を求められるので、yesを選択して先に進めよう。

Restore task is done.と表示されれば問題なくリストアは完了となる。

# gitlab-rake gitlab:backup:restore BACKUP=1666974616_2022_10_29_15.3.4-ee
2022-08-05 22:53:54 +0900 -- Unpacking backup ... 
2022-08-05 22:53:54 +0900 -- Unpacking backup ... done
2022-08-05 22:53:54 +0900 -- Restoring database ... 
2022-08-05 22:53:54 +0900 -- Be sure to stop Puma, Sidekiq, and any other process that
connects to the database before proceeding. For Omnibus
installs, see the following link for more information:
https://docs.gitlab.com/ee/raketasks/backup_restore.html#restore-for-omnibus-gitlab-installations

Before restoring the database, we will remove all existing
tables to avoid future upgrade problems. Be aware that if you have
custom tables in the GitLab database these tables and all data will be
removed.

Do you want to continue (yes/no)? yes ★yesを入力
Removing all tables. Press `Ctrl-C` within 5 seconds to abort
2022-08-05 13:54:12 UTC -- Cleaning the database ... 
2022-08-05 13:54:14 UTC -- done
Restoring PostgreSQL database gitlabhq_production ... ERROR:  must be owner of extension pg_trgm
ERROR:  must be owner of extension btree_gist
ERROR:  must be owner of extension btree_gist
ERROR:  must be owner of extension pg_trgm

~(中略)~

2022-08-05 22:54:23 +0900 -- Restoring terraform states ... done
2022-08-05 22:54:23 +0900 -- Restoring packages ...
2022-08-05 22:54:23 +0900 -- Restoring packages ... done
This task will now rebuild the authorized_keys file.
You will lose any data stored in the authorized_keys file.
Do you want to continue (yes/no)? yes ★yesを入力

2022-08-05 22:54:49 +0900 -- Deleting tar staging files ...
2022-08-05 22:54:49 +0900 -- Cleaning up /var/opt/gitlab/backups/backup_information.yml

~(中略)~

2022-08-05 22:54:49 +0900 -- Warning: Your gitlab.rb and gitlab-secrets.json files contain sensitive data
and are not included in this backup. You will need to restore these files manually.
2022-08-05 22:54:49 +0900 -- Restore task is done.

4. 設定ファイルを再配置

事前にバックアップしていた以下ファイルを/etc/gitlabに再配置する。

  • /etc/gitlab/gitlab.rb
  • /etc/gitlab/gitlab-secrets.json

5. リストア後の再設定とサービス起動

以下コマンドを実行し、GitLabの再設定、サービス再起動を行う。

# gitlab-ctl reconfigure
# gitlab-ctl restart

再起動後にサービスがすべて起動していることを確認しよう。すべてのサービスがrunと表示されれば問題ない。

# gitlab-ctl status
run: alertmanager: (pid 1556185) 70s; run: log: (pid 1528) 3141350s
run: gitaly: (pid 3127689) 1418820s, got TERM; run: log: (pid 1504) 3141350s
run: gitlab-exporter: (pid 1556211) 38s; run: log: (pid 1526) 3141350s

~(中略)~

run: sidekiq: (pid 1556320) 33s; run: log: (pid 1496) 3141350s

6. リストア後のGitLabの健全性チェック

最後にリストア後のGitLabの健全性チェックをgitlab-rake gitlab:checkコマンドで実施する。

各種チェックが実行されるが、すべてOKとなっていれば問題ない。

# gitlab-rake gitlab:check SANITIZE=true
Checking GitLab subtasks ...

Checking GitLab Shell ...

GitLab Shell: ... GitLab Shell version >= 14.10.0 ? ... OK (14.10.0)
Running /opt/gitlab/embedded/service/gitlab-shell/bin/check
Internal API available: OK
Redis available via internal API: OK
gitlab-shell self-check successful

~(中略)~

Checking GitLab App ... Finished

Checking GitLab subtasks ... Finished

7. 削除したデータ復旧の確認

リストア後、事前に削除したtuser001/linux_configのプロジェクトが復旧できていることが確認できた。

以上でGitLabのリストアは完了となる。

参考

0 件のコメント:

コメントを投稿

人気の投稿