モチベーション
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)