PostgreSQL と pgadmin4 を PGDG レポジトリから新規にインストール

Scientific Linux 7 や CentOS 7 に最新の PostgreSQL と pgadmin4 を新規にインストールする方法です。 今回も RPM パッケージをインストールして簡単に環境構築します。

PostgreSQL のGUI管理ツールの一つに phpPgAdmin があります。 しかし、2013年のバージョン5.1を最後に更新が途絶えてるっぽいです。 このバージョンでは PostgreSQL のマテリアライズドビューが扱えないっぽいので pgadmin を活用してました。

pgadmin4 をサーバサイドにインストールして Apache から連携する記事が少ないので記事にしてみました。

PostgreSQL のインストール

Scientific Linux 7 にこの記事現在の最新バージョン PostgreSQL 9.6.2 をインストールします。

定番のPGDGからパッケージをインストールします。公式のレポジトリページから対応OSのRPMパッケージをインストールしてください。


# yum install https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/pgdg-sl96-9.6-3.noarch.rpm

PGDG のレポジトリが追加されましたので PostgreSQL をインストールします。


# yum install postgresql96-server postgresql96-contrib

ロケールなしでデータベースクラスタを初期化します。ロケールを指定しないと現在のロケールで初期化されるようです。 ロケールなしで初期化しないと日本語の並び順がおかしくなるので必ずなしにします。ja_JP.UTF-8 を指定してもいいみたいですけど私はしたことがありません。*1

【postgresql96-setup】 コマンドを使用する場合のオプションは【PGSETUP_INITDB_OPTIONS】環境変数に設定します。他の記事みてみたら、この環境変数使わずにデータベースクラスタを初期化してますね。データベース作成時に指定してるのかな。このコマンド、メジャーバージョンアップの際にも使用できるんだけどその記事まだ誰も書いてないっぽい。(それとも埋もれてる?)


# locale
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=

# PGSETUP_INITDB_OPTIONS="--no-locale --encoding=utf-8" /usr/pgsql-9.6/bin/postgresql96-setup initdb

データベースクラスタの初期化がおわりましたので PostgreSQL を起動します。


# systemctl status postgresql-9.6
● postgresql-9.6.service - PostgreSQL 9.6 database server
   Loaded: loaded (/usr/lib/systemd/system/postgresql-9.6.service; disabled; vendor preset: disabled)
   Active: inactive (dead)

# systemctl start postgresql-9.6

# systemctl status postgresql-9.6
● postgresql-9.6.service - PostgreSQL 9.6 database server
   Loaded: loaded (/usr/lib/systemd/system/postgresql-9.6.service; disabled; vendor preset: disabled)
   Active: active (running) since 火 2017-04-04 08:28:11 JST; 10s ago
  Process: 1513 ExecStartPre=/usr/pgsql-9.6/bin/postgresql96-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
 Main PID: 1519 (postmaster)
   CGroup: /system.slice/postgresql-9.6.service
           ├─1519 /usr/pgsql-9.6/bin/postmaster -D /var/lib/pgsql/9.6/data/
           ├─1521 postgres: logger process
           ├─1523 postgres: checkpointer process
           ├─1524 postgres: writer process
           ├─1525 postgres: wal writer process
           ├─1526 postgres: autovacuum launcher process
           └─1527 postgres: stats collector process

# systemctl enable postgresql-9.6
Created symlink from /etc/systemd/system/multi-user.target.wants/postgresql-9.6.service to /usr/lib/systemd/system/postgresql-9.6.service.

PostgreSQL を起動しましたのでロケールなしで作成されたか確認してみます。


# su - postgres -c 'psql -l'
                                        データベース一覧
   名前    |  所有者  | エンコーディング | 照合順序 | Ctype(変換演算子) |      アクセス権
-----------+----------+------------------+----------+-------------------+-----------------------
 postgres  | postgres | UTF8             | C        | C                 |
 template0 | postgres | UTF8             | C        | C                 | =c/postgres          +
           |          |                  |          |                   | postgres=CTc/postgres
 template1 | postgres | UTF8             | C        | C                 | =c/postgres          +
           |          |                  |          |                   | postgres=CTc/postgres
(3 行)

# su - postgres -c "psql -c \"SELECT name, setting, context FROM pg_settings WHERE name LIKE 'lc%';\""
    name     | setting |  context
-------------+---------+-----------
 lc_collate  | C       | internal
 lc_ctype    | C       | internal
 lc_messages | C       | superuser
 lc_monetary | C       | user
 lc_numeric  | C       | user
 lc_time     | C       | user
(6 行)

無事にロケールなしで作成されたみたいですね。

適当にユーザ(ロール)とデータベースを作成しておきます。


# su - postgres -c 'createuser -P utsuro'
新しいロールのためのパスワード:
もう一度入力してください:

