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

執筆者:

関連記事

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

目次1 目的2 使用するnpmモジュール3 ライセンスを表示してみる3.1 サマリで出す3.2 CSVファイルで出す4 まとめ 目的 ionicやNode.jsアプリが依存するライブラリにライセンス違 …

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

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

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

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

GitLab12.2.1をCentOS7.6にインストール

会社のコンプライアンス的にgithubが使えない個人開発しているプログラムを完全にプライベートで管理したい GitLabを家庭や社内でオンプレで使えばこれらのニーズを満たすことが出来ます。 留意点とし …

GitLab12.1からMySQLを捨ててPostgreSQLに一本化するらしい

オンプレSCMの旗手、GitLabから掲題のニュースが有りました。 2017年から公式発表があったことですが、GitLab 12.1からMySQLのサポートを止めるとのことです。 GitLab&nbs …

 

shingo.nakanishi
 

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