GitLabのバックアップとリストア

今回はGitLabのデータ移行について投稿…を考えていたのですが、操作を間違えてGitLabのデータを吹っ飛ばしてしまいました…
なので次からはデータの復旧が出来るように今回はGitLabのバックアップとリストアを試してみたいと思います。

# GitLabのバックアップ
まずは現在のGitLabのプロジェクトとグループを確認します。
今まで使用していたプロジェクトとグループが消えてしまったので、急遽テスト用のプロジェクトとグループを作成しました。
![Git_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/3d732dd9-1104-1be9-43c7-1c79cb4ef033.png)
![Git_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/aaa9785b-4ac8-3c90-0d8c-9b983eeb2182.png)
この状態でバックアップを実施します。
バックアップを行うにはGitLabサーバーで以下のコマンドを実行します。

```
gitlab-rake gitlab:backup:create
```

バックアップが完了すると、```Backup task is done.```と表示されます。
バックアップファイルの格納先はgitlab.rbファイル内の```gitlab_rails['backup_path']```の行に記載されています。
万一に備えてバックアップファイルを退避します。

```
cat /etc/gitlab/gitlab.rb | grep backup_path #バックアップ先のパスを確認する
# バックアップ先のパスがデフォルトのままだった場合
ll /var/opt/gitlab/backups #バックアップファイル名を確認する 
cp /var/opt/gitlab/backups/<バックアップファイル名>　<バックアップファイルの退避場所>
```

実はこれだけではバックアップとしては不完全です。
なぜなら先程のバックアップ取得コマンドは```/etc/gitlab```配下のファイルはバックアップ対象に含まれないからです。
```/etc/gitlab```配下にはGitLabの設定ファイルと認証関連のファイルが格納されています。
こちらは直接ディレクトリごとコピーします。

```
cp -ap /etc/gitlab <バックアップファイルの退避場所>
```

以上でバックアップは完了です。

# リストアテスト前の準備
リストアを実行する前に、リストア前と後の変化を確認するためにプロジェクトとグループを一旦削除します。
管理者エリアへ移動し、プロジェクトの右側にある「削除」ボタンをクリックします。
![Git_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/335c3783-40f7-dd3c-6616-71e99ab3c11d.png)
すると削除の確認画面が表示されますので、指示どおりプロジェクト名を入力し、「プロジェクトの削除」をクリックします。
![Git_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/b7feadc2-c66b-3e64-f876-5a7689e2fc51.png)
同様にグループの削除も実施します。
![Git_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/dfddb18f-6605-7851-0642-688008082cd8.png)
プロジェクトとグループの削除が完了しました。
現在のプロジェクト画面の状態は以下の通りです。
デフォルトで存在しているプロジェクトは念の為残しています。
![Git_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/7ef0f692-f392-9321-83c7-f53986985474.png)
グループも同様です。
デフォルトのグループしか残されていません。
![Git_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/903dc15c-912e-af06-2001-2f10441afe66.png)


# GitLabリストア
リストア前の準備が完了しましたので、リストアを実施します。
まずはGitLabのサービスの中から、```unicorn```と```sidekiq```のみ停止します。

```
gitlab-ctl status #もしも全サービスが「down」になっていれば先に「gitlab-ctl start」を実行する
gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq
gitlab-ctl status #sidekiqが「down」になっていればOK(unicornは表示されませんでした)
```

サービスを停止したら、次はリストアの実行です。
以下のコマンドを実行します。
なお、ここで指定する引数である<バックアップファイル名のGitLabバージョンまでを指定>の箇所は、例えばバックアップファイル名が```1234567890_2021_02_07_13.8.3_gitlab_backup.tar```の場合は```1234567890_2021_02_07_13.8.3```となります。

```
gitlab-rake gitlab:backup:restore <バックアップファイル名のGitLabバージョンまでを指定>
# 正常に完了したら以下のコマンドでサービス再起動する
gitlab-ctl restart
```

リストアがエラーなく完了し、サービス再起動も正常に完了したらリストア自体は終了です。
必要に応じて以下の正常性確認コマンドを実行し、リストア後の状態に問題が無いことを確認します。
判断基準は実行中に「error」のようなメッセージが表示されていなければ恐らく問題無いかと。

```
gitlab-rake gitlab:check SANITIZE=true
```

# リストア後の確認
リストアが無事完了したので、GitLabのweb画面でプロジェクトとグループの存在確認を行います。
GitLabのログイン画面にアクセスし、ログインします。
![Git_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/28fa649c-675a-25c1-3024-9de662343415.png)
ログインするとプロジェクトの画面が表示されます。
以下の通り先程削除したプロジェクトが表示されています。
続いてグループの画面へ移動します。
![Git_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/82848c35-d040-0975-1ec4-0498fe9fb7bb.png)
グループも同様に先程削除したグループが存在しています。
これでリストアが正常に出来ていた事が確認できました。
![Git_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/2d8479ad-05f3-2e18-8eff-392aab9e40da.png)

以上で今回の実験？は終了です。
次回こそはもう少し技術的な投稿を行います…