弊社ではソースコード管理に Gitlab CE を使っています。 今回、GitLabを別のサーバーに移し替えたのですが、GitLabのデータを一旦バックアップしてその後新サーバーでレストアするという手順を踏みました。それなりにハマりポイントがあったので作業ログとして残します。
なお、原則としてここの手順を元に作業しました。
環境情報
今回のサーバーは以下の通り。
項目 | 内容 |
---|---|
OS | CentOS 6 |
GitLab | 9.5.4 Community Edition |
GitLabのインストール方法 | omnibus (yum) |
準備編
1. GitLabのバージョンの確認
上記のページに書いてありますが、GitLabのバックアップとリストアは同じバージョンでないと失敗するということなのでインストールしてあるバージョンを調べます。
# rpm -qa | grep gitlab gitlab-ce-9.5.4-ce.0.el6.x86_64
2. サーバーの空き容量の確認
ここでまずハマったのですが、GitLabのバックアップはリポジトリまるごと、LFSオブジェクトまるごと、アップロードしたファイル、DBのデータをまるっと保存して1つのtarファイルにまとめるようなのですが、その処理を1つのディレクトリで行います。
厳密に計測はしませんでしたが、今存在しているデータが10GB程度だとすると空きが20GB程度ないと失敗するようです。これをやってなくて長時間待って失敗するという苦汁を舐めました。
1. バックアップ先を確認
/etc/gitlab/gitlab.rb
の backup_path
の設定を確認(設定されていない場合は /var/opt/gitlab/backups
)
2. 容量をチェック
厳密にはどの程度必要かは分かりませんので推測するしかないです。
3. 足りない場合
別途ディスクをマウントするなどして /etc/gitlab/gitlab.rb
を編集してバックアップ先を変更する
gitlab_rails['manage_backup_path'] = true gitlab_rails['backup_path'] = "/path/to/new/backups"
4. 変更した場合は設定変更を反映
gitlab-ctl reconfigure
3. 移行先サーバーにも空き容量があるか確認
リストアする際にも同様にディスク容量を必要としますので、新たに構築するのであれば予め多めのストレージにしておくか、追加マウントすると良いです。私は No space left on device
が出て失敗しました。
バックアップ編
1. GitLabを停止
gitlab-ctl stop
2. バックアップ処理に必要なサービスだけ起動
gitlab-ctl start postgresql gitlab-ctl start redis
3. バックアップ開始
gitlab-rake gitlab:backup:create
すべてをバックアップするためか結構時間がかかります。(データ量に依る)
バックアップが完了すると backup_path
の下に1つのtarファイルが出来ているはずです。以下は例。
/path/to/backups/1533565433_2018_08_06_9.5.4_gitlab_backup.tar
コマンドではバックアップされないファイルが2つあるので手動でバックアップします。
/etc/gitlab/gitlab.rb /etc/gitlab/gitlab-secrets.json
バックアップはこれで完了です。
移行先サーバーの準備編
移行先サーバーには、移行元と同じバージョンのGitLabが必要となります。今回は新規にサーバーを構築したのでインストールしていきます。
手順はほぼこの通り。
なのですが、ここに掲載されているのは Enterprise Edition なので ee
となっているところを ce
に置き換える必要があるのと、リストア用にインストールする場合は別途手順が必要なのでこちらも記載します。
yum install -y curl policycoreutils-python openssh-server cronie yum install postfix service postfix start chkconfig postfix on curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | bash
gitlab-ce でインストールできるバージョンを確認
yum list --showduplicate gitlab-ce
ずらずらと出るので、真ん中のバージョン文字列(例: 9.5.4-ce.0.el6
をメモっておき、指定したバージョンの gitlab をインストールする。
yum install gitlab-ce-9.5.4-ce.0.el6
外向けのドメイン名を指定したい場合は以下の方法も可能ですが /etc/gitlab/gitlab.rb
を上書きすると消えてしまうので、ここで指定する意味はあまりないかもしれません。
EXTERNAL_URL="http://gitlab.example.com" yum install gitlab-ce-9.5.4-ce.0.el6
インストールしたら手動でバックアップした gitlab.rb
と gitlab-secrets.json
を /etc/gitlab
に配置する。
この時 gitlab.rb
でバックアップ場所を変更している場合は、以下のどちらかの対応を行う。
- デフォルトのバックアップ場所に変更する
gitlab.rb
の設定をコメントアウトする(manage_backup_path
とbackup_path
)
- 変更したバックアップ場所を準備する
- マウントするなりして
/path/to/new/backups
を準備してください
- マウントするなりして
準備が出来たら gitlab-ctl reconfigure
を実行する。
これで準備は完了。
リストア
1. バックアップしたファイル(tar)を配置
バックアップしたファイル 1533565433_2018_08_06_9.5.4_gitlab_backup.tar
を新しいサーバーのバックアップディレクトリに配置する。
2. パーミッションを念の為変更しておく
chown -R git /path/to/backups
3. リストア
以下のコマンドを叩く。
BACKUP
で指定するのはtar
ファイルの_gitlab_backup.tar
を除いた前半部分です。
gitlab-ctl start gitlab-ctl stop unicorn gitlab-ctl stop sidekiq gitlab-rake gitlab:backup:restore BACKUP=1533565433_2018_08_06_9.5.4
当然ながら結構時間がかかる。
4. リストアされたか確認
gitlab-ctl restart gitlab-rake gitlab:check SANITIZE=true
これで完了。