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

執筆者:

関連記事

Mattermostのチャンネル発言数をMetabaseでビジュアル化する

オンプレGitLabでMattermostを使えるようにした後の活用法として、「ナレッジチャンネル」を運営してチームの知識を共有する営みをしている開発現場も多いと思います。 ミーティングではなくチャッ …

GitLabのリポジトリを複製して引っ越しする

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

社内プライベートMattermostを立ち上げてChatOpsする

社内開発チーム内のコミュニケーション、上手く行っていますか?メンバーが世界各地に散らばってないなくても、意外と心は離れているかも知れません。 プライベートなGitLab12をCentOS7にインストー …

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

「売り上げやユーザ増加傾向をDBから抽出して上役に報告したりチームで共有したい」 こういった時、SQL結果をExcelでグラフ化、とかしていませんか? SQLを流して結果をコピーしてExcelに張り付 …

ERROR: Several keys given – pgcrypto does not handle keyring、またはERROR: Corrupt ascii-armor

gpgキーストアに同じUIDで複数の鍵ペアを登録してしまうと、ファイルにexportした際に1ファイルに複数の鍵情報が入ってしまい、1ファイル1鍵を期待しているpgcryptoに怒られます。 目次1 …

 

shingo.nakanishi
 

東京在勤、1977年生まれ、IT職歴2n年、生涯現役技術者を目指しています。健康第一。