🐘

Ubuntu 22.04にPostgreSQL16を入れる話

2024/09/13に公開

概要

  • Ubuntu22.04にPostgreSQL16を入れる
  • Windows11上のA5M2から接続することを目標とする

注意

  • コマンド類は誤字の無いようにしてますがご自身でも確認の上実行してください。
  • sudoは付けない状態でコマンドを記載する人が多いのでそれに倣っています。
  • 2024年9月初頭時点での情報です。

インストール

良くあるコマンドはこれ

bash
apt install postgresql postgresql-contrib

実際にはこのコマンドを実行するとPostgreSQL14がインストールされます。
これはUbuntu公式のパッケージアーカイブに登録されているPostgreSQLの中で最新のものが14(2024年9月9日現在)なのでこのような挙動となります。

正しくPostgreSQL16を入れるにはこうします。

bash
# セットアップ用のスクリプトを入手
apt install -y postgresql-common
# PostgreSQL Global Development Groupが管理するリポジトリを追加
/usr/share/postgresql-common/pgdg/apt.postgresql.org.sh

#その上でインストールしたいバージョン番号を明記しインストール
apt install postgresql-16 postgresql-contrib

インストールについての説明書きはこのあたり:
https://wiki.postgresql.org/wiki/Apt
https://www.postgresql.org/download/linux/ubuntu/

セットアップ

そもそもインストールできてるか確認する

bash
systemctl stasus postgresql.service
#表示されたらqを押して閉じる
systemctl status postgresql@16-main.service
#表示されたらqを押して閉じる
#それぞれ(code=exited, status=0/SUCCESS)みたいな表示があれば良い

psqlを起動

bash
# psqlはユーザー名をチェックしているのでpostgresユーザーを名乗る
su - postgres #用が済めばexitで元に戻る
#パスワードを求められるが初期は未設定なので意味無し
#別コマンドで設定するか、sudoを付与して認証を無視する

#起動する
psql #用が済めばexitで元に戻る

接続用にユーザーを作成する

psql
#ユーザー作成
CREATE USER testuser WITH PASSWORD 'testpass';
#ユーザー一覧を表示
\du

DBを作成する

psql
CREATE DATABASE testdb OWNER testuser;
#DB一覧を表示
\l

接続設定する

bash
vi /etc/postgresql/16/main/postgresql.conf
# sudoがないと書き込めないので注意
# viやvimの使い方は正直むずいので調べつつ操作してください
# iを入力して挿入モード
# 編集が終わればEsc→:wqを入力して終了(コロンも入力する)とだけ覚えてればどうにかなります
# :q!とすれば保存せず終了も可能です

設定を一部抜粋
基本的にはファイルの下の方にあるlisten_addressesのみ変えればよいです

postgresql.conf
#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------

# - Connection Settings -

listen_addresses = '*'          # what IP address(es) to listen on;
                                        # comma-separated list of addresses;
                                        # defaults to 'localhost'; use '*' for all
                                        # (change requires restart)
port = 5433                             # (change requires restart)                max_connections = 100                   # (change requires restart)
#reserved_connections = 0               # (change requires restart)
#superuser_reserved_connections = 3     # (change requires restart)
unix_socket_directories = '/var/run/postgresql' # comma-separated list of directories
                                        # (change requires restart)
#unix_socket_group = ''                 # (change requires restart)
#unix_socket_permissions = 0777         # begin with 0 to use octal notation

認証設定する
testuserの行を参考に記述してください(記載したアドレスは例示用です)

  1. 外部からなのでhost
  2. 作成したデータベース領域にのみアクセスさせるためにtestdb
  3. ユーザー名
  4. 接続元IP(今回のシチュエーションではWindows11マシンのIPを入れる)
  5. 認証方式 passwordを標準的にハッシュ化して検証するならこれ trustはパスワード無しに常に許可
bash
vi /etc/postgresql/16/main/pg_hba.conf
pg_hba.conf
# DO NOT DISABLE!
# If you change this first entry you will need to make sure that the
# database superuser can access the database using some other method.
# Noninteractive access to all databases is required during automatic
# maintenance (custom daily cronjobs, replication, and similar tasks).
#
# Database administrative login by Unix domain socket
local   all             postgres                                peer

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            scram-sha-256
host    testdb          testuser        192.0.2.1/32            scram-sha-256
# IPv6 local connections:
host    all             all             ::1/128                 scram-sha-256
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            scram-sha-256

終われば再読み込み

bash
systemctl restart postgresql.service

#systemctl restart postgresql@16-main.service
#こっちは上のと連動して再起動するっぽいので不要

接続

ポートを開ける
ufwとかiptablesとかありますが、当環境ではufwを使用しているので一例

bash
#5433ポートへの通信を許可
ufw allow from any to any port 5433
#変更したら再読み込みを忘れずに
ufw reload

#なお、一覧を見たい場合は
ufw status numbered
#削除したい場合は
ufw delete {上で出てきたルールの番号}

A5M2でいい感じに設定する
データベース→データベースの追加と削除→追加をクリック

A5M2スクリーンショット(追加するデータベースの接続タイプを選択)

このような感じで設定

  • サーバー名はIPアドレスが入ります。
  • ポート番号は今回だと5433です(postgresql.confと揃える)
  • データベース名はCREATE DATABASEで作成したものが入ります
  • ユーザーIDはCREATE USERで作成したものが入ります。
  • パスワードもCREATE USERで指定したものが入ります。

テスト接続が通ればOKを押して保存しておきます。

あとは好きにスキーマでもテーブルでも作成して動かせば良いと思います!

余談

今回、自分の環境ではTailscale越しに接続してます。なので、UFWの設定は実は自分の環境では不要でした。一般的な環境では必要そうなので掲載してますが、ミスってたらすみません。

また、リモートにDBサーバーを建てていて、通信経路に心配がある場合はSSH経由での通信を行うように設定するか、SSLによる暗号化を有効化する必要があるかもしれません。
上述の通り、こちらの環境ではTailscaleがあるので特に不要かと考えて説明してません。

Discussion