GitLabリポジトリをバックアップから復元する

システム紹介と故障モードの検討

現在、GitLabをRaspberryPi4B上で運用していますが、故障率が高そうな構成なので、故障時の復旧手順を事前に確認しておきます。

関連記事一覧

故障モード

以前の記事でGitLabのリポジトリファイル、バックアップファイル保存先をUSBメモリ上に変更しました。そのため、発生する可能性が高い故障モードとしては、下記3種類と考えます。

  • RaspberryPiOSが入っているMicroSDの故障
  • リポジトリ保存用USBメモリの故障
  • バックアップ保存用USBメモリの故障

この3種類の故障モードについて、それぞれ対応手順を確認しておきます。

RaspberryPiOSが入っているMicroSDの故障対応

。まずはじめに、最も故障率が高いと考えるMicroSDの故障です。これは、停電等でいきなり電源が落ちた場合等に発生します。

必要な事前準備

まず前提条件ですが、MicroSDの故障に対しては、バックアップとしてMicroSDのイメージファイルを作成しておきます。このイメージ作成はGitLabの環境構築と保存先設定完了後にMicroSDをラズパイから取り出してコピー作業を行います。

イメージファイルの作成方法

MicroSDからイメージ作成は「Win32 Disk Imager」を使用して行います。

イメージファイルの書き込み

ここからが故障後の対応になります。イメージ作成時に使用した「Win32 Disk Imager」を使用して新しいMicroSDにイメージを書き込みます。
原因はわかりませんが、microSDカードが書き込み禁止状態になってしまう場合があるようです。その時はコマンドプロンプトから以下のコマンドで書き込み可能にできます。

>diskpart

DISKPART> list disk

ディスク      状態        サイズ   空き   ダイナ GPT
###                                       ミック
-----------   ---------   -----   -----   ----  ----
ディスク0     オンライン     465GB  2184 MB           *
ディスク1     オンライン     894GB  1024 KB           *
ディスク2     オンライン      29GB  3072 MB           *

DISKPART> select disk 2

ディスク2が選択されました。

DISKPART> attributes disk clear readonly

ディスク属性が正しく消去されました。

MicroSDを交換するだけで復旧する・・・はず?

今回は検証のためにGitLab構築直後のOSイメージをMicroSDに書き込み、交換してみます。以前の記事で紹介した通り、リポジトリの保存先をUSBメモリに変更しているのでデータ自体は失われていませんが、起動後にログインしてみると保存しているはずのリポジトリが表示されていません。

MicroSDの交換だけでは復旧しない

GitLab構築直後のMicroSDで復旧させただけでは、リポジトリは空の状態になっていました。これはデータベースの保存先をデフォルトの状態から変更していないためです。実は構築作業を行う際にデータベースの保存先も変更しようとしましたが、設定変更後の"reconfigure"実行でエラーとなるため断念していました。

完全復旧のためにバックアップファイルからレストアする

データベースまで完全復旧させるためには、バックアップからの復元が必要になります。以下その手順です。

$ sudo gitlab-ctl stop puma
ok: down: puma 0s, normally up
$ sudo gitlab-ctl stop sidekiq
ok: down: sidekiq 0s, normally up
$ sudo gitlab-rake gitlab:backup:restore BACKUP=1699576315_2023_11_10_16.2.4

上記コマンド実行後、しばらく時間が必要です。途中、2度yes/noの選択で続行するか聞かれるのでyesを入力します。

レストア準備の注意点

上記コマンドでは、GitLabのすべてを停止せずに"puma"と"sidekiq"のみ停止しています。すべてを停止してもレストアコマンド自体は実行出来たのですが、途中でエラーとなりました。

バックアップファイル選択時の注意点

"BACKUP=***"部分でファイルを選択しますが、ファイル名指定時に注意すべき点があります。バックアップファイルは名は"[時刻、日付]_[GitLabバージョン]_gitlab_backup.tar"となっていますが、レストアコマンドで指定する場合、"_gitlab_backup.tar"部分は入力しません。この部分までつけるとエラーになります。

