Как установить и настроить базу данных PostgreSQL на VPS?

В этой статье разберём на примере Ubuntu/Debian:

  • как установить PostgreSQL и проверить, что сервер запущен;
  • как зайти в консоль через psql и не поймать «Peer authentication failed»;
  • как создать администратора admin с паролем;
  • как настроить базу с кодировкой UTF8 и LC_COLLATE под русский/английский;
  • как включить/запретить удалённый доступ к PostgreSQL;
  • какие ошибки встречаются чаще всего и как их исправить.

Установка PostgreSQL на VPS

Сначала обновим пакеты и установим сервер PostgreSQL из стандартного репозитория:

sudo apt update
sudo apt install -y postgresql postgresql-contrib

Проверяем статус службы:

sudo systemctl status postgresql

Если в статусе видно active (running), сервер запущен. Быстрый тест — проверим, слушается ли порт 5432:

ss -tulpn | grep 5432 || echo "Порт 5432 не слушается"

Посмотрим, какая версия установлена (понадобится для путей к конфигам):

ls /etc/postgresql

Обычно увидите что-то вроде 14, 15 или 16. В примерах дальше будем использовать 16 — подставьте свою.

Установка PostgreSQL на VPS

Первичный вход в psql: пользователь postgres

PostgreSQL создаёт системного пользователя postgres, от имени которого работает сервер БД. Через него удобнее всего выполнять начальную настройку.

Заходим в консоль PostgreSQL:

sudo -u postgres psql

Если всё ок, увидите приглашение:

psql (16.x)
Type "help" for help.

postgres=#

Важно: на этом этапе не нужно вводить пароль — авторизация идёт через «peer» (по системному пользователю).

Создаём администратора admin с паролем

Теперь внутри psql создадим роль admin с логином и паролем. Это будет наш основной админ для работы с базами.

