検証済みのドキュメントです
クラウドサーバーを作成し、このドキュメントのコマンドを最初から最後までそのまま実行して確認したドキュメントです。
- OS
- Ubuntu 26.04.1 LTS · x86_64
- インストールしたバージョン
- PostgreSQL 18.6 (18.6-0ubuntu0.26.04.1)
- テストサーバー
- DigitalOcean · 1 vCPU / 1 GB RAM / 25 GB SSD (s-1vcpu-1gb, sgp1)
- 最終確認
- 2026-10-13
このドキュメントにはアフィリエイトリンクが含まれています。リンクから登録するとコードサンドが手数料を受け取ることがありますが、内容や評価には影響しません。
Ubuntu 26.04 サーバーに標準リポジトリの PostgreSQL 18 をインストールし、外部接続用のユーザーとデータベースを作成したあと、自分の PC からだけ接続できるように外部接続の設定とファイアウォールまで設定します。
1. 準備するもの
- Ubuntu 26.04 LTS サーバー 1 台(メモリ 1GB 以上を推奨)
sudo権限のあるアカウントで SSH 接続できること- 外部から接続する PC のグローバル IP アドレス(例:
203.0.113.10)
サーバーがない場合は、DigitalOcean の最小構成の Droplet(1 vCPU・1GB)を作成してみてください。この Droplet でも PostgreSQL 18 は十分にインストールできます。このドキュメントのすべての手順は、Droplet(1 vCPU・メモリ 1GB・25GB SSD・Ubuntu 26.04・シンガポール)でサーバーを作成して確認しました。
2. PostgreSQL 18 のインストール
Ubuntu 26.04 の標準リポジトリには PostgreSQL 18 が含まれています。まず、インストールされるバージョンを確認します。
apt-cache policy postgresql | head -4postgresql:
Installed: (none)
Candidate: 18+290ubuntu1
Version table:postgresql は Ubuntu の標準の PostgreSQL バージョンをインストールするパッケージのため、バージョンが 18+290ubuntu1 のように表示されます。先頭の 18 が PostgreSQL のバージョンです。パッケージ一覧を更新してからインストールします。
sudo apt update
sudo apt install -y postgresql postgresql-contribCreating new PostgreSQL cluster 18/main ...
/usr/lib/postgresql/18/bin/initdb -D /var/lib/postgresql/18/main --auth-local peer --auth-host scram-sha-256 --no-instructions
Data page checksums are enabled.インストール中に、デフォルトのクラスターを作成する出力が表示されます。Data page checksums are enabled. は、データページチェックサムが有効になったという意味です。データページチェックサムは、ディスクからデータを読み込むときに、保存された内容が破損していないかを検査する機能で、PostgreSQL 18 からデフォルトで有効になります。Ubuntu 26.04 では postgresql-contrib は別のパッケージではなく postgresql-18 パッケージに含まれているため、インストール一覧には postgresql だけが表示されます。
インストールが終わったら、インストールされたバージョンを確認します。バージョンの後ろの 0ubuntu0.26.04.1 は、Ubuntu 26.04 の標準リポジトリのパッケージという意味です。
psql --versionpsql (PostgreSQL) 18.6 (Ubuntu 18.6-0ubuntu0.26.04.1)3. サービスの状態確認
インストールが終わると、デフォルトのクラスター 18/main が自動で作成され、5432 番ポートで実行されます。
pg_lsclustersVer Cluster Port Status Owner Data directory Log file
18 main 5432 online postgres /var/lib/postgresql/18/main /var/log/postgresql/postgresql-18-main.logsudo systemctl status postgresql@18-main --no-pager● postgresql@18-main.service - PostgreSQL Cluster 18-main
Loaded: loaded (/usr/lib/systemd/system/postgresql@.service; enabled-runtime; preset: enabled)
Active: active (running) since Tue 2026-10-13 07:59:38 UTC; 12s ago
├─5158 "postgres: 18/main: io worker 0"
├─5159 "postgres: 18/main: io worker 1"
├─5160 "postgres: 18/main: io worker 2"プロセス一覧に io worker が 3 つ表示されています。PostgreSQL 18 で追加された非同期 I/O 機能の作業プロセスです。この方式は io_method の設定で決まり、デフォルト値は worker です。
sudo -u postgres psql -c "SHOW io_method;" io_method
-----------
worker
(1 row)次に、PostgreSQL に接続できるか確認します。インストール直後は、Linux アカウント postgres でしか接続できません。
sudo -u postgres psql -c "SELECT version();" version
---------------------------------------------------------------------------------------------------------------------------------
PostgreSQL 18.6 (Ubuntu 18.6-0ubuntu0.26.04.1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 15.2.0-16ubuntu1) 15.2.0, 64-bit
(1 row)データページチェックサムが有効になっているかも確認します。
sudo -u postgres psql -c "SHOW data_checksums;" data_checksums
----------------
on
(1 row)4. 基本のセキュリティ設定の確認
外部接続を許可する前に、パスワードの保存方式と接続許可ルールのデフォルト値を確認します。
sudo -u postgres psql -c "SHOW password_encryption;" password_encryption
---------------------
scram-sha-256
(1 row)scram-sha-256 は、パスワードをそのまま保存せずにハッシュで保存し、接続するときもパスワードをそのまま送らない方式です。デフォルト値がすでに scram-sha-256 なので、変更する必要はありません。
sudo grep -v -E '^#|^$' /etc/postgresql/18/main/pg_hba.conflocal all postgres peer
local all all peer
host all all 127.0.0.1/32 scram-sha-256
host all all ::1/128 scram-sha-256
local replication all peer
host replication all 127.0.0.1/32 scram-sha-256
host replication all ::1/128 scram-sha-256pg_hba.conf は、誰がどこから接続できるかを決めるファイルです。local の行はサーバー上のソケット接続で、Linux アカウント名と DB ユーザー名が一致している必要がある peer 認証を使います。host の行は TCP 接続で、今はサーバー自身のアドレス(127.0.0.1、::1)だけをパスワードで許可しています。管理者アカウント postgres はパスワードがなく peer でしか接続できないので、外部から postgres で接続することはできません。この状態を維持し、外部接続は下で作成する専用ユーザーにだけ許可します。
5. ユーザーとデータベースの作成
アプリケーションでは、管理者アカウントである postgres ではなく専用ユーザーで接続するほうが安全です。ユーザー appuser と、このユーザーが所有するデータベース appdb を作成します。パスワードは必ず自分で決めた値に置き換えてください。
sudo -u postgres psql -c "CREATE ROLE appuser WITH LOGIN PASSWORD 'change-this-password';"
sudo -u postgres psql -c "CREATE DATABASE appdb OWNER appuser;"CREATE ROLE
CREATE DATABASEユーザーが作成されたか確認します。
sudo -u postgres psql -c "\du" List of roles
Role name | Attributes
-----------+------------------------------------------------------------
appuser |
postgres | Superuser, Create role, Create DB, Replication, Bypass RLSパスワードで接続するには、-h localhost を付ける必要があります。こうすると TCP で接続し、パスワードを確認します。
psql -h localhost -U appuser -d appdb -c "\conninfo"Password for user appuser:
Connection Information
Parameter | Value
----------------------+------------------------
Database | appdb
Client User | appuser
Host | localhost
Host Address | ::1
Server Port | 5432
Options |
Protocol Version | 3.0
Password Used | true
GSSAPI Authenticated | false
Backend PID | 5988
SSL Connection | true
SSL Library | OpenSSL
SSL Protocol | TLSv1.3
SSL Key Bits | 256
SSL Cipher | TLS_AES_256_GCM_SHA384
SSL Compression | false
ALPN | postgresql
Superuser | off
Hot Standby | off
(19 rows)PostgreSQL 18 の psql は、\conninfo の結果を表で表示します。Password Used が true ならパスワードで接続しており、SSL Connection が true なら接続が暗号化されています。
6. 外部接続の許可
デフォルトの設定では localhost からの接続しか許可していません。外部からの接続を許可するには、2 つのファイルを編集する必要があります。
まず postgresql.conf で、外部のアドレスからも接続を受け付けられるように listen_addresses を変更します。'*' は、サーバーのすべてのアドレスで接続を受け付けるという意味です。
sudo sed -i "s/^#listen_addresses = 'localhost'/listen_addresses = '*'/" /etc/postgresql/18/main/postgresql.conf
grep -n '^listen_addresses' /etc/postgresql/18/main/postgresql.conf60:listen_addresses = '*' # what IP address(es) to listen on;次に、pg_hba.conf に接続を許可する IP、ユーザー、データベースを 1 行で追加します。203.0.113.10 は接続する PC のグローバル IP に置き換えてください。
echo 'host appdb appuser 203.0.113.10/32 scram-sha-256' | sudo tee -a /etc/postgresql/18/main/pg_hba.conf
sudo systemctl restart postgresqlhost appdb appuser 203.0.113.10/32 scram-sha-2565432 番ポートが外部のアドレスでも開いたか確認します。0.0.0.0:5432 が表示されていれば正常です。
sudo ss -tlnp | grep 5432LISTEN 0 200 0.0.0.0:5432 0.0.0.0:* users:(("postgres",pid=6219,fd=6))
LISTEN 0 200 [::]:5432 [::]:* users:(("postgres",pid=6219,fd=7))7. ファイアウォール(ufw)の設定
PostgreSQL の設定とは別に、ファイアウォールでも自分の PC の IP だけが 5432 番ポートに接続できるように許可します。ファイアウォールを有効にする前に、必ず先に SSH を許可してください。SSH を許可せずにファイアウォールを有効にすると、サーバーへの接続が切れてしまいます。--force は、確認の質問なしでファイアウォールを有効にするオプションです。
sudo ufw allow OpenSSH
sudo ufw allow from 203.0.113.10 to any port 5432 proto tcp
sudo ufw --force enable
sudo ufw statusStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
5432/tcp ALLOW 203.0.113.10
OpenSSH (v6) ALLOW Anywhere (v6)8. 自分の PC からの接続確認
PC に psql がない場合は、Docker で PostgreSQL クライアントを実行して接続できます。203.0.113.20 はサーバーの IP に置き換えてください。--rm オプションを付けているので、接続を終えるとコンテナは自動で削除されます。-it は、パスワードを入力できるように端末を接続するオプションです。
docker run --rm -it postgres:18-alpine psql -h 203.0.113.20 -U appuser -d appdb -c "SELECT current_user, inet_server_port(), ssl FROM pg_stat_ssl WHERE pid = pg_backend_pid();"Password for user appuser:
current_user | inet_server_port | ssl
--------------+------------------+-----
appuser | 5432 | t
(1 row)current_user が appuser であれば、外部接続は正常です。ssl の t(true)は、今の接続が暗号化されているという意味です。Ubuntu の PostgreSQL パッケージは、インストール時に自己署名証明書で SSL をデフォルトで有効にしています。
9. トラブルシューティング
FATAL: Peer authentication failed for user "appuser"
-h を付けずに接続すると peer 認証が使われるため、このエラーが出ます。psql -h localhost -U appuser -d appdb のように -h localhost を付ければ、パスワードで接続できます。
connection to server at "203.0.113.20", port 5432 failed: Connection refused
PostgreSQL が外部のアドレスで接続を受け付けていないという意味です。listen_addresses を変更する前に外部から接続すると、このエラーが出ます。grep -n '^listen_addresses' /etc/postgresql/18/main/postgresql.conf で '*' になっているか、変更したあとに sudo systemctl restart postgresql を実行したかを確認してください。
FATAL: no pg_hba.conf entry for host "203.0.113.10", user "postgres", database "appdb", SSL encryption
接続した IP、ユーザー、データベースの組み合わせが pg_hba.conf にないという意味です。このドキュメントでは appuser が appdb に接続することだけを許可しているので、postgres で外部から接続するとこのエラーが出るのは正常です。同じエラーが SSL encryption と no encryption で 2 回表示されるのは、暗号化した接続が拒否されたあと、クライアントが暗号化なしでもう一度試したためです。
FATAL: password authentication failed for user "appuser"
パスワードが間違っているという意味です。手順 5 の CREATE ROLE で指定したパスワードを入力したか確認してください。
10. 削除
PostgreSQL とデータをすべて削除するには、以下のコマンドを実行します。データベースファイルまですべて削除されるため、必要なデータは先に pg_dump でバックアップしてください。
sudo DEBIAN_FRONTEND=noninteractive apt purge -y postgresql postgresql-18 postgresql-client-18 postgresql-contrib postgresql-common postgresql-client-common
sudo apt autoremove -y
sudo rm -rf /var/lib/postgresql /etc/postgresqlDEBIAN_FRONTEND=noninteractive は、パッケージの削除中に設定の質問を表示せず、デフォルト値で進めるオプションです。データディレクトリは最後の行の rm -rf で削除します。
ファイアウォールに追加した 5432 番ポートのルールも削除します。
sudo ufw delete allow from 203.0.113.10 to any port 5432 proto tcpRule deletedPostgreSQL のパッケージが残っていないか確認します。0 が表示されれば、すべて削除されています。
dpkg -l | grep -c postgresql0実際に試してみる
サーバーがなければ、以下のサービスで数分あれば Ubuntu サーバーを作れます。 このドキュメントは DigitalOcean で検証しました。
このドキュメントは役に立ちましたか? 間違いや変わった点があればお知らせください。
内容の修正を依頼