GitLab

Gitlab・GitlabCI/CDサーババックアップ・リストア手順

2023年8月14日



目的

現行のGitlabサーバ(192.168.9.6)の代用として2号機を構築し、gitlab01のバックアップからのリストアを実行します。

環境

– ubuntu 20.04
– IP:192.168.9.7
– DGW:192.168.9.1

事前準備

以下は完了しているものとします。
– docker環境の準備
– docker-composeでgitlabの起動
– docker-composeでgitlabCI/CDの起動

手順

gitlab01(192.168.9.6)にてバックアップを取得する

設定ファイル以外の全データのバックアップ

gitlabコンテナに入り、以下のコマンドを実行してユーザ認証ファイル以外の全データをバックアップします。

# gitlab-rake gitlab:backup:create
2023-08-07 02:28:52 +0000 -- Dumping database ...
Dumping PostgreSQL database gitlabhq_production ... [DONE]
2023-08-07 02:28:57 +0000 -- done
2023-08-07 02:28:57 +0000 -- Dumping repositories ...

# ls -ltr
total 7907184
-rw-r--r-- 1 git git 1157693440 Aug  7 02:30 1691375396_2023_08_07_13.10.2-ee_gitlab_backup.tar★
※バックアップファイルが作成されていること(★)

バックアップファイルをホストOS側へコピーします。

$ docker cp gitlab_web_1:/var/opt/gitlab/backups/1691375396_2023_08_07_13.10.2-ee_gitlab_backup.tar /tmp
設定ファイルのバックアップ

バックアップ対象は以下です。

  • /etc/gitlab/gitlab.rb
  • /etc/gitlab/gitlab-secrets.json
$ docker cp gitlab_web_1:/etc/gitlab/gitlab.rb /tmp
$ docker cp gitlab_web_1:/etc/gitlab/gitlab-secrets.json /tmp

gitlab02にバックアップしたファイル3つを転送します。

$ scp -p ./file名 murci@192.168.9.7:/tmp

gitlab02(192.168.9.7)にてリストア実行

設定ファイル以外の全データのリストア

バックアップファイルをコンテナ内に移動します。

$ docker cp /tmp/1691375396_2023_08_07_13.10.2-ee_gitlab_backup.tar gitlab_web_1:/var/opt/gitlab/backups

gitlab-ctl プロセスを停止します。
停止するプロセスは以下です。

  • puma
  • sidekiq

$ docker exec -it gitlab_web_1 bash
# gitlab-ctl stop puma
# gitlab-ctl stop sidekiq
# gitlab-ctl status
※停止していること

バックアップからリストアを実行します。

コンテナ内から実行
# gitlab-rake gitlab:backup:restore BACKUP=1691375396_2023_08_07_13.10.2-ee

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
※authorized_keys ファイルの再構築を承認し、yesを入力

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.
Restore task is done.
※完了すること

gitlab-ctl プロセスを起動します。

コンテナ内から実行
# gitlab-ctl start
ok: run: alertmanager: (pid 1006) 11720s
ok: run: gitaly: (pid 267) 11812s
ok: run: gitlab-exporter: (pid 981) 11721s
ok: run: gitlab-workhorse: (pid 969) 11722s
ok: run: grafana: (pid 1025) 11719s
ok: run: logrotate: (pid 396010) 975s
ok: run: nginx: (pid 550) 11781s
ok: run: postgres-exporter: (pid 1016) 11720s
ok: run: postgresql: (pid 390) 11806s
ok: run: prometheus: (pid 990) 11721s
ok: run: puma: (pid 487) 11800s
ok: run: redis: (pid 250) 11818s
ok: run: redis-exporter: (pid 983) 11721s
ok: run: sidekiq: (pid 396626) 0s
ok: run: sshd: (pid 31) 11829s
設定ファイルのリストア

リストア対象は以下です。

  • gitlab.rb
  • gitlab-secrets.json
$ docker cp /tmp/gitlab.rb gitlab_web_1:/etc/gitlab
$ docker cp /tmp/gitlab-secrets.json gitlab_web_1:/etc/gitlab