Внутри консоли psql (под postgres=#):

CREATE ROLE admin
  WITH LOGIN
       PASSWORD 'Slozhnyj_Parol_2025!'
       CREATEDB
       CREATEROLE;

При желании можно сделать admin суперпользователем, но для простых задач достаточно прав CREATEDB и CREATEROLE. Проверим, что роль создалась:

\du

В списке ролей должна появиться строка с admin.

Выходим из psql:

\q

Пробуем зайти уже под admin:

psql -U admin -d postgres

Если видите запрос пароля и успешный вход — всё работает. Если ошибка авторизации — чуть ниже разберём, в чём подвох.

Настройка pg_hba.conf, чтобы admin логинился по паролю

PostgreSQL управляет способами аутентификации через файл pg_hba.conf. На Ubuntu он лежит здесь:

/etc/postgresql/16/main/pg_hba.conf

Подставь свою версию вместо 16, если она другая.

Откроем файл:

sudo nano /etc/postgresql/16/main/pg_hba.conf

Нас интересуют строки в начале, обычно там что-то вроде:

local   all             postgres                                peer
local   all             all                                     peer

Чтобы пользователь admin мог логиниться по паролю, поменяем peer на md5 (или scram-sha-256, если включено):

local   all             postgres                                peer
local   all             all                                     md5

Сохраняем файл и перезапускаем PostgreSQL:

sudo systemctl restart postgresql

Теперь пробуем ещё раз:

psql -U admin -d postgres

Если всё сделано правильно, будет запрос пароля и вход в систему.

Настройка pg_hba.conf для PostgreSQL

Создание базы данных под проект (администратор admin)

Подключаемся к серверу под пользователем admin:

psql -U admin -d postgres

Создадим базу данных, где admin будет владельцем (для примера назовём её project_db):

CREATE DATABASE project_db
  WITH OWNER = admin
       ENCODING = 'UTF8'
       LC_COLLATE = 'ru_RU.utf8'
       LC_CTYPE = 'ru_RU.utf8'
       TEMPLATE = template0;

Пояснения:

  • OWNER = admin — владелец базы, он сможет создавать таблицы, индексы и т.д.

  • ENCODING = 'UTF8' — универсальная кодировка.

  • LC_COLLATE/LC_CTYPE — сортировка и правила сравнения строк. Если на сервере нет ru_RU.utf8, используй en_US.utf8 или C.

Переходим в новую базу:

\c project_db

Проверим, что всё работает, создав тестовую таблицу:

CREATE TABLE test_table (
  id   serial PRIMARY KEY,
  name text NOT NULL
);

INSERT INTO test_table (name) VALUES ('test');
SELECT * FROM test_table;

Если видите одну строку с test — база готова к работе.

Настройка слушающих адресов (listen_addresses)

По умолчанию PostgreSQL слушает только localhost. Для обычного сайта на том же VPS этого достаточно и безопасно — PHP/приложение подключается через Unix-сокет или 127.0.0.1.

Файл конфигурации postgresql.conf находится, как правило, здесь:

/etc/postgresql/16/main/postgresql.conf

Откроем его:

sudo nano /etc/postgresql/16/main/postgresql.conf

И найдём строку:

#listen_addresses = 'localhost'

Раскомментируем, если надо, и оставим только локальный доступ (рекомендуется по умолчанию):

listen_addresses = 'localhost'

Если нужно подключаться с другого сервера (например, с отдельного backend-сервера), можно указать IP или *:

listen_addresses = 'localhost,10.0.0.5'
# или
listen_addresses = '*'

Предупреждение: если ставишь *, обязательно не забудь ограничить доступ в pg_hba.conf и через фаервол, иначе база окажется открыта всему миру.

После изменений перезапускаем сервер:

sudo systemctl restart postgresql

Удалённый доступ: пример настройки + фаервол

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

  1. В postgresql.conf указываем:

    listen_addresses = '*'
  2. В pg_hba.conf добавляем строку (замени IP на свой):

    host    all     admin    203.0.113.10/32     md5

    Так доступ по паролю будет только для admin с конкретного IP.

  3. В фаерволе (UFW) открываем 5432 только для нужного IP:

    sudo ufw allow from 203.0.113.10 to any port 5432 proto tcp
  4. Перезапускаем PostgreSQL:

    sudo systemctl restart postgresql

С рабочего компьютера подключение будет выглядеть так:

psql -h YOUR.SERVER.IP -U admin -d project_db

Частые ошибки и их решения

  • psql: FATAL: role «admin» does not exist

    Значит, роль admin не была создана или вы создавали БД не тем пользователем. Зайдите под postgres и выполните ещё раз:

    sudo -u postgres psql
    CREATE ROLE admin
      WITH LOGIN PASSWORD 'Slozhnyj_Parol_2025!' CREATEDB CREATEROLE;
  • psql: FATAL: Peer authentication failed for user «admin»

    Скорее всего, в pg_hba.conf для local all all до сих пор стоит peer. Поменяй на md5 и перезапусти PostgreSQL:

    local   all             all                                     md5
  • Не можешь подключиться по сети

    • проверь listen_addresses в postgresql.conf;
    • проверь запись host ... в pg_hba.conf;
    • проверь, открыт ли порт 5432 в UFW/фаерволе;
    • попробуй подключиться по IP, а не по домену.
  • Проблемы с локалью при создании базы (ошибки про ru_RU.utf8)

    Сначала посмотри доступные локали:

    locale -a

    Если ru_RU.utf8 нет — можно использовать en_US.utf8 или C, либо сгенерировать русскую локаль через sudo dpkg-reconfigure locales.

Итоги

  • Установили PostgreSQL на VPS и убедились, что сервис запущен.

  • Зашли в консоль через sudo -u postgres psql.

  • Создали администратора admin с паролем и выдали ему права.

  • Создали базу project_db с кодировкой UTF8 и правильными локалями.

  • Настроили pg_hba.conf и при необходимости удалённый доступ.

  • Разобрали типичные ошибки и способы их исправления.

Вывод: PostgreSQL на VPS настраивается не сложнее, чем MariaDB/MySQL, если понимать, как работают роли, pg_hba.conf и конфиги. Главный принцип — отдельный пользователь admin с паролем, закрытый по умолчанию доступ извне и аккуратная работа с правами.

Оставить комментарий