GitLab Omunibus版でインストールされるビルトインPostgreSQLは、
- TCP:5432ではなくホスト内でしか接続出来ないUnix Domain Socketで待機
- ローカルホストからOSユーザでしか接続出来ないPeer認証を使用
で起動していてこれに沿った接続方法なら標準のpsqlコマンドでも接続できます。
最終的に外部からJDBC接続して分析などを行う為、GitLabがPostgreSQLに接続する為どういう設定がされているのか見て行きます。
GitLabが用意しているPostgreSQLへのアクセス方法
公式ドキュメントでは「gitlab-psql」という独自コマンドとOSユーザーが紹介されていて、これを使うことで簡単にPostgreSQLに接続できます。
GitLabのデータベース「gitlabhq_production」への接続コマンド。
gitlab-psql -d gitlabhq_production
# gitlab-psql -d gitlabhq_production
psql (10.9)
Type "help" for help.
gitlabhq_production=# \d
List of relations
Schema | Name | Type | Owner
--------+--------------------------------------------------------+----------+--------
public | abuse_reports | table | gitlab
public | abuse_reports_id_seq | sequence | gitlab
public | allowed_email_domains | table | gitlab
(snip)
Mattermostのデータベース「mattermost_production」への接続コマンド。
gitlab-psql -d mattermost_production
# gitlab-psql -d mattermost_production
psql (10.9)
Type "help" for help.
mattermost_production=# \d
List of relations
Schema | Name | Type | Owner
--------+----------------------+-------+-------------------
public | audits | table | gitlab_mattermost
public | bots | table | gitlab_mattermost
public | channelmemberhistory | table | gitlab_mattermost
(snip)
DBの中を見たいだけならgitlab-psqlコマンドを使えば十分ですね。
gitlab-psqlコマンドの処理内容
GitLabがどんな設定でPostgreSQLに接続しているか知りたいので中身を追って行きます。
/opt/gitlab/bin/gitlab-psqlが実体ファイルのようです。
$ which gitlab-psql
/bin/gitlab-psql
$ readlink -e /bin/gitlab-psql
/opt/gitlab/bin/gitlab-psql
中身はshスクリプト。
$ cat /opt/gitlab/bin/gitlab-psql/gitlab-psql
#!/bin/sh
error_echo()
{
echo "$1" 2>& 1
}
gitlab_psql_rc='/opt/gitlab/etc/gitlab-psql-rc'
if ! [ -f ${gitlab_psql_rc} ] ; then
error_echo "$0 error: could not load ${gitlab_psql_rc}"
error_echo "Either you are not allowed to read the file, or it does not exist yet."
error_echo "You can generate it with: sudo gitlab-ctl reconfigure"
exit 1
fi
. ${gitlab_psql_rc}
if [ "$(id -n -u)" = "${psql_user}" ] ; then
privilege_drop=''
else
privilege_drop="-u ${psql_user}"
fi
cd /tmp; exec /opt/gitlab/embedded/bin/chpst ${privilege_drop} -U ${psql_user} /usr/bin/env PGSSLCOMPRESSION=0 /opt/gitlab/embedded/bin/psql -p ${psql_port} -h ${psql_host} -d ${psql_dbname} "$@"
最終行の、
/opt/gitlab/embedded/bin/psql -p ${psql_port} -h ${psql_host} -d ${psql_dbname} “$@”
でGitLabに同梱のpsqlコマンドを実行。各引数は/opt/gitlab/etc/gitlab-psql-rcファイルから読み込まれているようなので見てみます。
# cat /opt/gitlab/etc/gitlab-psql-rc
psql_user='gitlab-psql'
psql_host='/var/opt/gitlab/postgresql'
psql_port='5432'
psql_dbname='gitlabhq_production'
先程のpsqlコマンドにパラメータを当てはめると、
- 「gitlab-psql」というユーザで、
- 「/var/opt/gitlab/postgresql」というホスト(Unix Domain)に、
- 「5432」ポートで、
- 「gitlabhq_production」という名前のデータベースに向けて
接続しているようです。
Omnibus版のPostgreSQLはTCPではなくUnix Domain Socketで起動しているので、TCP:5432で起動している他のPostgreSQLとは同一ホスト内で同居出来るんですね。その代わりこのままでは外部から接続出来なさそうです。
# netstat -an | grep 5432
unix 2 [ ACC ] STREAM LISTENING 59677 /var/opt/gitlab/postgresql/.s.PGSQL.5432
unix 3 [ ] STREAM CONNECTED 63444 /var/opt/gitlab/postgresql/.s.PGSQL.5432
unix 3 [ ] STREAM CONNECTED 50291886 /var/opt/gitlab/postgresql/.s.PGSQL.5432
(socatコマンドでTCPソケットとUnix Domainソケットを接続すれば外部からでも接続出来ますが、後述のPeer認証でこけます)
psqlコマンドで接続してみる
接続パラメータが分かったのでpsqlで接続してみます。
# /opt/gitlab/embedded/bin/psql \
-U gitlab-psql \
-h /var/opt/gitlab/postgresql \
-p 5432 \
-d gitlabhq_production
psql: FATAL: Peer authentication failed for user "gitlab-psql"
gitlab-psqlユーザのPeer認証が失敗しました。Peer認証はPostgreSQLにログインするユーザと同じ名前のOSユーザなら、ローカルホストからの接続のみ無条件に許す認証です。
認証を管理するpg_hba.confファイルを見てみると、pg_identify.confで管理されているOSユーザならログイン出来るようになっているようです。
# less /var/opt/gitlab/postgresql/data/pg_hba.conf
(snip)
local all all peer map=gitlab
ということでgitlab-psqlユーザになって同じコマンドを実行してみると、今度は成功。
# su - gitlab-psql
-sh-4.2$ whoami
gitlab-psql
-sh-4.2$ /opt/gitlab/embedded/bin/psql \
-U gitlab-psql \
-h /var/opt/gitlab/postgresql \
-p 5432 \
-d gitlabhq_production
psql (9.6.8)
Type "help" for help.
GitLab Omnibus版のPostgreSQLにpsqlコマンドで接続できました。
-d mattermost_productionにすればMattermostのDBにも繋がります。
外部から接続出来ればDB分析が出来る
psqlコマンドで接続する過程で、Unix Domain Socketで接続待ちしていたり、Peer認証をしていることが分かり、パスワードが必要なJDBCで接続したり、外部からの接続はこのままでは無理であることが分かりました。
外部からJDBC接続出来ればDB内容を他PCでBI出来たりするので次はGitLab Omnibus版のPostgreSQLを外部に公開出来るようにします。