PostgreSQL: установка и настройка
В этой статье вы установите PostgreSQL на VPS mHost, включите его автозапуск через systemd, создадите отдельную роль и базу данных, освоите основные команды psql и настроите доступ к серверу — локальный и, если нужно, удалённый — через pg_hba.conf, listen_addresses и файрвол.
Что понадобится
- VPS mHost на Ubuntu 22.04/24.04, Debian 11/12 или AlmaLinux/Rocky Linux 8/9.
- Доступ по SSH под
rootили пользователем с sudo. - IP-адрес компьютера или сервера, с которого будете подключаться удалённо, — понадобится только если нужен доступ к базе снаружи этого VPS (раздел «Удалённый доступ» в шаге 5).
Шаг 1. Установите PostgreSQL
Ubuntu / Debian
apt update
apt install postgresqlapt поставит версию, зафиксированную для вашего релиза дистрибутива, — например, PostgreSQL 14 на Ubuntu 22.04, 16 — на Ubuntu 24.04, 13 — на Debian 11, 15 — на Debian 12. Для большинства задач этого достаточно.
Проверьте установку:
psql --versionЕсли нужна конкретная более свежая версия, чем даёт репозиторий дистрибутива, подключите официальный apt-репозиторий PGDG:
apt install -y postgresql-common ca-certificates
/usr/share/postgresql-common/pgdg/apt.postgresql.org.shСкрипт покажет, что собирается сделать, и спросит подтверждение — согласитесь. После этого поставьте нужную версию:
apt update
apt install postgresql-16Замените 16 на версию, которая нужна вам.
AlmaLinux / Rocky Linux
dnf install postgresql-serverВерсия из AppStream часто отстаёт от актуальных релизов PostgreSQL. Посмотреть, какая версия предлагается по умолчанию (и какие ещё доступны), можно командой:
dnf module list postgresqlДля конкретной свежей версии подключите вместо AppStream официальный репозиторий PGDG (пример для AlmaLinux/Rocky Linux 9 — для версии 8 замените в ссылке EL-9 на EL-8):
dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
dnf -qy module disable postgresql
dnf install -y postgresql16-serverЗамените 16 на нужную версию в имени пакета и во всех путях и именах служб дальше по статье.
Шаг 2. Включите автозапуск и запустите PostgreSQL через systemd
AlmaLinux / Rocky Linux: сначала инициализируйте кластер
В отличие от Debian/Ubuntu, RPM-пакет PostgreSQL не создаёт кластер базы данных автоматически — сначала нужно инициализировать каталог данных.
Для пакета из AppStream (postgresql-server):
postgresql-setup --initdb
systemctl enable --now postgresqlДля версионного пакета из PGDG (замените 16 на свою версию):
/usr/pgsql-16/bin/postgresql-16-setup initdb
systemctl enable --now postgresql-16Ubuntu / Debian
Пакет уже создаёт кластер (по умолчанию с именем main) и сам включает и запускает для него systemd-сервис при установке, так что этот шаг обычно только подтверждает состояние:
systemctl enable --now postgresqlПроверьте, что сервер принимает подключения:
pg_isreadyОжидаемый вывод заканчивается на accepting connections.
Шаг 3. Подключитесь и создайте роль и базу данных
При установке PostgreSQL создаёт системного пользователя postgres и одноимённую роль-суперпользователя внутри СУБД. Локальные подключения по умолчанию используют peer-аутентификацию: она сверяет системного пользователя ОС с именем роли PostgreSQL, поэтому войти можно только от имени системного пользователя postgres — и без пароля:
sudo -u postgres psqlВы окажетесь в приглашении psql, подключённом к служебной базе postgres от имени роли postgres. Использовать суперпользователя для повседневной работы приложения не стоит — создайте для него отдельную роль и базу данных, которой эта роль будет владеть:
CREATE ROLE myuser WITH LOGIN PASSWORD 'change_me';
CREATE DATABASE mydb OWNER myuser;Замените myuser и mydb на свои имена, а change_me — обязательно на собственный надёжный пароль.
Выйдите из сессии:
\qШаг 4. Основы psql
Общий синтаксис вызова psql из шелла:
psql [option...] [dbname [username]]Основные флаги: -U — роль, -d — база данных, -h — хост (без него psql соединяется через Unix-сокет, а не по TCP), -p — порт (по умолчанию 5432). Команда sudo -u postgres psql из шага 3 равносильна sudo -u postgres psql -U postgres -d postgres.
Внутри psql, помимо обычного SQL, работают метакоманды — все начинаются с обратного слэша. Подключитесь как postgres и попробуйте основные:
sudo -u postgres psql\l
\du\l выводит список баз данных — среди них должна быть mydb; \du — список ролей, среди них myuser и сам postgres (у него будут отмечены права суперпользователя).
Переключитесь на созданную базу и посмотрите список таблиц:
\c mydb
\dtТаблиц в свежей базе ещё нет, поэтому \dt ответит Did not find any relations. — это ожидаемо.
Другие полезные метакоманды:
\x— переключить вывод в построчный (expanded) режим, удобно для широких строк с длинными значениями;\password myuser— задать или сменить пароль роли: пароль запрашивается интерактивно дважды и не попадает в историю команд открытым текстом, в отличие отPASSWORD '...'внутриCREATE ROLE/ALTER ROLE;\conninfo— показать, к какой базе, от какого пользователя, по какому хосту и порту вы сейчас подключены;\i file.sql— выполнить SQL-команды из файла;\?— список всех метакоманд,\h ИМЯ_КОМАНДЫ— синтаксис конкретной SQL-команды, например\h CREATE ROLE.
Завершите сессию:
\qПодключиться под ролью myuser по паролю (psql -U myuser -d mydb -h 127.0.0.1) получится после настройки доступа в следующем шаге.
Шаг 5. Настройте доступ: pg_hba.conf и listen_addresses
За то, кто и как может подключиться к серверу, отвечают два параметра: listen_addresses в postgresql.conf — на каких сетевых интерфейсах сервер вообще слушает подключения, и pg_hba.conf — с каких адресов, к какой базе, под какой ролью и каким способом аутентификации подключение разрешено. По умолчанию свежий сервер слушает только localhost — этого достаточно, если приложение работает на этом же VPS. Менять оба файла нужно, только если требуется доступ снаружи.
Расположение файлов зависит от дистрибутива и способа установки:
- Ubuntu/Debian:
/etc/postgresql/16/main/postgresql.confи/etc/postgresql/16/main/pg_hba.conf(номер — версия PostgreSQL; пакетpostgresql-commonхранит конфигурацию отдельно от каталога данных). - AlmaLinux/Rocky, пакет из AppStream:
/var/lib/pgsql/data/postgresql.confи/var/lib/pgsql/data/pg_hba.conf. - AlmaLinux/Rocky, пакет из PGDG:
/var/lib/pgsql/16/data/postgresql.confи/var/lib/pgsql/16/data/pg_hba.conf.
Локальный доступ (в пределах этого VPS)
На AlmaLinux/Rocky откройте pg_hba.conf, найдите строки для 127.0.0.1/32 и ::1/128 и замените в них ident на scram-sha-256, чтобы они выглядели так:
host all all 127.0.0.1/32 scram-sha-256
host all all ::1/128 scram-sha-256Примените изменения:
systemctl reload postgresqlПроверьте вход под новой ролью по паролю через TCP:
psql -U myuser -d mydb -h 127.0.0.1 -WФлаг -h заставляет psql подключаться по TCP — через строку host в pg_hba.conf, а не через Unix-сокет (строку local, там по-прежнему действует peer), поэтому именно так, а не через sudo -u postgres psql, проверяется вход по паролю. -W гарантированно запросит пароль.
Удалённый доступ
Если приложение или вы сами будете подключаться не с этого VPS, а с другого сервера или своего компьютера, нужны ещё два изменения.
Разрешите PostgreSQL слушать внешние интерфейсы — в postgresql.conf замените:
listen_addresses = 'localhost'на:
listen_addresses = '*'(либо укажите конкретный IP-адрес VPS вместо *, если интерфейсов несколько). listen_addresses применяется только при старте сервера — reload тут не сработает, нужен полный перезапуск:
systemctl restart postgresqlДобавьте в pg_hba.conf отдельную строку для адреса, с которого будете подключаться:
host mydb myuser 203.0.113.10/32 scram-sha-256Замените 203.0.113.10/32 на реальный IP-адрес клиента (или подсеть).
Перечитайте конфигурацию:
systemctl reload postgresqlДля pg_hba.conf, в отличие от listen_addresses, достаточно reload — полный перезапуск не нужен.
Шаг 6. Откройте порт 5432 в файрволе — только если нужен удалённый доступ
Если весь доступ к базе локальный (приложение работает на этом же VPS и подключается через Unix-сокет или 127.0.0.1), порт открывать не нужно вовсе — PostgreSQL и так недоступен снаружи, пока в pg_hba.conf нет строк для внешних адресов из раздела «Удалённый доступ» выше. Открывайте порт, только если только что настроили удалённый доступ.
Ubuntu / Debian (ufw)
Если ufw на сервере ещё не настроен, сначала пройдите статью «Настройка файрвола UFW» — она ставит ufw, разрешает SSH и включает файрвол. Если ufw уже работает, разрешите доступ к порту только с IP-адреса клиента из предыдущего шага:
ufw allow from 203.0.113.10 to any port 5432 proto tcpAlmaLinux / Rocky (firewalld)
firewall-cmd --permanent --add-port=5432/tcp
firewall-cmd --reloadЧто дальше
База данных без резервных копий рано или поздно теряется вместе с VPS — настройте регулярное автоматическое копирование, см. статью «Бэкапы баз данных».