FreeBSD14にPostgreSQL+pgAdmin4をインストール

開発環境のローカル仮想マシンにPostgreSQLをインストールしたときの覚書。

環境: FreeBSD 14.1, Python 3.9.18, PostgreSQL 15.6


1. PostgreSQL Serverをインストール

pkgからインストールする。

最初はpostgresql16-serverをインストールしたけど、py39-psycopgをインストールしたときにpostgresql15へ置き換えようとするので、postgresql15-serverをインストールし直した。

# pkg search postgresql
# pkg search -f postgresql15-server
# pkg install postgresql15-server

画面に表示された通りに実行。
# sysrc postgresql_enable=yes
# service postgresql initdb
# service postgresql start

データの置き場所などを起動スクリプトで確認。
# less /usr/local/etc/rc.d/postgresql

postgresユーザーになって確認する。
# su - postgres
# pwd

/var/db/postgres

ユーザー一覧とデータベース一覧表示。
$ psql
postgres=# \du
postgres=# \l


2. PostgreSQLの文字セット(エンコーディング)を設定

日本語を扱う場合は、ja_JPをを設定してあげないと正しく並び替えできない。

前の記事を参考にする。
参考: PostgresSQLの言語設定(locale)をja_JPにする

OSで提供している言語地域(ロケール)を確認。
# locale -a

「ja_JP.UTF-8」があるのを確認。

PostgreSQLの設定変更。
# su - postgres
$ less data15/postgresql.conf

lc_messages = 'C.UTF-8'                 # locale for system error message
                                        # strings
lc_monetary = 'ja_JP.UTF-8'             # locale for monetary formatting
lc_numeric = 'ja_JP.UTF-8'              # locale for number formatting
lc_time = 'ja_JP.UTF-8'                 # locale for time formatting

lc_messagesを変えるとログメッセージが日本語になって気持ち悪いので変えない。
PostgreSQL再起動。
# service postgresql restart

データベース作成時のデフォルトをja_JPにする。
create databaseはtemplate1をコピーするのでtemplate1データベースを作り直す。
# su - postgres
$ psql
postgres=# select * from pg_database;
postgres=# select datistemplate from pg_database where datname = 'template1';
postgres=# update pg_database set datistemplate = false where datname = 'template1';
postgres=# drop database template1;
postgres=# select * from pg_database;
postgres=# CREATE DATABASE template1 TEMPLATE=template0 LC_COLLATE="ja_JP.UTF-8" LC_CTYPE="ja_JP.UTF-8" IS_TEMPLATE=true;
postgres=# select * from pg_database;
postgres=# quit

データベースを作成してみて確認。
$ psql -c 'create database recruit;'
$ psql -l


3. Windowsからネットワーク経由で接続

開発用なのでWindowsからDBeaverでアクセスできるようにする。

postgresユーザーのパスワードを変更。
# su - postgres
$ psql
postgres=# alter role postgres with password 'pass';
postgres=# quit

rootに戻ってファイヤーウォールの確認。
# service ipfw status

ipfw is not enabled

ファイヤーウォールのサービスは起動していない。

待ち受け中のポート確認。
# netstat -an -p tcp

postgresユーザーになってPostgreSQLの設定変更。
# su - postgres
$ less data15/pg_hba.conf

# Allow access from LAN
host    all             all             192.168.10.0/24         scram-sha-256

$ less data15/postgresql.conf

listen_addresses = '*' 

rootに戻ってPostgreSQL再起動。
# service postgresql restart

待ち受け中のポート確認。
# netstat -an -p tcp

Windowsからtelnetを打ってみる。
PS:> telnet vm-dev2 5432

問題なければDBeaverで接続する。


4. pgAdmin4をインストール(失敗)

本番サーバーのための練習用でpgAdmin4をインストールしてみる。
参考: pgAdmin Download

pgAdmin4用システムディレクトリを作成
# mkdir /var/lib/pgadmin
# mkdir /var/log/pgadmin

Python仮想環境用のディレクトリを作成。
# mkdir -p /home/software/python-venv
# cd /home/software/python-venv

venvを作成して仮想環境に入る。
# python3.9 -m venv pgadmin4
# source pgadmin4/bin/activate

pipの確認とアップグレード。
(pgadmin4)# pip list
(pgadmin4)# pip install --upgrade pip setuptools

pip経由でpgAdmin4のインストール。
(pgadmin4)# pip install pgadmin4

エラー

This package requires Rust >=1.41.0.

C compiler or Python headers are not installed on this system. Try to run:
pkg install gcc python3
error: command '/usr/bin/cc' failed with exit code 1

rootに戻ってRustとgccをインストール。
(pgadmin4)# deactivate
# pkg install rust gcc py39-clang

もう一度仮想環境からpgAdmin4をインストール。
# source pgadmin4/bin/activate
(pgadmin4)# pip install pgadmin4

エラー

psutil/arch/freebsd/sys_socks.c:303:40: error: incompatible integer to pointer conversion passing 'kvaddr_t' (aka 'unsigned long') to parameter of type 'void *' [-Wint-conversion]
              xf = psutil_get_file_from_sock(xup->xu_socket.xso_so);
                                             ^~~~~~~~~~~~~~~~~~~~~
      psutil/arch/freebsd/sys_socks.c:65:33: note: passing argument to parameter 'sock' here
      psutil_get_file_from_sock(void *sock) {
                                      ^
      1 warning and 2 errors generated.
      error: command '/usr/bin/cc' failed with exit code 1
      [end of output]

  note: This error originates from a subprocess, and is likely not a problem with pip.
  ERROR: Failed building wheel for psutil
Failed to build psutil
ERROR: Could not build wheels for psutil, which is required to install pyproject.toml-based projects

psutilのビルドで失敗する。
rootに戻ってpsutilを単独でインストールしてみる。
(pgadmin4)# deactivate
# pkg install psutils py39-psutil

再度pgAdminをインストール。
# source pgadmin4/bin/activate
(pgadmin4)# pip install pgadmin4

同じエラー。
psutilをビルドしようとする。

とりあえず諦めた。
pgAdmin4はそんなに使うことはなかったので、インストールしなくてもいいかもしれない。


Python 3.11でpgadmin4をインストールして実行してみたら同じく失敗する。

      In file included from /usr/include/c++/v1/__algorithm/remove.h:12:
      /usr/include/c++/v1/__algorithm/find.h:23:10: fatal error: '__string/constexpr_c_functions.h' file not found
         23 | #include <__string/constexpr_c_functions.h>
            |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      1 error generated.
      error: command '/usr/bin/cc' failed with exit code 1
      [end of output]

  note: This error originates from a subprocess, and is likely not a problem with pip.
  ERROR: Failed building wheel for greenlet

Python 3.11ではgreenlet 3.0.3のビルドで失敗する。


【関連記事】