PostgreSQL:インストールと最初のデータベース
VDSへのPostgreSQLのインストール、ロールと最初のデータベース、pg_hba.confでの認証の仕組み、接続エラーのトラブルシューティングを説明します。
更新日 2026年8月23日
PostgreSQLはPython、Node.js、Goのアプリケーションで既定の選択肢です。MySQLよりもデータを厳密に扱い、複雑なクエリをより適切に処理します。
インストール
apt update && apt install -y postgresql postgresql-contrib # Debian, Ubuntu
systemctl enable --now postgresql
AlmaLinuxとCentOS Streamではクラスタを手動で作成する必要があります。
dnf install -y postgresql-server postgresql-contrib
postgresql-setup --initdb
systemctl enable --now postgresql
バージョンとステータスを確認します。
sudo -u postgres psql -c "SELECT version();"
ロールとデータベース
PostgreSQLではユーザーをロールと呼びます。プロジェクトごとに個別のロールを作成します。
sudo -u postgres psql
CREATE ROLE shop WITH LOGIN PASSWORD 'long-random-password';
CREATE DATABASE shop OWNER shop ENCODING 'UTF8';
REVOKE ALL ON DATABASE shop FROM PUBLIC;
アプリケーション用の接続文字列:
postgresql://shop:password@127.0.0.1:5432/shop
システムユーザーから確認します。
psql "postgresql://shop:password@127.0.0.1:5432/shop" -c "\dt"
認証
誰がどこからログインできるかは2つのファイルで決まります。
/etc/postgresql/17/main/postgresql.conf:
listen_addresses = 'localhost'
port = 5432
/etc/postgresql/17/main/pg_hba.conf — ルールは上から下へ読み込まれ、最初に一致したものが適用されます。
local all postgres peer
local all all scram-sha-256
host all all 127.0.0.1/32 scram-sha-256
peer方式は「システムユーザーがロールと一致する」という意味です。そのためsudo -u postgres psqlはパスワードなしで動作しますが、別のユーザーから同じコマンドを実行しても動作しません。
編集後はsystemctl reload postgresqlを実行します。trust方式は絶対に使用しないでください。パスワードなしで誰でも接続できてしまいます。
外部からのアクセスについては、リモートアクセスをお読みください。アドレスで制限せずにポートを外部へ開放してはいけません。
よくあるエラー
| 症状 | 原因 |
|---|---|
role "..." does not exist | ロールを持たないシステムユーザーで接続しています |
password authentication failed | pg_hba.confのルールが別の方式を要求しているか、パスワードが設定されていません |
could not connect to server: No such file or directory | サービスが起動していないか、別のポートを使用しています |
permission denied for schema public | バージョン15以降ではpublicに対する権限を明示的に付与する必要があります: GRANT ALL ON SCHEMA public TO shop; |
FATAL: sorry, too many clients | max_connectionsが枯渇しています。アプリケーション側でプールを設定してください |
ログ: /var/log/postgresql/またはjournalctl -u postgresql。
次のステップ
- ティアごとのメモリチューニング — VDS-1では既定値が明らかに低すぎます。
- バックアップ —
pg_dumpとリストア。 - 別のサーバーからのデータベース移行。
アプリケーションにスーパーユーザーロールを与えないでください。通常のデータベース所有者ロールで必要なことはすべて行えますが、移行が失敗しても隣接するデータベースを削除することはできません。