Как установить и настроить PostgreSQL на Ubuntu
Практика4 минРедакция Innovialabs
Коротко
Установите PostgreSQL из репозиториев Ubuntu через apt, создайте отдельную роль и базу для приложения, откройте удалённый доступ только для конкретных IP через listen_addresses и pg_hba.conf и подберите shared_buffers, work_mem и число соединений под память VPS.
Короткий путь
На свежем сервере с Ubuntu весь процесс занимает несколько минут:
- Установить пакет
postgresqlчерезapt. - Создать роль и базу данных для приложения.
- Если приложение на другом сервере — разрешить удалённый доступ только для его IP.
- Поправить несколько параметров памяти и перезапустить.
Шаг 1. Установка PostgreSQL
sudo apt update
sudo apt install -y postgresql
sudo systemctl status postgresql
Сервис запускается сразу и добавляется в автозагрузку. Ubuntu поставляет проверенную версию; если нужна более новая мажорная версия, используйте официальный apt-репозиторий PostgreSQL, описанный на странице загрузки PostgreSQL.
Конфигурация лежит в /etc/postgresql/<версия>/main/. Точные пути можно узнать так:
sudo -u postgres psql -c "SHOW config_file;"
sudo -u postgres psql -c "SHOW hba_file;"
Шаг 2. Пользователь и база данных
При установке создаётся системный пользователь и суперпользователь базы postgres. Локально он входит через peer-аутентификацию — по совпадению имени пользователя Linux, без пароля. Используйте его только для администрирования, никогда — в настройках приложения.
sudo -u postgres psql
CREATE ROLE appuser WITH LOGIN PASSWORD 'use-a-long-random-password';
CREATE DATABASE appdb OWNER appuser;
\q
Теперь приложение подключается как appuser к appdb и владеет своими таблицами. Для разных приложений заводите разные роли, а для отчётов при необходимости — отдельную роль только на чтение.
Шаг 3. Удалённый доступ
По умолчанию PostgreSQL слушает только localhost. Если приложение работает на том же сервере, пропустите этот шаг — это самая безопасная схема.
postgresql.conf — на каких сетевых интерфейсах слушать:
listen_addresses = 'localhost,10.0.0.5' # или '*' для всех интерфейсов
pg_hba.conf — кому разрешено подключаться. Добавьте строку только для сервера приложения:
# TYPE DATABASE USER ADDRESS METHOD
host appdb appuser 203.0.113.10/32 scram-sha-256
Затем перезапустите сервис (изменение listen_addresses требует рестарта, для одного pg_hba.conf достаточно reload) и откройте порт в файрволе только для этого IP:
sudo systemctl restart postgresql
sudo ufw allow from 203.0.113.10 to any port 5432 proto tcp
Проверка с сервера приложения:
psql "host=SERVER_IP dbname=appdb user=appuser"
Правила безопасности:
- Никогда не сочетайте
0.0.0.0/0иtrust— это открытая база. - Вместо публикации порта 5432 в интернет лучше приватная сеть между серверами или SSH-туннель.
- Используйте
scram-sha-256, а не устаревшийmd5. Если пароль задавался при другом методе, задайте его заново.
Шаг 4. Базовая настройка памяти для небольшого VPS
Настройки по умолчанию очень консервативны. Распространённая отправная точка для сервера с 2 ГБ RAM, на котором работает только PostgreSQL:
ALTER SYSTEM SET shared_buffers = '512MB';
ALTER SYSTEM SET effective_cache_size = '1536MB';
ALTER SYSTEM SET work_mem = '8MB';
ALTER SYSTEM SET maintenance_work_mem = '128MB';
ALTER SYSTEM SET max_connections = 50;
ALTER SYSTEM SET random_page_cost = 1.1;
ALTER SYSTEM записывает значения в postgresql.auto.conf, который перекрывает postgresql.conf. После этого перезапустите сервис: shared_buffers и max_connections меняются только при рестарте.
| Параметр | Что делает | Ориентир |
|---|---|---|
shared_buffers | Собственный кэш данных PostgreSQL | Около четверти RAM |
effective_cache_size | Подсказка планировщику об общем кэше, включая ОС | От половины до трёх четвертей RAM |
work_mem | Память на одну сортировку или хеш-операцию | Небольшое: тратится на каждую операцию в каждом соединении |
maintenance_work_mem | Память для VACUUM и создания индексов | Больше, чем work_mem |
max_connections | Лимит соединений | Умеренно, с пулером вроде PgBouncer |
random_page_cost | Стоимость случайного чтения с диска | Ниже на SSD |
Если на сервере работает и приложение, уменьшите значения. Проверить, что применилось, можно командой SHOW shared_buffers;.
Частые ошибки
- Подключать приложение под пользователем
postgres. - «Временно» открыть порт 5432 всему интернету.
- Ставить большой
work_mem— много параллельных запросов съедят всю память. - Забыть про бэкапы: настройте
pg_dumpили физическое резервное копирование сразу после установки.