Разберём, как поставить PostgreSQL на свой сервер, завести отдельного пользователя и базу для приложения и подключиться к ней с рабочего компьютера так, чтобы порт базы не торчал в интернет. Актуальная версия на октябрь 2026 года — PostgreSQL 18 (18.6).
Проверено на Ubuntu 24.04 и 26.04. Адрес сервера в примерах — 203.0.113.10, адрес вашего компьютера или второго сервера — 198.51.100.7.
Шаг 1. Установить PostgreSQL
Ubuntu 26.04
В репозитории Ubuntu 26.04 уже 18-я версия:
sudo apt update
sudo apt install -y postgresql
Ubuntu 24.04
Ubuntu 24.04 ставит из своего репозитория PostgreSQL 16 — она поддерживается до ноября 2028 года, и для существующего проекта её достаточно. Для новой установки лучше взять 18-ю из официального репозитория PostgreSQL (PGDG) — его подключает скрипт из пакета postgresql-common:
sudo apt install -y postgresql-common
sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh # нажмите Enter для подтверждения
sudo apt install -y postgresql-18
Сроки поддержки версий — на странице политики версий.
Проверка:
pg_lsclusters
sudo -u postgres psql -c "select version();"
pg_lsclusters должен показать кластер 18 main 5432 online. В Ubuntu и Debian настройки лежат в /etc/postgresql/18/main/, данные — в /var/lib/postgresql/18/main/.
Шаг 2. Создать пользователя и базу для приложения
Не подключайте приложение под суперпользователем postgres. Создайте отдельную роль и базу, владельцем которой она будет:
sudo -u postgres createuser --pwprompt app # спросит пароль для роли app
sudo -u postgres createdb -O app appdb
Владелец базы получает в ней все права, в том числе на создание таблиц в схеме public — с PostgreSQL 15 обычным пользователям это право по умолчанию не даётся, поэтому -O app здесь важен.
Проверка — подключиться как приложение по сети на localhost:
psql -h 127.0.0.1 -U app appdb -c "create table check_t(i int); drop table check_t;"
Пароль хранится в виде хеша SCRAM-SHA-256 — это значение по умолчанию (show password_encryption;).
Шаг 3. Подключиться с компьютера через SSH-туннель
По умолчанию PostgreSQL слушает только localhost — и это правильно. Самый безопасный способ поработать с базой из DBeaver, DataGrip или psql на своём компьютере — пробросить порт через SSH, ничего не открывая на сервере:
ssh -N -L 5433:127.0.0.1:5432 admin@203.0.113.10
Пока команда работает, база сервера доступна у вас на 127.0.0.1:5433:
psql -h 127.0.0.1 -p 5433 -U app appdb
В графических клиентах то же самое настраивается на вкладке SSH: хост сервера, пользователь, ключ — и localhost:5432 как адрес базы. Если вход по ключу ещё не настроен, начните со статьи про SSH-ключи.
Шаг 4. Открыть доступ для одного адреса (если нужен)
Если к базе должен ходить другой сервер, а туннель неудобен, откройте порт только для его адреса и только по TLS.
Слушать внешние интерфейсы — отдельным файлом в conf.d (каталог подключён в postgresql.conf строкой include_dir):
echo "listen_addresses = '*'" | sudo tee /etc/postgresql/18/main/conf.d/10-listen.conf
Разрешить вход роли app в базу appdb с одного адреса, только по шифрованному соединению и паролю:
echo "hostssl appdb app 198.51.100.7/32 scram-sha-256" | sudo tee -a /etc/postgresql/18/main/pg_hba.conf
sudo systemctl restart postgresql
TLS в пакетах Ubuntu включён сразу (ssl = on с самоподписанным сертификатом), поэтому hostssl работает без дополнительной настройки. listen_addresses применяется только после перезапуска, изменения в pg_hba.conf — после sudo systemctl reload postgresql.
И главное — файрвол. Порт открываем только для этого адреса:
sudo ufw allow from 198.51.100.7 to any port 5432 proto tcp
Проверка — с сервера 198.51.100.7:
psql "host=203.0.113.10 dbname=appdb user=app sslmode=require" \
-c "select ssl, version from pg_stat_ssl where pid = pg_backend_pid();"
Ответ t | TLSv1.3 значит, что соединение зашифровано. Попытка без шифрования (sslmode=disable) должна заканчиваться ошибкой no pg_hba.conf entry … no encryption.
sslmode=requireшифрует соединение, но не проверяет, что вы подключились именно к своему серверу. Для полной проверки выпустите сертификат для имени сервера и подключайтесь сsslmode=verify-full.
Если не подключается
| Что видно | В чём дело и что делать |
|---|---|
connection to server … failed: Connection refused |
Сервер не слушает этот адрес: проверьте listen_addresses и перезапуск — в выводе sudo ss -ltnp должна быть строка 0.0.0.0:5432 |
| Подключение висит и обрывается по тайм-ауту | Порт закрыт файрволом: sudo ufw status — есть ли правило для вашего адреса |
no pg_hba.conf entry for host … |
Нет подходящей строки в pg_hba.conf: проверьте адрес, имя базы и роли, hostssl и sslmode клиента; после правки — reload |
password authentication failed for user "app" |
Неверный пароль. Сменить: sudo -u postgres psql -c "\password app" |
permission denied for schema public |
Роль не владелец базы. Сделайте её владельцем: ALTER DATABASE appdb OWNER TO app; и ALTER SCHEMA public OWNER TO app; в этой базе |
Журнал сервера: sudo tail -n 50 /var/log/postgresql/postgresql-18-main.log — причина отказа почти всегда там.
Что дальше
- Перед запуском в работу настройте резервные копии: регулярный
pg_dumpс хранением копий вне сервера. - Если база работает рядом с приложением на небольшом сервере, прикиньте память — в статье о первой настройке сервера есть раздел про файл подкачки.
- Сколько памяти нужно базе и приложению вместе — расчёт по задачам; база в контейнере вместе с приложением — Docker Compose в продакшене.
- Настроить память самой базы — shared_buffers, work_mem, пул соединений PgBouncer — настройка PostgreSQL под память.
- Резервные копии по расписанию с хранением вне сервера — бэкап PostgreSQL: pg_dump, systemd-таймер и restic.
- Подключить к базе приложение на Django или FastAPI — деплой Python-приложения на VPS.