Установка PostgreSQL на Ubuntu 24.04: кластер, роли, pg_hba.conf и доступ по сети
Ставим PostgreSQL из архива Ubuntu или из репозитория PGDG, создаём базу и пользователя, разбираемся с методами аутентификации в pg_hba.conf и аккуратно открываем доступ по сети. Плюс бэкап через pg_dump и типовые ошибки подключения.
PostgreSQL ставится на Ubuntu из коробки одной командой, но сразу после установки к базе нельзя подключиться ни по паролю, ни по сети — так задумано. Разбираем полный путь: установка, кластер, роли, pg_hba.conf и сетевой доступ, который не превращает сервер в дырявый.
Выбираем версию и источник
В архиве Ubuntu 24.04 лежит PostgreSQL 16, в 22.04 — PostgreSQL 14. Пакет собран под дистрибутив, обновляется вместе с системой и полностью интегрирован с systemd. Если приложение не требует конкретной свежей версии, это правильный выбор.
Репозиторий PGDG (PostgreSQL Global Development Group) нужен в двух случаях: когда требуется версия новее, чем в архиве, или когда нужно держать несколько версий на одной машине.
sudo apt update
sudo apt install -y postgresql postgresql-contrib
postgresql-contrib — набор официальных расширений: pg_stat_statements для анализа запросов, uuid-ossp, pgcrypto, hstore. Ставится вместе с базой, потому что почти всегда что-то из этого понадобится.
Проверяем:
psql --version
systemctl is-active postgresql
sudo -u postgres psql -c "SELECT version();"
Что создалось при установке
Пакет автоматически поднимает кластер main и системного пользователя postgres.
| Путь | Назначение |
|---|---|
/etc/postgresql/16/main/postgresql.conf |
Основные настройки сервера |
/etc/postgresql/16/main/pg_hba.conf |
Правила аутентификации |
/var/lib/postgresql/16/main/ |
Данные кластера |
/var/log/postgresql/ |
Логи |
Цифра в пути — мажорная версия, подставляйте свою. Быстро посмотреть все кластеры и их состояние:
pg_lsclusters
Вывод показывает версию, имя кластера, порт, статус (online/down), владельца и пути. Если кластеров несколько, каждый слушает свой порт: 5432, 5433 и так далее.
Управление сервисом идёт через обычный systemd, механика — в статье про systemd-юниты и systemctl enable:
sudo systemctl status postgresql
sudo systemctl restart postgresql@16-main
Обратите внимание: postgresql.service — это обёртка, реальный кластер работает в postgresql@16-main.service. Рестарт обёртки перезапускает все кластеры сразу.
Заходим в psql и создаём базу
Сразу после установки существует единственная роль postgres, и войти под ней можно только от одноимённого системного пользователя — это метод peer, о нём чуть ниже.
sudo -u postgres psql
Приглашение меняется на postgres=#. Создаём роль под приложение и базу для неё:
CREATE ROLE appuser WITH LOGIN PASSWORD 'СильныйПароль';
CREATE DATABASE appdb OWNER appuser;
\q
Ключевое слово LOGIN обязательно: без него роль создаётся как группа и подключаться ей нельзя. Владелец базы (OWNER) сразу получает полные права на неё — отдельные GRANT для типового приложения не нужны.
Полезные команды внутри psql:
\l список баз
\c appdb переключиться на базу
\dt таблицы текущей базы
\du роли и их атрибуты
\conninfo как именно вы подключены
\q выход
Те же операции можно делать из шелла обёртками пакета:
sudo -u postgres createuser --interactive --pwprompt appuser
sudo -u postgres createdb -O appuser appdb
Настраиваем pg_hba.conf
Файл pg_hba.conf (host-based authentication) решает, кто, откуда, к какой базе и каким способом может подключиться. Правила читаются сверху вниз, применяется первое подходящее — это главное, что нужно про него знать: правило, добавленное в конец файла, не сработает, если выше уже стоит более общее.
Формат строки:
# TYPE DATABASE USER ADDRESS METHOD
local all postgres peer
host appdb appuser 127.0.0.1/32 scram-sha-256
host appdb appuser 10.0.0.0/24 scram-sha-256
Типы подключения:
local— через Unix-сокет, без сети;host— по TCP, с шифрованием или без;hostssl— только по TCP с SSL;hostnossl— только без SSL.
Методы аутентификации, которые реально используются:
| Метод | Как работает | Где уместен |
|---|---|---|
peer |
Имя системного пользователя должно совпадать с именем роли | Локально, для postgres |
scram-sha-256 |
Пароль, современный алгоритм | Основной выбор для приложений |
md5 |
Пароль, устаревший хеш | Только для старых клиентов |
trust |
Без проверки вообще | Никогда на сервере с сетью |
reject |
Явный запрет | Для блокировки конкретных сетей |
trust иногда советуют «чтобы заработало» — это означает, что любой, кто дотянулся до порта, заходит под любой ролью без пароля. На машине с сетевым доступом это прямой путь к потере данных.
После правки файла достаточно перечитать конфигурацию, полный рестарт не нужен:
sudo systemctl reload postgresql
Проверить, что правила применились и в каком порядке они лежат:
SELECT line_number, type, database, user_name, address, auth_method
FROM pg_hba_file_rules;
Запрос показывает разобранный сервером файл — если в строке синтаксическая ошибка, она будет видна в колонке error.
Открываем доступ по сети
По умолчанию PostgreSQL слушает только localhost, и это разумная настройка по умолчанию. Чтобы принять подключения снаружи, нужны три шага — пропуск любого даёт ошибку подключения.
Шаг первый, postgresql.conf:
listen_addresses = 'localhost,10.0.0.5'
port = 5432
Указывайте конкретный адрес интерфейса, а не '*': так база не окажется случайно доступна на публичном интерфейсе.
Шаг второй — правило в pg_hba.conf для нужной подсети (пример выше). Шаг третий — UFW, причём тоже с ограничением по источнику:
sudo ufw allow from 10.0.0.0/24 to any port 5432 proto tcp
Применяем и проверяем:
sudo systemctl restart postgresql
sudo ss -tulpn | grep 5432
Изменение listen_addresses требует именно рестарта — reload его не подхватит.
Если база нужна другому серверу, а не всей подсети, лучший вариант — вообще не открывать порт, а пробросить его через SSH-туннель:
ssh -N -L 5432:localhost:5432 user@db-server
Тогда PostgreSQL остаётся слушать только localhost, а трафик идёт по уже настроенному SSH — про ключи для него написано в статье об SSH-ключах.
Ставим свежую версию из PGDG
Если нужна версия новее, чем в архиве Ubuntu, подключаем официальный репозиторий PostgreSQL:
sudo apt install -y curl ca-certificates
sudo install -d /usr/share/postgresql-common/pgdg
sudo curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc \
-o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc
echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] \
https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" \
| sudo tee /etc/apt/sources.list.d/pgdg.list
sudo apt update
sudo apt install -y postgresql-17
Версия указывается явно в имени пакета. Новый кластер поднимется на следующем свободном порту (5433), старый продолжит работать — это удобно для поэтапной миграции. Посмотреть картину целиком: pg_lsclusters.
Перенос данных между мажорными версиями делается через pg_upgradecluster:
sudo pg_dropcluster 17 main --stop
sudo pg_upgradecluster 16 main
Первая команда убирает пустой кластер новой версии, вторая переносит в неё данные старого. Перед этим — обязательно бэкап.
Делаем бэкап
Логический дамп одной базы:
sudo -u postgres pg_dump -Fc appdb > appdb-$(date +%F).dump
Формат -Fc (custom) сжат и позволяет восстанавливать выборочно отдельные таблицы. Восстановление:
sudo -u postgres pg_restore -d appdb --clean --if-exists appdb-2026-08-12.dump
Все базы вместе с ролями и правами:
sudo -u postgres pg_dumpall > full-$(date +%F).sql
pg_dumpall — единственный способ выгрузить роли и глобальные объекты: pg_dump их не включает, и после восстановления такой базы пользователей придётся создавать заново.
Дамп по расписанию ставится cron-задачей или systemd-таймером, а вывоз копий на другую машину удобно делать rsync. Бэкап, который лежит на том же диске, что и база, бэкапом не является.
Разбираем ошибки подключения
FATAL: Peer authentication failed for user "appuser" — подключаетесь через Unix-сокет, а правило local использует метод peer, требующий совпадения имён системного пользователя и роли. Решения: подключаться по TCP (psql -h 127.0.0.1 -U appuser appdb) либо сменить метод для local на scram-sha-256.
could not connect to server: Connection refused — сервер не слушает этот адрес. Проверьте listen_addresses и sudo ss -tulpn | grep 5432.
no pg_hba.conf entry for host "10.0.0.7" — сервер доступен, но нет подходящего правила. Добавьте строку host с нужной подсетью и сделайте reload.
FATAL: password authentication failed — неверный пароль или роль создана без LOGIN. Пароль меняется так: ALTER ROLE appuser WITH PASSWORD 'НовыйПароль';.
Полная картина всегда в логах:
sudo tail -f /var/log/postgresql/postgresql-16-main.log
Частые вопросы
Какая версия PostgreSQL в Ubuntu 24.04?
PostgreSQL 16 — он в основном архиве, ставится командой sudo apt install postgresql. В Ubuntu 22.04 это версия 14.
Если нужна другая версия, подключается репозиторий PGDG, где доступны все поддерживаемые релизы одновременно, включая свежие.
Как задать пароль для пользователя postgres?
Зайти через peer-доступ и выполнить ALTER ROLE:
sudo -u postgres psql -c "ALTER USER postgres PASSWORD 'НовыйПароль';"
Учтите, что для подключения по паролю к роли postgres понадобится ещё и правило в pg_hba.conf с методом scram-sha-256, иначе локальные соединения продолжат идти через peer.
Где лежит pg_hba.conf в Ubuntu?
В /etc/postgresql/<версия>/main/pg_hba.conf — например, /etc/postgresql/16/main/pg_hba.conf. Это отличается от сборок из исходников, где файл лежит прямо в каталоге данных.
Точный путь для работающего кластера всегда можно спросить у самого сервера: sudo -u postgres psql -c "SHOW hba_file;".
Почему PostgreSQL не принимает подключения извне?
Почти всегда причина в том, что выполнен только один шаг из трёх. Нужны все: listen_addresses в postgresql.conf (с рестартом), правило host в pg_hba.conf (с reload) и открытый порт в UFW.
Проверяйте по цепочке: ss -tulpn | grep 5432 покажет, слушает ли сервер нужный интерфейс; pg_hba_file_rules — какие правила разобраны; ufw status — пускает ли фаервол.
Ставить PostgreSQL пакетом или в Docker?
Пакет удобнее для одиночного сервера, где база живёт годами: автозапуск, логи в /var/log, обновления вместе с системой, штатные pg_upgradecluster и pg_lsclusters.
Контейнер удобнее, когда база — часть composed-приложения и версия должна быть строго зафиксирована. В этом случае обязательно выносите данные в именованный том, иначе они исчезнут вместе с контейнером — см. Docker Compose на Ubuntu.
Что запомнить
sudo apt install postgresql postgresql-contribсразу создаёт кластерmainи рольpostgres; заходить в него — черезsudo -u postgres psql.- В
pg_hba.confприменяется первое подходящее правило сверху — новые строки для конкретных сетей ставьте выше общих. scram-sha-256для приложений,peerдля локальногоpostgres,trust— никогда на сервере с сетью.- Сетевой доступ требует трёх шагов:
listen_addresses(рестарт), правило вpg_hba.conf(reload), порт в UFW. Лучше вместо этого пробросить порт по SSH. - Роли и права выгружает только
pg_dumpall;pg_dumpсохраняет одну базу без глобальных объектов.