検証済みのドキュメントです
クラウドサーバーを作成し、このドキュメントのコマンドを最初から最後までそのまま実行して確認したドキュメントです。
- OS
- Ubuntu 24.04.5 LTS · x86_64
- インストールしたバージョン
- PostgreSQL 17.11 (17.11-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 17 をインストールし、外部接続用のユーザーとデータベースを作成したあと、自分の PC からだけ接続できるように外部接続の設定とファイアウォールまで設定します。
1. 準備するもの
- Ubuntu 24.04 LTS サーバー 1 台(メモリ 1GB 以上を推奨)
sudo権限のあるアカウントで SSH 接続できること- 外部から接続する PC のグローバル IP アドレス(例:
203.0.113.10)
サーバーがない場合は、DigitalOcean の最小構成の Droplet(1 vCPU・1GB)を作成してみてください。この Droplet でも PostgreSQL 17 は十分にインストールできます。このドキュメントのすべての手順は、Droplet(1 vCPU・メモリ 1GB・25GB SSD・Ubuntu 24.04・シンガポール)でサーバーを作成して確認しました。
2. PostgreSQL 公式リポジトリの追加
Ubuntu 24.04 の標準リポジトリには PostgreSQL 16 しかありません。PostgreSQL 17 は、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 -yThis 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:1 https://apt.postgresql.org/pub/repos/apt noble-pgdg InRelease [189 kB]
Get:3 https://apt.postgresql.org/pub/repos/apt noble-pgdg/main amd64 Packages [897 kB]
You can now start installing packages from apt.postgresql.org.追加されたリポジトリの設定を確認します。
cat /etc/apt/sources.list.d/pgdg.sourcesTypes: deb
URIs: https://apt.postgresql.org/pub/repos/apt
Suites: noble-pgdg
Components: main
Signed-By: /usr/share/postgresql-common/pgdg/apt.postgresql.org.gpg3. PostgreSQL 17 のインストール
リポジトリ追加スクリプトがパッケージ一覧をすでに更新しているので、そのままインストールします。パッケージ名にバージョン(17)を付けると、PostgreSQL 17 がインストールされます。
sudo apt install -y postgresql-17インストールが終わったら、インストールされたバージョンを確認します。バージョンの後ろの pgdg24.04 は、公式リポジトリから取得した Ubuntu 24.04 用のパッケージという意味です。
psql --versionpsql (PostgreSQL) 17.11 (Ubuntu 17.11-1.pgdg24.04+2)4. サービスの状態確認
インストールが終わると、デフォルトのクラスター 17/main が自動で作成され、5432 番ポートで実行されます。
pg_lsclustersVer Cluster Port Status Owner Data directory Log file
17 main 5432 online postgres /var/lib/postgresql/17/main /var/log/postgresql/postgresql-17-main.logsudo systemctl status postgresql@17-main --no-pager● postgresql@17-main.service - PostgreSQL Cluster 17-main
Loaded: loaded (/usr/lib/systemd/system/postgresql@.service; enabled-runtime; preset: enabled)
Active: active (running) since Fri 2026-10-09 11:46:32 UTC; 12s ago次に、PostgreSQL に接続できるか確認します。インストール直後は、Linux アカウント postgres でしか接続できません。
sudo -u postgres psql -c "SELECT version();" version
---------------------------------------------------------------------------------------------------------------------------------------
PostgreSQL 17.11 (Ubuntu 17.11-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)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/17/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 で接続することはできません。この状態を維持し、外部接続は下で作成する専用ユーザーにだけ許可します。
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:
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, ALPN: postgresql)7. 外部接続の許可
デフォルトの設定では localhost からの接続しか許可していません。外部からの接続を許可するには、2 つのファイルを編集する必要があります。
まず postgresql.conf で、外部のアドレスからも接続を受け付けられるように listen_addresses を変更します。'*' は、サーバーのすべてのアドレスで接続を受け付けるという意味です。
sudo sed -i "s/^#listen_addresses = 'localhost'/listen_addresses = '*'/" /etc/postgresql/17/main/postgresql.conf
grep -n '^listen_addresses' /etc/postgresql/17/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/17/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=6081,fd=6))
LISTEN 0 200 [::]:5432 [::]:* users:(("postgres",pid=6081,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 statusStatus: 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:17-alpine psql -h 203.0.113.20 -U appuser -d appdb -c "\conninfo"Password for user appuser:
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, ALPN: postgresql)出力の SSL connection (protocol: TLSv1.3 …) は、接続が暗号化されているという意味です。公式リポジトリの 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/17/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-17 postgresql-client-17 postgresql-common postgresql-client-common
sudo apt autoremove -y
sudo rm -rf /var/lib/postgresql /etc/postgresqlDEBIAN_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 tcpRule deletedPostgreSQL のパッケージが残っていないか確認します。0 が表示されれば、すべて削除されています。
dpkg -l | grep -c postgresql0実際に試してみる
サーバーがなければ、以下のサービスで数分あれば Ubuntu サーバーを作れます。 このドキュメントは DigitalOcean で検証しました。
このドキュメントは役に立ちましたか? 間違いや変わった点があればお知らせください。
内容の修正を依頼