検証済みのドキュメントです
クラウドサーバーを作成し、このドキュメントのコマンドを最初から最後までそのまま実行して確認したドキュメントです。
- OS
- Ubuntu 24.04.5 LTS · x86_64
- インストールしたバージョン
- PostgreSQL 16.15 (16.15-0ubuntu0.24.04.1)
- テストサーバー
- DigitalOcean · 1 vCPU / 1 GB RAM / 25 GB SSD (s-1vcpu-1gb, sgp1)
- 最終確認
- 2026-10-09
このドキュメントにはアフィリエイトリンクが含まれています。リンクから登録するとコードサンドが手数料を受け取ることがありますが、内容や評価には影響しません。
Ubuntu 24.04 サーバーに PostgreSQL 16 をインストールし、外部接続用のユーザーとデータベースを作成したあと、自分の PC からだけ接続できるように外部接続の設定とファイアウォールまで設定します。
1. 準備するもの
- Ubuntu 24.04 LTS サーバー 1 台(メモリ 1GB 以上を推奨)
sudo権限のあるアカウントで SSH 接続できること- 外部から接続する PC のグローバル IP アドレス(例:
203.0.113.10)
サーバーがない場合は、DigitalOcean の最小構成の Droplet(1 vCPU・1GB)を作成してみてください。この Droplet でも PostgreSQL 16 は十分にインストールできます。このドキュメントのすべての手順は、Droplet(1 vCPU・メモリ 1GB・25GB SSD・Ubuntu 24.04・シンガポール)でサーバーを作成して確認しました。
2. PostgreSQL のインストール
Ubuntu 24.04 の標準リポジトリには PostgreSQL 16 が含まれています。パッケージ一覧を更新してからインストールします。
sudo apt update
sudo apt install -y postgresql postgresql-contribインストールが終わったら、インストールされたバージョンを確認します。
psql --versionpsql (PostgreSQL) 16.15 (Ubuntu 16.15-0ubuntu0.24.04.1)3. サービスの状態確認
インストールが終わると、デフォルトのクラスター 16/main が自動で作成され、5432 番ポートで実行されます。
pg_lsclustersVer Cluster Port Status Owner Data directory Log file
16 main 5432 online postgres /var/lib/postgresql/16/main /var/log/postgresql/postgresql-16-main.logsudo systemctl status postgresql@16-main --no-pager● postgresql@16-main.service - PostgreSQL Cluster 16-main
Loaded: loaded (/usr/lib/systemd/system/postgresql@.service; enabled-runtime; preset: enabled)
Active: active (running) since Fri 2026-10-09 10:42:19 UTC; 20s ago次に、PostgreSQL に接続できるか確認します。インストール直後は、Linux アカウント postgres でしか接続できません。
sudo -u postgres psql -c "SELECT version();" version
------------------------------------------------------------------------------------------------------------------------------------------
PostgreSQL 16.15 (Ubuntu 16.15-0ubuntu0.24.04.1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0, 64-bit
(1 row)4. ユーザーとデータベースの作成
アプリケーションでは、管理者アカウントである 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 RLS5. サーバー上での接続確認
パスワードで接続するには、-h localhost を付ける必要があります。こうすると TCP で接続し、パスワードを確認します。
psql -h localhost -U appuser -d appdb -c "\conninfo"Password for user appuser:
You are connected to database "appdb" as user "appuser" on host "localhost" (address "::1") at port "5432".
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)6. 外部接続の許可
デフォルトの設定では localhost からの接続しか許可していません。外部からの接続を許可するには、2 つのファイルを編集する必要があります。
まず postgresql.conf で、外部のアドレスからも接続を受け付けられるように listen_addresses を変更します。
sudo sed -i "s/^#listen_addresses = 'localhost'/listen_addresses = '*'/" /etc/postgresql/16/main/postgresql.conf
grep -n '^listen_addresses' /etc/postgresql/16/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/16/main/pg_hba.conf
sudo systemctl restart postgresql5432 番ポートが外部のアドレスでも開いたか確認します。0.0.0.0:5432 が表示されていれば正常です。
sudo ss -tlnp | grep 5432LISTEN 0 200 0.0.0.0:5432 0.0.0.0:* users:(("postgres",pid=4188,fd=6))
LISTEN 0 200 [::]:5432 [::]:* users:(("postgres",pid=4188,fd=7))7. ファイアウォール(ufw)の設定
PostgreSQL の設定とは別に、ファイアウォールでも自分の PC の IP だけが 5432 番ポートに接続できるように許可します。ファイアウォールを有効にする前に、必ず先に SSH を許可してください。SSH を許可せずにファイアウォールを有効にすると、サーバーへの接続が切れてしまいます。
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 がインストールされていれば、サーバーのグローバル IP に接続します。203.0.113.20 はサーバーの IP に置き換えてください。
psql -h 203.0.113.20 -U appuser -d appdb -c "\conninfo"You are connected to database "appdb" as user "appuser" on host "203.0.113.20" at port "5432".
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)PC に psql がない場合は、Docker で PostgreSQL クライアントを実行して接続できます。--rm オプションを付けているので、接続を終えるとコンテナは自動で削除されます。
docker run --rm -it postgres:16-alpine psql -h 203.0.113.20 -U appuser -d appdb出力の SSL connection (protocol: TLSv1.3 …) は、接続が暗号化されているという意味です。Ubuntu の PostgreSQL パッケージは、インストール時に自己署名証明書で SSL をデフォルトで有効にしています。
9. トラブルシューティング
E: Could not get lock /var/lib/apt/lists/lock. It is held by process … (apt-get)
サーバーを作成してから間もない場合は、cloud-init と自動更新が apt を使用中のためこのエラーが出ます。cloud-init status --wait で処理が終わるまで待ってから再実行してください。ロックファイルを自分で削除するとパッケージデータベースが破損することがあるので、削除しないでください。
FATAL: Peer authentication failed for user "appuser"
-h を付けずに接続すると peer 認証が使われるため、このエラーが出ます。psql -h localhost -U appuser -d appdb のように -h localhost を付ければ、パスワードで接続できます。
FATAL: no pg_hba.conf entry for host "203.0.113.10", user "postgres", database "appdb"
接続した IP、ユーザー、データベースの組み合わせが pg_hba.conf にないという意味です。このドキュメントでは appuser が appdb に接続することだけを許可しているので、postgres で外部から接続するとこのエラーが出るのは正常です。ほかのユーザーやデータベースも許可するには、pg_hba.conf に行を追加して sudo systemctl reload postgresql を実行してください。
外部から接続すると応答がないままタイムアウトします
ファイアウォールが接続をブロックしています。sudo ufw status に自分の PC の IP があるか、自宅や会社のグローバル IP が変わっていないかを確認してください。クラウド事業者のファイアウォール(DigitalOcean Cloud Firewall、AWS セキュリティグループなど)も併用している場合は、そちらでも 5432 番ポートを許可する必要があります。
10. 削除
PostgreSQL とデータをすべて削除するには、以下のコマンドを実行します。データベースファイルまですべて削除されるため、必要なデータは先に pg_dump でバックアップしてください。
sudo apt purge -y 'postgresql*'
sudo rm -rf /var/lib/postgresql /etc/postgresql
sudo ufw delete allow from 203.0.113.10 to any port 5432 proto tcp実際に試してみる
サーバーがなければ、以下のサービスで数分あれば Ubuntu サーバーを作れます。 このドキュメントは DigitalOcean で検証しました。
このドキュメントは役に立ちましたか? 間違いや変わった点があればお知らせください。
内容の修正を依頼