ServerAID
Найти гайд, команду, тег… ⌘ K
Серверный стек

Установка 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 сохраняет одну базу без глобальных объектов.

Похожие материалы

Серверный стек

Установка Nextcloud на Ubuntu Server: nginx, PostgreSQL и HTTPS

Поднимаем своё облако на Ubuntu Server 24.04: nginx с PHP-FPM, база в PostgreSQL, сертификат Let's Encrypt и права на каталог данных. Разбираем полный конфиг nginx под Nextcloud, обязательный cron для фоновых задач и настройки, без которых установка ругается на предупреждения безопасности.

Редакция
Серверный стек

Установка nginx на Ubuntu 24.04: пакет, виртуальные хосты, HTTPS и PHP

Ставим nginx на Ubuntu, разбираемся в структуре каталогов sites-available/sites-enabled, поднимаем первый виртуальный хост и включаем HTTPS. Отдельно — когда стоит взять свежую версию из репозитория nginx.org вместо архива Ubuntu и как подключить PHP-FPM.

Редакция
Серверный стек

Установка Docker на Ubuntu 24.04: официальный репозиторий, проверка, настройка

Ставим Docker Engine из официального репозитория Docker, а не из архива Ubuntu — там пакет отстаёт на месяцы и не содержит compose-плагина. Разбираем полную последовательность: ключ, репозиторий, установка, запуск без sudo, ограничение размера логов и главную ловушку Ubuntu — Docker публикует порты в обход UFW.

Редакция
Серверный стек на Ubuntu: nginx, БД, Docker
Серверный стек

Серверный стек на Ubuntu: nginx, БД, Docker

Этот раздел про инфраструктуру, на которой живёт типичное веб-приложение: фронт-прокси, база данных, контейнеры, кэш. Здесь карта стека и порядок, в котором его обычно поднимают на Ubuntu Server.

Михаил Орлов