再起動で復旧完了

レストア完了後、GitLabシステムをスタートして復旧完了です。無事、すべてのリポジトリが復旧していました。

$ sudo gitlab-ctl start
ok: run: alertmanager: (pid 13110) 582s
ok: run: gitaly: (pid 13120) 582s
ok: run: gitlab-exporter: (pid 13139) 581s
ok: run: gitlab-kas: (pid 19050) 0s
ok: run: gitlab-workhorse: (pid 13194) 578s
ok: run: logrotate: (pid 13205) 578s
ok: run: nginx: (pid 13211) 578s
ok: run: node-exporter: (pid 13228) 577s
ok: run: postgres-exporter: (pid 13234) 577s
ok: run: postgresql: (pid 13250) 576s
ok: run: prometheus: (pid 19031) 2s
ok: run: puma: (pid 19068) 0s
ok: run: redis: (pid 13284) 575s
ok: run: redis-exporter: (pid 13290) 575s
ok: run: sidekiq: (pid 19075) 1s

 

リポジトリ保存用USBメモリの故障対応

次はリポジトリ保存用のUSBメモリの故障対応です。

新しいUSBメモリのフォーマット

リポジトリの保存先変更の時と同様に、GitLab関連のストレージはext4形式に変更する必要があります。フォーマット作業はラズパイ上で行います。
フォーマット作業はディスク情報を取得してから、以下の通り行います。

# fdisk -l
...
Disk /dev/sdd: 58.2 GiB, 62474158080 bytes, 122019840 sectors
Disk model: TransMemory
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xd1845d31

Device     Boot Start       End   Sectors  Size Id Type
/dev/sdd1        8064 122019839 122011776 58.2G  c W95 FAT32 (LBA)
# mkfs.ext4 /dev/sdd
mke2fs 1.44.5 (15-Dec-2018)
Found a dos partition table in /dev/sdd
Proceed anyway? (y,N) y
Creating filesystem with 15252480 4k blocks and 3817472 inodes
Filesystem UUID: aee35ada-3869-4aa2-b09c-f4cab4ecf560
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424

Allocating group tables: done
Writing inode tables: done
Creating journal (65536 blocks): done
Writing superblocks and filesystem accounting information: done

マウントするUSBメモリの変更

次に故障後の対応としてマウントするUSBメモリを変更します。先ほどフォーマットしたUSBメモリをリポジト保存先に変更するので、何も書き込まれていない状態になります。

# umount /mnt/usb_flash1
# mount /dev/sdd /mnt/usb_flash1
# df -l
...
/dev/sdd          59789212     53272   56669060    1% /mnt/usb_flash1
...

保存先フォルダの作成

USBメモリは空の状態なので、GitLab設定ファイルで指定しているフォルダを作成します。フォルダは所有者設定もしておく必要があります。

# cd /mnt/usb_flash1
# mkdir ./gitlab
# cd ./gitlab
# mkdir LargeObjectDir
# mkdir RepositoriesDir
# mkdir UserAttachments
# cd ..
# chown -R git:git ./gitlab

バックアップファイルからリポジトリ復元で完了?

リポジトリの保存先変更の時と同様に、"puma","sidekiq"のみ停止してから、レストアコマンドを実行しましたが、途中でエラーとなり、完了しませんでした。

# gitlab-ctl stop puma
ok: down: puma 0s, normally up
# gitlab-ctl stop sidekiq
ok: down: sidekiq 0s, normally up
# gitlab-rake gitlab:backup:restore BACKUP=1699576315_2023_11_10_16.2.4

GitLabを停止して再構築する

一旦すべてのデーモンを停止して、GitLabを再構築してから再度、レストアコマンドを実行します。

