概要
Gitlab を Ubuntu と docker にインストールしましたがどちらもデータベースや Web などがすべて同じ VM or コンテナないで動作していました
スケールや SPOF を考えると別の VM に移動したいケースがあると思います
今回は Gitlab のデータベースである PostgreSQL を外部のサーバに移動してみたのでその移行方法やデータのマイグレーション方法を紹介します
環境
- Ubuntu 16.04
- GitLab Enterprise Edition 12.9.2-ee
- macOS 10.15.4
- PostgreSQL 12.2
データベースサーバ側の設定
今回は Postgres を使うので Postgres の設定ファイルを編集します
なお Postgres は Mac 上で動作している Postgres を使います
Gitlab 用の Postgres のデータディレクトリ作成
mkdir /usr/local/var/postgres_gitlab
initdb /usr/local/var/postgres_gitlab
pg_ctl -D /usr/local/var/postgres_gitlab start
gitlabhq_production データベース作成
psql -U hawksnowlog postgres
SQL のプロンプトに変更したら CREATE DATABASE コマンドでデータベースを作成します
CREATE DATABASE gitlabhq_production OWNER gitlab;
Postgres に gitlab 用のユーザ作成
psql -U hawksnowlog postgres
SQL のプロンプトになったらユーザを作成します
create user gitlab with password 'gitlab_secret';
select username from pg_user;
スーパーユーザの権限を付与する
psql -U hawksnowlog postgres
SQL のプロンプトになったら権限を付与します
ALTER ROLE gitlab WITH SUPERUSER;
select username from pg_user;
外部からアクセスできるようにする
まずは LISTEN するアドレスを localhost から変更します
vim /usr/local/var/postgres_gitlab/postgresql.conf
listen_addresses = '192.168.100.1'
0.0.0.0
でも良いですが CIDR or IP が決まっている場合はしっかり設定しましょう
次に接続できるクライアントの CIDR or IP を変更します
vim /usr/local/var/postgres_gitlab/pg_hba.conf
host all all 192.168.100.0/24 trust
ここも同様でしっかり設定しましょう
設定変更できたら restart します
設定が反映されているか一度 Gitlab のサーバからアクセスしてみても良いと思います
pg_ctl -D /usr/local/var/postgres_gitlab restart
netstat -an | grep 5432
Gitlab サーバ側に psql コマンドがあれば以下のコマンドで接続確認できます
psql -h 192.168.100.1 -U gitlab gitlabhq_production
Gitlab 側の設定変更
ここからは Gitlab の設定を変更します
Ubuntu にインストールしているので Ubuntu 上で作業します
gitlab.rb の修正
Gitlab は Ubuntu に apt で事前にインストールしていることを想定しています
gitlab.rb
という設定ファイルを編集します
vim /etc/gitlab/gitlab.rb
gitlab_rails['db_username'] = "gitlab"
gitlab_rails['db_password'] = "gitlab_secret"
gitlab_rails['db_host'] = "192.168.100.1"
sudo gitlab-ctl reconfigure
sudo gitlab-ctl start
これで 192.168.100.10 にアクセスすると Gitlab が立ち上がりかつ外部のデータベースに接続されているのが確認できると思います
なおデータはマイグレートしていないので完全に初期化状態になります
データをマイグレートするには
ダンプファイルを作成してそれをそのままインポートすれば良さそうです
試しにやってみたのでメモしておきます
vim /etc/gitlab/gitlab.rb
gitlab-ctl reconfigure
gitlab-ctl start
で先程の部分を元に戻してローカルで動作させます
pg_dumpall
が古い場合は最新版に差し替えます (差し替え方法は後述しています)
sudo mv /opt/gitlab/embedded/postgresql/10/bin/pg_dumpall{,.back}
sudo ln -s /usr/bin/pg_dumpall /opt/gitlab/embedded/postgresql/10/bin/
sudo -i -u gitlab-psql -- /opt/gitlab/embedded/bin/pg_dumpall > ./database.sql
データが少ない場合はすぐに終わります
警告やエラーが出る場合は実行しているユーザを確認してください (上記は vagrant ユーザで実行しています)
あとはダンプファイル database.sql
を Mac 側にリストアすれば OK です
ただ自分が試した感じだと gitlabhq_production
を一度削除して空にしてからリストアしないとダメな感じでした
おそらく auto_increment
などによる影響かなと思います
pg_ctl -D /usr/local/var/postgres_gitlab start
psql postgres
DROP DATABASE gitlabhq_production;
CREATE DATABASE gitlabhq_production OWNER gitlab;
psql -f /path/to/database.sql gitlabhq_production
これで再度 gitlab.rb を編集して reconfigure -> start をかければデータの移行が完了しているはずです
Gitlab のデータを丸々バックアップするには
gitlab-rake gitlab:backup:create
と gitlab-rake gitlab:backup:restore
を使います
まずは Ubuntu 側 (元のデータがあるサーバ) で
gitlab-rake gitlab:backup:create
を実行します
バックアップの作成が成功すると /var/opt/gitlab/backups/1586997709_2020_04_16_12.9.2-ee_gitlab_backup.tar
が作成されます
この方法はデータベースサーバだけでなく Gitlab 自体を別のサーバに移行する際に使える方法です
psql コマンドが最新でない場合には
Ubuntu16.04 のデフォルトのリポジトリからは 9.5.21 の postgresql-client
しかインストールできません
PostgreSQL サーバのバージョンが最新の場合はクライアント側も最新にしなければいけないので以下のように最新版をインストールしましょう
sudo apt-get install curl ca-certificates gnupg
curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
apt -y update
apt -y install postgresql-client-12
pg_dump -V
コマンドでバージョンがを確認してサーバ側と同じバージョンになっていれば OK です
それでも古いバージョンの pg_dump
を使おうとする場合は強制的にバイナリを変更しても良いと思います
mv /opt/gitlab/embedded/postgresql/10/bin/pg_dump{,.back}
ln -s /usr/bin/pg_dump /opt/gitlab/embedded/postgresql/10/bin/
最後に
Gitlab で Postgres を外部のサーバに移行する方法を紹介しました
gitlab の reconfigure と restart が入るので完全に無停止で移行するのは難しそうです
また Gitlab に含まれている pg_hogehoge
系のコマンドが古いので、移行先の Postgres のバージョンに合わせてコマンドを差し替えないとうまく動作しない場合がありそうです
またどうやら Nginx や Redis、Gitaly など Gitlab を構成する主要コンポーネントは外部に移行できるようなので他のコンポーネントを外部にする方法も別記事で紹介したいと思います
0 件のコメント:
コメントを投稿