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
-,

執筆者:

関連記事

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

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

Nodeアプリが依存するnpmモジュールライセンスをlicense-checker & Jenkinsで自動チェック(2)

目次1 目的1.1 動作イメージ2 Jenkinsジョブを設定2.1 前提2.2 Jenkins「シェルの実行」を設定2.3 想定外ライセンスが含まれていた場合の通知3 まとめ 目的 前回の続き。On …

開発用PostgreSQLをインストールした後の外部接続、ユーザ作成、認証周りの設定

ローカル開発用にPostgreSQLを入れた後、開発や分析をし易くする為に外部ホストからパスワード付き接続出来るようにしていきます。 また、postgresスーパーユーザは権限が強すぎて開発アプリから …

PostgreSQL エポックタイムカラムを今月初~今月末で範囲検索

エポックタイムは1970年1月1日 0時0分0秒から現在までの秒数。 PostgreSQLではこれを人間に読みやすいTIMESTAMP型(’2019-09-04 00:00:00&#821 …

無料で自由に使える日本全国の企業データベースをPostgreSQLで作る

開発するシステムよっては一覧から企業を選択する機能があるかも知れません。「企業データベース」でググると沢山の商用企業データベースが出てきます。 「でも・・・お高いんでしょう?」 いいえ、なんと今なら・ …

 

shingo.nakanishi
 

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