VDS · Базы данных

PostgreSQL: установка и первая база

Установка PostgreSQL на VDS, роли и первая база, устройство аутентификации в pg_hba.conf и разбор ошибок подключения.

Обновлено 23 августа 2026 г.

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 'длинный-случайный-пароль';
CREATE DATABASE shop OWNER shop ENCODING 'UTF8';
REVOKE ALL ON DATABASE shop FROM PUBLIC;

Строка подключения для приложения:

postgresql://shop:пароль@127.0.0.1:5432/shop

Проверка из-под системного пользователя:

psql "postgresql://shop:пароль@127.0.0.1:5432/shop" -c "\dt"

Аутентификация

Два файла определяют, кто и откуда может войти.

/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.

Дальше

Не давайте приложению роль-суперпользователя. Обычная роль-владелец базы умеет всё нужное, но не сможет удалить соседние базы при ошибке в миграции.