Ubuntu 24.04 に PostgreSQL 18 をインストールして外部接続を許可する方法

Ubuntu 24.04 サーバーに PostgreSQL 公式リポジトリを追加して PostgreSQL 18 をインストールし、外部接続用のユーザーとデータベースを作成したあと、自分の PC からだけ接続できるように外部接続の設定とファ…

Ubuntu 24.04PostgreSQL 18x86_64約 19 分

検証済みのドキュメントです

クラウドサーバーを作成し、このドキュメントのコマンドを最初から最後までそのまま実行して確認したドキュメントです。

OS
Ubuntu 24.04.5 LTS · x86_64
インストールしたバージョン
PostgreSQL 18.6 (18.6-1.pgdg24.04+2)
テストサーバー
DigitalOcean · 1 vCPU / 1 GB RAM / 25 GB SSD (s-1vcpu-1gb, sgp1)
最終確認
2026-10-09

このドキュメントにはアフィリエイトリンクが含まれています。リンクから登録するとコードサンドが手数料を受け取ることがありますが、内容や評価には影響しません。

Ubuntu 24.04 サーバーに PostgreSQL 公式リポジトリを追加して PostgreSQL 18 をインストールし、外部接続用のユーザーとデータベースを作成したあと、自分の PC からだけ接続できるように外部接続の設定とファイアウォールまで設定します。

1. 準備するもの

  • Ubuntu 24.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 24.04・シンガポール)でサーバーを作成して確認しました。

2. PostgreSQL 公式リポジトリの追加

Ubuntu 24.04 の標準リポジトリには PostgreSQL 16 しかありません。PostgreSQL 18 は、PostgreSQL 公式リポジトリ(apt.postgresql.org)を追加してインストールします。まず、リポジトリ追加スクリプトが入っている postgresql-common パッケージをインストールします。

sudo apt update
sudo apt install -y postgresql-common

リポジトリ追加スクリプトを実行します。スクリプトはリポジトリの署名鍵とリポジトリのアドレスを登録し、パッケージ一覧を更新します。-y オプションは、「Press Enter to continue」の確認の質問なしで進めるという意味です。

sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh -y
This script will enable the PostgreSQL APT repository on apt.postgresql.org on
your system. The distribution codename used will be noble-pgdg.

Using keyring /usr/share/postgresql-common/pgdg/apt.postgresql.org.gpg
Writing /etc/apt/sources.list.d/pgdg.sources ...

Running apt-get update ...
Get:2 https://apt.postgresql.org/pub/repos/apt noble-pgdg InRelease [189 kB]
Get:5 https://apt.postgresql.org/pub/repos/apt noble-pgdg/main amd64 Packages [897 kB]

You can now start installing packages from apt.postgresql.org.

3. PostgreSQL 18 のインストール

リポジトリ追加スクリプトがパッケージ一覧をすでに更新しているので、そのままインストールします。パッケージ名にバージョン(18)を付けると、PostgreSQL 18 がインストールされます。

sudo apt install -y postgresql-18
Creating 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 17 をインストールすると Data page checksums are disabled. と表示され、18 からはデフォルトで有効になります。

インストールが終わったら、インストールされたバージョンを確認します。バージョンの後ろの pgdg24.04 は、公式リポジトリから取得した Ubuntu 24.04 用のパッケージという意味です。

psql --version
psql (PostgreSQL) 18.6 (Ubuntu 18.6-1.pgdg24.04+2)

4. サービスの状態確認

インストールが終わると、デフォルトのクラスター 18/main が自動で作成され、5432 番ポートで実行されます。

pg_lsclusters
Ver Cluster Port Status Owner    Data directory              Log file
18  main    5432 online postgres /var/lib/postgresql/18/main /var/log/postgresql/postgresql-18-main.log
sudo 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 Fri 2026-10-09 11:56:30 UTC; 10s ago
             ├─5646 "postgres: 18/main: io worker 0"
             ├─5647 "postgres: 18/main: io worker 1"
             ├─5648 "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-1.pgdg24.04+2) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0, 64-bit
(1 row)

データページチェックサムが有効になっているかも確認します。

sudo -u postgres psql -c "SHOW data_checksums;"
 data_checksums
----------------
 on
(1 row)

5. 基本のセキュリティ設定の確認

外部接続を許可する前に、パスワードの保存方式と接続許可ルールのデフォルト値を確認します。

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.conf
local   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-256

pg_hba.conf は、誰がどこから接続できるかを決めるファイルです。local の行はサーバー上のソケット接続で、Linux アカウント名と DB ユーザー名が一致している必要がある peer 認証を使います。host の行は TCP 接続で、今はサーバー自身のアドレス(127.0.0.1、::1)だけをパスワードで許可しています。管理者アカウント postgres はパスワードがなく peer でしか接続できないので、外部から postgres で接続することはできません。この状態を維持し、外部接続は下で作成する専用ユーザーにだけ許可します。

6. ユーザーとデータベースの作成

アプリケーションでは、管理者アカウントである 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          | 5979
 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 なら接続が暗号化されています。

7. 外部接続の許可

デフォルトの設定では 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.conf
60: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 postgresql
host    appdb    appuser    203.0.113.10/32    scram-sha-256

5432 番ポートが外部のアドレスでも開いたか確認します。0.0.0.0:5432 が表示されていれば正常です。

sudo ss -tlnp | grep 5432
LISTEN 0      200          0.0.0.0:5432      0.0.0.0:*    users:(("postgres",pid=6112,fd=6))
LISTEN 0      200             [::]:5432         [::]:*    users:(("postgres",pid=6112,fd=7))

8. ファイアウォール(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 status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
5432/tcp                   ALLOW       203.0.113.10
OpenSSH (v6)               ALLOW       Anywhere (v6)

9. 自分の 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)は、今の接続が暗号化されているという意味です。公式リポジトリの PostgreSQL パッケージは、インストール時に自己署名証明書で SSL をデフォルトで有効にしています。

10. トラブルシューティング

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"

パスワードが間違っているという意味です。手順 6 の CREATE ROLE で指定したパスワードを入力したか確認してください。

11. 削除

PostgreSQL とデータをすべて削除するには、以下のコマンドを実行します。データベースファイルまですべて削除されるため、必要なデータは先に pg_dump でバックアップしてください。

sudo DEBIAN_FRONTEND=noninteractive apt purge -y postgresql-18 postgresql-client-18 postgresql-common postgresql-client-common
sudo apt autoremove -y
sudo rm -rf /var/lib/postgresql /etc/postgresql

DEBIAN_FRONTEND=noninteractive は、パッケージを削除する間に設定の質問を表示せず、デフォルト値で進めるオプションです。このオプションを付けずに実行すると、Remove PostgreSQL directories when package is purged? という質問が表示されます。データディレクトリは、次の行の rm -rf で削除します。

手順 2 で追加した公式リポジトリも削除し、パッケージ一覧を更新します。

sudo rm /etc/apt/sources.list.d/pgdg.sources
sudo apt update

ファイアウォールに追加した 5432 番ポートのルールも削除します。

sudo ufw delete allow from 203.0.113.10 to any port 5432 proto tcp
Rule deleted

PostgreSQL のパッケージが残っていないか確認します。0 が表示されれば、すべて削除されています。

dpkg -l | grep -c postgresql
0

実際に試してみる

サーバーがなければ、以下のサービスで数分あれば Ubuntu サーバーを作れます。 このドキュメントは DigitalOcean で検証しました。