# su - postgres -c 'createdb -O utsuro utsuro'

このままでは接続できませんので設定ファイルの【pg_hba.conf】を編集し再起動します。


# vi /var/lib/pgsql/9.6/data/pg_hba.conf
host    all             all             127.0.0.1/32            md5
#host    all             all             127.0.0.1/32            ident
host    all             all             ::1/128                 md5
#host    all             all             ::1/128                 ident

# systemctl restart postgresql-9.6

作成したユーザで接続できるかどうか確かめます。上記の設定ではUnixドメインソケットでは接続できないのでホスト名を明示的に指定します。


# psql -h localhost -U utsuro -d utsuro -c '\dl'
ユーザ utsuro のパスワード:
 ラージオブジェクト
 ID | 所有者 | 説明
----+--------+------
(0 行)

pgadmin4 のインストール

この記事のメインです。phpPgAdmin のようにサーバーサイドで PostgreSQL を管理できるようになります。 windowsから管理するためだけに【pg_hba.conf】をIPアドレス変更毎に書き換えなくてもよくなるよ、わーい。

それでは pgadmin4 を yum からインストールしていきます。EPELリポジトリを追加していない環境では追加してください。


# yum install epel-release
# yum install pgadmin4-v1

設定ファイルがどこにあるのか探します。


# rpm -ql pgadmin4-v1
/etc/pgadmin/pgadmin4.conf
/usr/pgadmin4-v1/runtime/pgAdmin4
/usr/share/applications/pgadmin4-v1.desktop

さらに設定ファイルがどこにあるのか探します。


# cat /etc/pgadmin/pgadmin4.conf
ApplicationPath="/usr/lib/python2.7/site-packages/pgadmin4-web/"
PythonPath="/usr/lib/python2.7/site-packages:/usr/lib64/python2.7/site-packages"

設定ファイルのあるディレクトリに移動します。


# cd /usr/lib/python2.7/site-packages/pgadmin4-web/

# ls
babel.cfg  config.pyc  config_distro.py   config_distro.pyo  pgAdmin4.pyc  pgAdmin4.wsgi  regression  setup.pyc
config.py  config.pyo  config_distro.pyc  pgAdmin4.py        pgAdmin4.pyo  pgadmin        setup.py    setup.pyo

ここで公式のマニュアルを読むと、『【config_local.py】を作成してそこに設定値を書き込むのだ』と英語で書いてあるように読めるのでその通りにします。設定値は config.py → config_distro.py → config_local.py の順番にて読み込まれるようです。


# touch config_local.py

# vi config_local.py
SERVER_MODE = True

LOG_FILE = '/var/www/pgadmin4/pgadmin4.log'
SQLITE_PATH = '/var/www/pgadmin4/pgadmin4.db'
SESSION_DB_PATH = '/var/www/pgadmin4/sessions'
STORAGE_DIR = '/var/www/pgadmin4/storage'

【LOG_FILE】等のパスはどこでもいいです。 ここで【/var/www/pgadmin4】ディレクトリにした理由ですけど、pgadmin4 を Apache 連携するにあたり、モジュールの mod_wsgi を使います。 ということは pgadmin4 は apache ユーザアカウントで動作します、多分、おそらく。 なので apache ユーザがアクセスするなら Apache のドキュメントルートの上に置いたほうがいいような気がしただけです。 あまり分散させたくありませんし。 他に【/var/lib/pgadmin4】辺りに作成でしょうね。まぁ、どこでもいいのです。

ディレクトリを作成したら初期設定します。(ディレクトリを作成しなくても初期設定の中で作成されるっぽい) 初期設定の途中でメールアドレスとパスワードを聞かれます。 これは pgadmin4 にログインするアカウントになります。


# mkdir /var/www/pgadmin4

# python setup.py
pgAdmin 4 - Application Initialisation
======================================


The configuration database - '/var/www/pgadmin4/pgadmin4.db' does not exist.
Entering initial setup mode...
NOTE: Configuring authentication for SERVER mode.

Enter the email address and password to use for the initial pgAdmin user account:

Email address:
Password:
Retype password:

The configuration database has been created at /var/www/pgadmin4/pgadmin4.db

ファイルが作成されたか見てみましょう。


# ls /var/www/pgadmin4/
pgadmin4.db

db ファイルができています。ログファイルやセッションディレクトリも生成する必要がありますので、ここで一度 pgadmin4 サービスを起動させます。


# systemctl status pgadmin4-v1
● pgadmin4-v1.service - pgAdmin4
   Loaded: loaded (/usr/lib/systemd/system/pgadmin4-v1.service; disabled; vendor preset: disabled)
   Active: inactive (dead)

# systemctl start pgadmin4-v1