gitlab.rbの修正を行います(gitlabサーバ2号機のIPに置換)。

# sed -ie "s/192.168.9.6/192.168.9.7/g" gitlab.rb
# grep 192.168 gitlab.rb
external_url 'http://192.168.9.7:2080'
mattermost_external_url 'http://192.168.9.7:8001'
#mattermost_external_url 'https://192.168.9.7'
mattermost['gitlab_auth_endpoint'] = "http://192.168.9.7:2080/oauth/authorize"
mattermost['gitlab_token_endpoint'] = "http://192.168.9.7:2080/oauth/token"
mattermost['gitlab_user_api_endpoint'] = "http://192.168.9.7:2080/api/v4/user"

設定の適用を行います。

コンテナ内から実行
# gitlab-ctl reconfigure

正常性確認

gitlab02にアクセスして、push/pullなどの機能が使用可能か確認します。
ユーザアカウントもリストアされているので、個人のユーザアカウントでログイン可能です。

CI/CD環境のリストア(再構築)

Gitlab Runnerを再作成する

事前に、上記手順でリストアされたRunnerを削除しておきます。

  • GUIアクセス>管理者エリア>概要>Runner>一覧にあるRunnerを削除

以下のコマンドをgitlabコンテナ内で実行します。

コンテナ内から実行
# gitlab-runner register
# ls -l /etc/gitlab-runner/config.toml
※config.tomlが作成されていること
# cat config.toml 
[[runners]]
  name = "Docker Executor (Docker socket building)"
  url = "http://192.168.9.7:2080/"
  token = "rPSNJfyxoxVYjzyDbpz" ※1

Runnerの設定(グローバル)

gitlabのGUIに管理者アカウントでアクセスして、Runnerの設定を行います。

  • 管理者エリア>概要>Runnerへアクセス

一覧に前手順で作成したShared Runner(※1)が存在することを確認します。

編集マークをクリックして、以下の通りチェックを入れます。

  • チェック入れる
    • 有効
    • タグのないジョブの実行
  • チェック外す
    • 保護されています
    • 現在のプロジェクトをロックする

タグに以下を追加します。

- integration-test
- build-production-container
- develop-deploy
- product-deploy
- staging-deploy

変更を保存します。

Runnerの設定(個別プロジェクト)

個別のプロジェクトにRunnerの設定を行います。

事前にSSL/TLS鍵を作成して、秘密鍵(id_ed25519)の値をコピーしておきます。

$ ssh-keygen -t ed25519
$ ls -l ~/.ssh
-rw------- 1 murci murci  746 Aug  8 09:42 authorized_keys
-rw------- 1 murci murci  411 Aug  8 10:09 id_ed25519
-rw-r--r-- 1 murci murci  101 Aug  8 10:09 id_ed25519.pub
-rw-r--r-- 1 murci murci  222 Aug  7 09:31 known_hosts

gitlabのGUIから、プロジェクトページヘ移動します。

  • 左ペインの設定>CI/CD>

Runnerにて、Enable shared runnersをクリックし、変数にて以下を設定します。

- キー:SSH_PRIVATE_KEY
- 値:gitlab02で作成した秘密鍵をペースト
- タイプ:Variable
- Flags:選択しない

その他設定

gitlab02に/etc/docker/daemon.jsonを作成します。

$ cat /etc/docker/daemon.json
{
 "registry-mirrors": [],
 "insecure-registries": [
  "192.168.9.8:32000"
 ],
 "dns":["8.8.8.8","8.8.4.4"]
}
$ systemctl restart docker

gitlab02の公開鍵(id_ed25519.pub)をデプロイ先サーバの~/.ssh/authorized_keysに追記します。

正常性確認

実際にプロジェクトでパイプラインを実行して成功することを確認します。

CATEGORIES & TAGS

GitLab,

Author:


comment

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

関連記事

カテゴリー

むるし

フリーランスのインフラ系エンジニア。
備忘録で色々書いていきます。
お問い合わせは↓
mo-gyu@murci.net
LPIC303 Security
%d人のブロガーが「いいね」をつけました。