# gitlab-ctl stop
...
# gitlab-ctl reconfigure
...
# gitlab-ctl start
...
# gitlab-ctl stop puma
...
# gitlab-ctl stop sidekeq
...
gitlab-rake gitlab:backup:restore BACKUP=1699576315_2023_11_10_16.2.4
...

これでレストアが完了したようです。再度、GitLabを起動してリポジトリを確認して、復元されていることを確認しました。

# gitlab-ctl start
ok: run: alertmanager: (pid 8517) 346s
ok: run: gitaly: (pid 8528) 346s
ok: run: gitlab-exporter: (pid 8546) 346s
ok: run: gitlab-kas: (pid 11763) 0s
ok: run: gitlab-workhorse: (pid 8635) 341s
ok: run: logrotate: (pid 8643) 341s
ok: run: nginx: (pid 8646) 341s
ok: run: node-exporter: (pid 8651) 340s
ok: run: postgres-exporter: (pid 8665) 340s
ok: run: postgresql: (pid 8674) 340s
ok: run: prometheus: (pid 11744) 2s
ok: run: puma: (pid 11781) 1s
ok: run: redis: (pid 8709) 339s
ok: run: redis-exporter: (pid 8723) 339s
ok: run: sidekiq: (pid 11788) 0s

再起動時の自動マウント登録

最後にfstabに登録しているUSBメモリのUUIDを変更します。これで再起動時の自動マウント設定も完了します。まずはUUIDを確認しておきます。

# blkid /dev/sdb
/dev/sdb: UUID="aee35ada-3869-4aa2-b09c-f4cab4ecf560" TYPE="ext4"

次にfstabの内容を書き換えます。

# vim /etc/fstab

変更内容は"/mnt/usb_flash1"のマウント設定をコメントアウトして、新たに使用するUSBメモリに設定し直しています。

proc            /proc           proc    defaults          0       0
...
#UUID="07377f74-3553-4c93-8763-74ab6163b9dc" /mnt/usb_flash1    ext4    defaults,nofail 0       0
UUID="aee35ada-3869-4aa2-b09c-f4cab4ecf560" /mnt/usb_flash1    ext4    defaults,nofail 0   0
UUID="92153c10-4551-47fd-b93b-cc46dd86dcc5" /mnt/usb_flash2 ext4    defaults,nofail 0   0
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that

これで再起動後でもGitLabが問題なく立ち上がることを確認しました。

バックアップ保存用USBメモリの故障

最後にバックアップ保存用USBメモリが故障した場合を想定します。

デバイスのフォーマットは省略

交換用USBメモリをext4にフォーマットする作業はリポジトリ用USB故障の復旧手順と同じなので省略します。

マウントするUSBメモリの変更

"/mnt/usb_flash2"にマウントするUSBメモリを変更します。

# umount /mnt/usb_flash2
# mount /dev/sdc /mnt/usb_flash2

バックアップ用フォルダの作成

元々使用していたUSBメモリと同様のフォルダを作成しておきます。所有者は"git"としておく必要があります。

# cd /mnt/usb_flash2
# mkdir ./gitlab
# cd /mnt/usb_flash2
# mkdir ./BuckupData
# cd ..
# chown -R git:git ./gitlab

GitLabの再構築

ここまで完了したら、GitLabのデーモンを停止して再構築作業を行います。

# gitlab-ctl stop 
... 
# gitlab-ctl reconfigure 
... 
# gitlab-ctl start 
...

検証用にバックアップの作成

無事に起動を確認したら検証用としてバックアップファイルを作成してみます。完全に起動してから実施するために、ブラウザでHTTP502が解除されるまで待ってから、以下のコマンドを入力します。

# gitlab-backup create

処理終了後にバックアップファイルが作成されたら完了です。さらにfstabで自動マウント設定が必要ですが、リポジトリ保存用USBと同じ作業なので省略します。

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

GitLabのバックアップコマンドは設定ファイルのバックアップが行われないので、手動で設定ファイルのバックアップを作成しておきます。

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

以上でバックアップ用USBの交換作業は終了です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

fourteen + 12 =