〔備忘録〕 Self-managed 版 GitLab サーバの PostgreSQL と Nginx を non-bundle サービスへ移行

モチベーション

GitLab Omnibus パッケージは,GitLab のコア・アプリケーションだけでなく PostgreSQL サーバや Nginx サーバを内包し, 該パッケージをインストールするだけですぐに利用できる優れものです。 本来は,単一 VM (又は単一の docker container など)で稼働させるように設計されていて, 内包されている PostgreSQL, Nginx はそのまま利用するのが良いのでしょうが, VMを動作させている Host のリソース(CPU core や memory)の都合で, GitLabサービスを稼働させる VM で,PostgreSQL や Nginx を利用する別のサービスも一緒に動かす必要がある という状況が発生しました。

そこで,GiaLab に内包されているサービスを使わずに, 別パッケージとしてインストールした PostgreSQL や Nginx を利用するよう構成を変更したので, その手順を以下に記します。

前提条件

実施環境

  • OS: Ubuntu 22.04 LTS
  • GitLab: ver. 17.0
  • PostgreSQL : ver.15.7
  • Nginx : ver. 18.0

その他の前提条件

  • GitLab はインストールされていて,稼働しているものとする。
  • PostgreSQL と Nginx はインストールされていない

手順概要

おおよそ次の手順で, GitLab に bundle (内包) されている PostgreSQL と Nginx を 別 (non-bundle) にインストールした PostgreSQL と Nginx で稼働するように,移行します。

  • GitLab の Database のバックアップ
  • 外部 PostgreSQL への移行
  • non-bundle 版 Nginx での公開

GitLab の Database のバックアップ

参考サイト:

PostgreSQL の database の移行が目的なので pg_dump でバックアップしても良いのでしょうが, 今回は何も考えずに gitlab-backup コマンドを用いて,バックアップを取りました。

> sudo gitlab-backup create

/var/opt/gitlab/backups/ ディレクトリの下に,バックアップ対象の全データの tar ball が作成されます。 この tar ball の中の db/database.sql を後述の移行作業に用います。

外部 PostgreSQL への移行

PostgreSQL サーバをインストールする前に,GitLab サーバを全停止しておきます。

> sudo gitlab-ctl stop
> sudo systemctl stop gitlab-runsvdir

次いで,PostgreSQL をインストールします。 (※ ubuntu 20.04 標準の deb パッケージでは postgresql-14 がインストールされますが,新しいバージョンをインストールする際は PostgreSQL: Linux downloads (Ubuntu) を参考にインストールします。)

> sudo apt install -y postgresql-15

PostgreSQL サーバがインストールされたら,下記の手順で database を作成してきます。

> su -u postgres psql
CREATE USER gitlab WITH PASSWORD '(適切なPASSWORD)';
CREATE DATABASE gitlabhq_production WITH OWNER gitlab ;
GRANT ALL PRIVILEGES ON DATABASE gitlabhq_production TO gitlab;

バックアップした tar ball 内の db/database.sql を抽出しておき, データをリストアします。

> psql -Ugitlab -W -h localhost -d gitlabhq_production < (db/database.sql ファイル)

そして /etc/gitlab/gitlab.rb に対して下記の設定を追加・修正しておきます。

gitlab_rails['db_adapter'] = "postgresql"
gitlab_rails['db_encoding'] = "unicode"
gitlab_rails['db_database'] = "gitlabhq_production"
gitlab_rails['db_username'] = "gitlab"
gitlab_rails['db_password'] = "(gitlab user のパスワード)"
gitlab_rails['db_host'] = "127.0.0.1"

postgresql['enable'] = false

最後に,gitlab の reconfigure & 稼働を行い,動作確認を行います。

> sudo systemctl start gitlab-runsvdir
> sudo gitlab-ctl reconfigure
> sudo gitlab-ctl start

ブラウザで,gitlab サーバにアクセスして,ログイン等ができればOKです。

non-bundle 版 Nginx での公開

他の Web Application を Nginx で公開できるようにするために, GitLab bundl 版の Nginx とは別に OS package 版の Nginx をインストールし, package 版の Nginx で GitLab を公開します。 なお,公開時の URL は, http:// (サーバのFQDN) /git/ とします。

まず, /etc/gitlab/gitlab.rb に対して下記の設定を追加・修正しておきます。

external_url 'http://127.0.0.1:8081/git/'
nginx['enable'] = true
nginx['listen_addresses'] = ['127.0.0.1', '[::1]']
nginx['listen_port'] = 8081

次いで,gitlab の reconfigure & 稼働を行い,動作確認を行います。

> sudo gitlab-ctl stop
> sudo gitlab-ctl reconfigure
> sudo gitlab-ctl start

起動後に,下記コマンド等で動作確認します。

curl http://localhost:8081/git/users/sign_in

apt コマンドで nginx-full をインストールします。

> sudo apt install nginx-full

/etc/nginx/site-enabled/default に以下のリバースプロキシ設定を追記します。

        proxy_set_header        Host    $host;
        proxy_set_header        X-Real-IP       $remote_addr;
        proxy_set_header        X-Forwarded-Host        $host;
        proxy_set_header        X-Forwarded-Server      $host;
        location /git/ {
                proxy_redirect  off;
                proxy_pass      http://localhost:8081/git/;
        }

追記後,Nginx を再起動します。

> sudo systemctl restart nginx

あとは,http:// (サーバのFQDN) /git/ にアクセスをして,表示されればOKです。

課題

Nginx のリバースプロキシ先に, GitLab に bundle されている puma を指定すれば良いと思ったのですが, assets ファイルが参照できなかったため,Nginx の多段 Proxy にせざるを得なかったのが残念。(T_T)