# systemctl status pgadmin4-v1
● pgadmin4-v1.service - pgAdmin4
   Loaded: loaded (/usr/lib/systemd/system/pgadmin4-v1.service; disabled; vendor preset: disabled)
   Active: active (running) since 火 2017-04-04 11:27:58 JST; 2s ago
 Main PID: 2128 (python2)
   CGroup: /system.slice/pgadmin4-v1.service
           └─2128 /usr/bin/python2 /usr/lib/python2.7/site-packages/pgadmin4-web/pgAdmin4.py

 4月 04 11:27:58 localhost.localdomain systemd[1]: Started pgAdmin4.
 4月 04 11:27:58 localhost.localdomain systemd[1]: Starting pgAdmin4...
 4月 04 11:27:59 localhost.localdomain python2[2128]: Starting pgAdmin 4. Please navigate to http://localhost:5050 in your browser.
Hint: Some lines were ellipsized, use -l to show in full.

起動できたら終了させます。もう今後は(Apache 連携するので)サービスを起動する必要はありません。


# systemctl stop pgadmin4-v1

再度ディレクトリを確認します。


# ls -l /var/www/pgadmin4
合計 32
-rw-------. 1 root root 29696  4月  4 11:20 pgadmin4.db
-rw-r--r--. 1 root root     0  4月  4 11:27 pgadmin4.log
drwxr-xr-x. 2 root root     6  4月  4 11:27 sessions
drwx------. 2 root root     6  4月  4 11:27 storage

ディレクトリ以下の所有者を apache アカウントにします。


# chown -R apache:apache /var/www/pgadmin4

Apache コンフィグファイル【pgadmin4-v1.conf】の設定をします。mod_wsgi は【/etc/httpd/conf.modules.d/10-wsgi.conf】で有効になってますから1行目の LoadModule はコメント化してください。


# cd /etc/httpd/conf.d/

# cp pgadmin4-v1.conf.sample pgadmin4-v1.conf

# vi pgadmin4-v1.conf
# LoadModule wsgi_module modules/mod_wsgi.so
WSGIDaemonProcess pgadmin processes=1 threads=25
WSGIScriptAlias /pgadmin4 /usr/lib/python2.7/site-packages/pgadmin4-web/pgAdmin4.wsgi

<Directory /usr/lib/python2.7/site-packages/pgadmin4-web/>
        WSGIProcessGroup pgadmin
        WSGIApplicationGroup %{GLOBAL}
        <IfModule mod_authz_core.c>
                # Apache 2.4
                Require all granted
        </IfModule>
        <IfModule !mod_authz_core.c>
                # Apache 2.2
                Order Deny,Allow
                Deny from All
                Allow from 127.0.0.1
                Allow from ::1
        </IfModule>
</Directory>

コンフィグファイルを変更したら Apache の構文チェックを行ないます。OKなら再起動(起動)します。


# apachectl configtest
Syntax OK

# systemctl restart httpd

# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since 火 2017-04-04 11:34:48 JST; 7s ago
     Docs: man:httpd(8)
           man:apachectl(8)
 Main PID: 2174 (httpd)
   Status: "Processing requests..."
   CGroup: /system.slice/httpd.service
           ├─2174 /usr/sbin/httpd -DFOREGROUND
           ├─2177 /usr/bin/logger -thttpd -plocal6.err
           ├─2178 /usr/bin/logger -thttpd -plocal6.notice
           ├─2179 /usr/sbin/httpd -DFOREGROUND
           ├─2180 /usr/sbin/httpd -DFOREGROUND
           ├─2181 /usr/sbin/httpd -DFOREGROUND
           ├─2182 /usr/sbin/httpd -DFOREGROUND
           ├─2183 /usr/sbin/httpd -DFOREGROUND
           └─2184 /usr/sbin/httpd -DFOREGROUND

おつかれさまでした。pgadmin4 の構築がおわりました。ブラウザを起動してサーバのアドレス(http://IPアドレス/pgadmin4/)にアクセスしてみてください。 pgadmin4 が起動してメールアドレスとパスワード入力欄が表示されるはずです。

pgadmin4-login

ログインができましたら【File】【Preference】【Binary paths】【PostgreSQL Binary Path】に【/usr/pgsql-9.6/bin/】と入力しておきます。

pgadmin4-preference

Internal Server Error が表示されたら今までの設定を見直します。SELinux の設定も見直します。私は SELinux のことはさっぱりなのでここでは扱いません。

アクセスすらできないときはファイヤーウォールを忘れてないか確認します。


# firewall-cmd --add-service http
success

# firewall-cmd --add-service http --permanent
success

参考外部記事

注釈

  • 注1 ja_JP.UTF-8 を指定すると lower 関数で 【A】が【a】になるらしいです。

シェアする

コメント

トラックバック

トラックバック用URL
http://www.youyoukankan.net/cms/action.php?action=plugin&name=TrackBack&tb_id=196
トラックバック
このエントリにトラックバックはありません