MHOSTMHOST

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).
Совет: команды ниже даны от имени root — под обычным sudo-пользователем добавляйте sudo перед каждой из них. Исключение — sudo -u postgres psql в шаге 3: там sudo -u переключает системного пользователя на postgres, а не повышает права, и нужна эта команда именно в таком виде, даже если вы уже root.

Шаг 1. Установите PostgreSQL

Ubuntu / Debian

bash
apt update
apt install postgresql

apt поставит версию, зафиксированную для вашего релиза дистрибутива, — например, PostgreSQL 14 на Ubuntu 22.04, 16 — на Ubuntu 24.04, 13 — на Debian 11, 15 — на Debian 12. Для большинства задач этого достаточно.

Проверьте установку:

bash
psql --version
Совет: посмотреть версию, порт и статус именно серверного кластера (а не только клиента psql) можно командой pg_lsclusters — она есть только на Ubuntu/Debian, где кластеры баз данных управляются пакетом postgresql-common.

Если нужна конкретная более свежая версия, чем даёт репозиторий дистрибутива, подключите официальный apt-репозиторий PGDG:

bash
apt install -y postgresql-common ca-certificates
/usr/share/postgresql-common/pgdg/apt.postgresql.org.sh

Скрипт покажет, что собирается сделать, и спросит подтверждение — согласитесь. После этого поставьте нужную версию:

bash
apt update
apt install postgresql-16

Замените 16 на версию, которая нужна вам.

AlmaLinux / Rocky Linux

bash
dnf install postgresql-server

Версия из AppStream часто отстаёт от актуальных релизов PostgreSQL. Посмотреть, какая версия предлагается по умолчанию (и какие ещё доступны), можно командой:

bash
dnf module list postgresql

Для конкретной свежей версии подключите вместо AppStream официальный репозиторий PGDG (пример для AlmaLinux/Rocky Linux 9 — для версии 8 замените в ссылке EL-9 на EL-8):

bash
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 на нужную версию в имени пакета и во всех путях и именах служб дальше по статье.

Важно: команда dnf -qy module disable postgresql обязательна — без неё dnf может по умолчанию поставить версию из встроенного модуля AppStream вместо той, что вы указали.

Шаг 2. Включите автозапуск и запустите PostgreSQL через systemd

AlmaLinux / Rocky Linux: сначала инициализируйте кластер

В отличие от Debian/Ubuntu, RPM-пакет PostgreSQL не создаёт кластер базы данных автоматически — сначала нужно инициализировать каталог данных.

Для пакета из AppStream (postgresql-server):

bash
postgresql-setup --initdb
systemctl enable --now postgresql

Для версионного пакета из PGDG (замените 16 на свою версию):

bash
/usr/pgsql-16/bin/postgresql-16-setup initdb
systemctl enable --now postgresql-16

Ubuntu / Debian

Пакет уже создаёт кластер (по умолчанию с именем main) и сам включает и запускает для него systemd-сервис при установке, так что этот шаг обычно только подтверждает состояние:

bash
systemctl enable --now postgresql
Совет: конкретный кластер на Ubuntu/Debian управляется отдельным сервисом вида postgresql@16-main (версия и имя кластера через @) — общий сервис postgresql включает и перезапускает сразу все кластеры на сервере, обычно там всего один.

Проверьте, что сервер принимает подключения:

bash
pg_isready

Ожидаемый вывод заканчивается на accepting connections.

Готово: systemd-сервис PostgreSQL включён и работает.

Шаг 3. Подключитесь и создайте роль и базу данных

При установке PostgreSQL создаёт системного пользователя postgres и одноимённую роль-суперпользователя внутри СУБД. Локальные подключения по умолчанию используют peer-аутентификацию: она сверяет системного пользователя ОС с именем роли PostgreSQL, поэтому войти можно только от имени системного пользователя postgres — и без пароля:

bash
sudo -u postgres psql

Вы окажетесь в приглашении psql, подключённом к служебной базе postgres от имени роли postgres. Использовать суперпользователя для повседневной работы приложения не стоит — создайте для него отдельную роль и базу данных, которой эта роль будет владеть:

sql
CREATE ROLE myuser WITH LOGIN PASSWORD 'change_me';
CREATE DATABASE mydb OWNER myuser;

Замените myuser и mydb на свои имена, а change_me — обязательно на собственный надёжный пароль.

Совет: CREATE USER myuser PASSWORD 'change_me'; — эквивалентная сокращённая форма: CREATE USER отличается от CREATE ROLE только тем, что по умолчанию сразу включает атрибут LOGIN.
Совет: начиная с PostgreSQL 15 право CREATE в схеме public по умолчанию есть только у владельца базы данных (через служебную роль pg_database_owner) — остальным ролям его нужно выдавать отдельно: GRANT CREATE ON SCHEMA public TO other_role;. Поскольку в примере выше myuser сам является владельцем mydb, это ограничение его не касается.

Выйдите из сессии:

\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 и попробуйте основные:

bash
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, который создаёт postgresql-setup --initdb, по умолчанию требует для TCP-подключений (строки с 127.0.0.1/32 и ::1/128) метод ident — он работает только через отдельный ident-сервер, которого на VPS нет, и без изменения этих строк вход по паролю через -h 127.0.0.1 не сработает. На Ubuntu/Debian там по умолчанию уже стоит scram-sha-256 — менять ничего не нужно.

На 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

Примените изменения:

bash
systemctl reload postgresql

Проверьте вход под новой ролью по паролю через TCP:

bash
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 гарантированно запросит пароль.

Готово: psql запросил Password for user myuser: и после ввода change_me (или пароля, который вы задали) пустил в базу mydb.

Удалённый доступ

Если приложение или вы сами будете подключаться не с этого VPS, а с другого сервера или своего компьютера, нужны ещё два изменения.

Разрешите PostgreSQL слушать внешние интерфейсы — в postgresql.conf замените:

ini
listen_addresses = 'localhost'

на:

ini
listen_addresses = '*'

(либо укажите конкретный IP-адрес VPS вместо *, если интерфейсов несколько). listen_addresses применяется только при старте сервера — reload тут не сработает, нужен полный перезапуск:

bash
systemctl restart postgresql

Добавьте в pg_hba.conf отдельную строку для адреса, с которого будете подключаться:

host    mydb            myuser          203.0.113.10/32         scram-sha-256

Замените 203.0.113.10/32 на реальный IP-адрес клиента (или подсеть).

Важно: не указывайте вместо адреса 0.0.0.0/0 («откуда угодно») без крайней необходимости — PostgreSQL, доступный из интернета без ограничения по IP, быстро становится целью перебора паролей. Сужайте строку до конкретного IP или подсети клиента.

Перечитайте конфигурацию:

bash
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-адреса клиента из предыдущего шага:

bash
ufw allow from 203.0.113.10 to any port 5432 proto tcp
Совет: если нужен доступ с нескольких известных адресов, повторите команду для каждого — правила не перезаписывают, а дополняют друг друга. Открывать порт для всех (ufw allow 5432/tcp) стоит, только если клиенты подключаются с непредсказуемых адресов, а доступ уже ограничен на уровне pg_hba.conf и пароля.

AlmaLinux / Rocky (firewalld)

bash
firewall-cmd --permanent --add-port=5432/tcp
firewall-cmd --reload
Совет: ограничить доступ конкретным IP-адресом в firewalld можно rich rule: firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.10/32" port protocol="tcp" port="5432" accept', затем тем же firewall-cmd --reload.

Что дальше

База данных без резервных копий рано или поздно теряется вместе с VPS — настройте регулярное автоматическое копирование, см. статью «Бэкапы баз данных».