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.
Дальше
- Настройка памяти под ступень — на VDS-1 значения по умолчанию заметно занижены.
- Резервные копии —
pg_dumpи восстановление. - Перенос базы с другого сервера.
Не давайте приложению роль-суперпользователя. Обычная роль-владелец базы умеет всё нужное, но не сможет удалить соседние базы при ошибке в миграции.