GitLab mattermost PostgreSQL

GitLab Omunibus版のPostgreSQLに普通のpsqlコマンドで接続

投稿日:2019年8月31日

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を外部に公開出来るようにします。

-GitLab, mattermost, PostgreSQL
-,

執筆者:

関連記事

「Jailer Database Tool」でDB関連作業を効率化

開発時のデータベースクライアントは何を使っていますか? 「Jailer Database Tool」を使っていないなら、普段使いツールに加えてみるとちょっと世界が変わるかも知れません。 世の中には様々 …

pgcryptoで公開鍵暗号の動作確認

共通鍵暗号で暗号化されたデータはパスワードが漏洩すると復号される危険が高まるのに対し、公開鍵暗号で暗号化されたデータは秘密鍵とパスワードの二つが漏洩しないと復号できません。 APサーバとDBサーバ通信 …

PostgreSQL11に一般ユーザ権限でサンプルDB「dvdrental」をpg_restore

データベースインストール後にサンプルデータを投入することで、DBをバックエンドにして動作する他ミドルの検証が楽になったりすることがあります。 それぞれのデータベースで代表的なサンプルデータセットの存在 …

BIツール「metabase」でサンプルDB「dvdrental」をグラフ化する

「売り上げやユーザ増加傾向をDBから抽出して上役に報告したりチームで共有したい」 資料を作る為にSQLを流して、結果をコピーして、Excelに張り付けて、グラフ化して・・・結構面倒で骨が折れます。間違 …

GitLab内のリポジトリをmirrorして引っ越しする

目次1 はじめに2 環境3 引っ越し開始3.1 ①GitLabで引っ越し先リポジトリを作っておく3.2 ②旧リポジトリのミラーリポジトリを開発用PCに作る3.3 ③ミラーリポジトリに入って内容物を確認 …

 

shingo.nakanishi
 

東京在勤、1977年生まれ、IT職歴2n年、生涯技術者として楽しく生きることを目指しています。デスマに負けず健康第一。