2020年4月21日火曜日

Gitlab でデータベースを外部のサーバに設定する方法

概要

Gitlab を Ubuntudocker にインストールしましたがどちらもデータベースや 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;
postgres=# select * from pg_shadow; usename | usesysid | usecreatedb | usesuper | userepl | usebypassrls | passwd | valuntil | useconfig ————–+———-+————-+———-+———+————–+————————————-+———-+———– hawksnowlog | 10 | t | t | t | t | | | gitlab | 16384 | f | t | f | f | md5132c2d15e04e6d423de7a687ec9b0d32 | | (2 rows)

外部からアクセスできるようにする

まずは 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:creategitlab-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 件のコメント:

コメントを投稿