Skip to content
VDS · データベース

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 failedpg_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 clientsmax_connectionsが枯渇しています。アプリケーション側でプールを設定してください

ログ: /var/log/postgresql/またはjournalctl -u postgresql。

次のステップ

アプリケーションにスーパーユーザーロールを与えないでください。通常のデータベース所有者ロールで必要なことはすべて行えますが、移行が失敗しても隣接するデータベースを削除することはできません。