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

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

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

В этой инструкции рассматривается только установка PostgreSQL из стандартного репозитория Ubuntu, запуск службы, проверка локального подключения и знакомство с основными каталогами.

Проверено на: Ubuntu Server 24.04 LTS
Уровень сложности: начальный
Время выполнения: около 10–15 минут
Требуемый доступ: пользователь с правами sudo

Что будет настроено

После выполнения инструкции:

  • будет установлен PostgreSQL;
  • будет проверена версия клиента и сервера;
  • будет проверен системный сервис;
  • будет выполнено локальное подключение;
  • будет проверен стандартный кластер;
  • будут показаны основные каталоги конфигурации и данных;
  • будет выполнена базовая диагностика.

Проверка системы

Проверьте версию Ubuntu:

cat /etc/os-release

Проверьте архитектуру:

dpkg --print-architecture

Проверьте hostname:

hostnamectl

Проверьте свободное место:

df -h

Для production-сервера заранее оцените объём будущих данных, WAL и резервных копий.

Обновление индекса пакетов

sudo apt update

Убедитесь, что команда завершилась без ошибок DNS и репозиториев.

Проверка доступного пакета

apt-cache policy postgresql

Команда покажет версию метапакета, доступную из текущих репозиториев Ubuntu.

Проверить связанные пакеты:

apt search '^postgresql-[0-9]+$'

Установка PostgreSQL

sudo apt install -y postgresql postgresql-contrib

Пакет:

postgresql

устанавливает сервер и клиентские утилиты.

Пакет:

postgresql-contrib

добавляет набор стандартных расширений и вспомогательных модулей.

Проверка установленной версии клиента

psql --version

Пример формата вывода:

psql (PostgreSQL) VERSION

Проверка установленных пакетов

dpkg -l |
grep postgresql

Проверка конкретных серверных пакетов:

dpkg -l |
grep -E '^ii[[:space:]]+postgresql-[0-9]+'

Проверка службы PostgreSQL

systemctl status postgresql --no-pager

Служба верхнего уровня может отображаться как:

active (exited)

Это нормально: она управляет отдельными кластерами PostgreSQL.

Проверка активных кластеров

pg_lsclusters

Ожидается строка с состоянием:

online

Пример структуры вывода:

Ver Cluster Port Status Owner    Data directory              Log file
XX  main    5432 online postgres /var/lib/postgresql/XX/main /var/log/postgresql/...

Проверка конкретного cluster service

Имя systemd unit строится по шаблону:

postgresql@VERSION-main

Посмотрите доступные units:

systemctl list-units   'postgresql@*'   --all

Проверка конкретного кластера:

sudo systemctl status   postgresql@VERSION-main   --no-pager

Замените VERSION значением из pg_lsclusters.

Проверка автозапуска

systemctl is-enabled postgresql

Проверьте cluster unit:

systemctl is-enabled   postgresql@VERSION-main

На стандартной установке кластер запускается автоматически.

Проверка процессов PostgreSQL

ps aux |
grep '[p]ostgres'

Обычно видны процессы:

checkpointer
background writer
walwriter
autovacuum launcher
logical replication launcher

Набор процессов может отличаться в зависимости от версии и конфигурации.

Проверка порта

sudo ss -lntp |
grep ':5432'

По умолчанию PostgreSQL обычно слушает только локальные адреса.

Проверка конкретного процесса:

sudo ss -lntp |
grep postgres

Проверка Unix socket

sudo ss -lx |
grep postgres

Локальное подключение обычно выполняется через Unix socket.

Системный пользователь postgres

Установка создаёт системную учётную запись:

postgres

Проверьте:

getent passwd postgres

Этот пользователь владеет процессами и файлами сервера PostgreSQL.

Не используйте его как обычную учётную запись Linux.

Подключение к psql

sudo -u postgres psql

Ожидается приглашение:

postgres=#

Это означает, что выполнено локальное подключение к базе postgres от роли postgres.

Проверка версии сервера

Внутри psql:

SELECT version();

Краткая версия:

SHOW server_version;

Проверка текущего подключения

SELECT
    current_database(),
    current_user,
    inet_server_addr(),
    inet_server_port();

При подключении через Unix socket:

inet_server_addr()

может возвращать NULL. Это нормально.

Список баз данных

\l

Обычно присутствуют:

postgres
template0
template1

Список ролей

\du

После чистой установки обычно существует административная роль:

postgres

Создание отдельных ролей и пользователей рассматривается в следующей статье.

Выход из psql

\q

Проверка подключения одной командой

sudo -u postgres   psql   -c 'SELECT version();'

Проверка готовности сервера

pg_isready

Пример успешного ответа:

/var/run/postgresql:5432 - accepting connections

Проверка от системного пользователя postgres:

sudo -u postgres pg_isready

Проверка конкретного порта

pg_isready   -h 127.0.0.1   -p 5432

Учтите, что TCP-аутентификация может отличаться от подключения через Unix socket.

Основные конфигурационные файлы

Покажите каталог:

sudo find /etc/postgresql   -maxdepth 3   -type f   -printf '%p\n'

Основные файлы:

postgresql.conf
pg_hba.conf
pg_ident.conf

Определение фактического postgresql.conf

sudo -u postgres   psql   -Atc 'SHOW config_file;'

Определение фактического pg_hba.conf

sudo -u postgres   psql   -Atc 'SHOW hba_file;'

Определение каталога данных

sudo -u postgres   psql   -Atc 'SHOW data_directory;'

Не изменяйте и не копируйте файлы каталога данных при работающем сервере как обычный файловый backup.

Основные каталоги Ubuntu

Конфигурация:

/etc/postgresql/VERSION/main/

Данные:

/var/lib/postgresql/VERSION/main/

Журналы:

/var/log/postgresql/

Unix socket:

/var/run/postgresql/

Проверка каталога данных

sudo ls -ld   /var/lib/postgresql/*/main

Проверка размера:

sudo du -sh   /var/lib/postgresql/*/main

Проверка конфигурационного каталога

sudo ls -lah   /etc/postgresql/*/main/

Проверка журнала PostgreSQL

sudo ls -lah /var/log/postgresql/

Последние записи:

sudo tail -100   /var/log/postgresql/postgresql-*.log

Наблюдение в реальном времени:

sudo tail -f   /var/log/postgresql/postgresql-*.log

Остановить:

Ctrl+C

Журнал systemd

sudo journalctl -u postgresql   -n 100   --no-pager

Для cluster unit:

sudo journalctl   -u postgresql@VERSION-main   -n 100   --no-pager

Проверка параметров сервера

sudo -u postgres   psql   -c 'SHOW port;'
sudo -u postgres   psql   -c 'SHOW listen_addresses;'
sudo -u postgres   psql   -c 'SHOW max_connections;'

На этом этапе изменять параметры не требуется.

Проверка локального TCP-подключения

sudo -u postgres   psql   -h 127.0.0.1   -d postgres

В зависимости от стандартной конфигурации команда может запросить пароль или завершиться ошибкой аутентификации.

Это не означает неисправность сервера: подключение через TCP регулируется отдельными правилами pg_hba.conf.

На этапе установки достаточно успешного подключения через:

sudo -u postgres psql

Управление службой

Остановить все кластеры PostgreSQL:

sudo systemctl stop postgresql

Запустить:

sudo systemctl start postgresql

Перезапустить:

sudo systemctl restart postgresql

Проверить:

systemctl status postgresql --no-pager

Перезагрузка конфигурации без остановки

sudo systemctl reload postgresql

Или из SQL:

sudo -u postgres   psql   -c 'SELECT pg_reload_conf();'

Не все параметры применяются через reload. Часть требует restart.

Управление конкретным кластером

Остановить:

sudo pg_ctlcluster   VERSION   main   stop

Запустить:

sudo pg_ctlcluster   VERSION   main   start

Перезапустить:

sudo pg_ctlcluster   VERSION   main   restart

Статус:

sudo pg_ctlcluster   VERSION   main   status

Проверка конфигурации после изменения

PostgreSQL не предоставляет полного аналога nginx -t для всех параметров через одну стандартную команду.

Безопасный порядок:

  1. создать резервную копию файла;
  2. изменить один параметр;
  3. выполнить reload;
  4. проверить журнал;
  5. проверить значение через SHOW.

Пример:

sudo -u postgres   psql   -c 'SELECT pg_reload_conf();'

Проверка ошибок конфигурации:

sudo tail -100   /var/log/postgresql/postgresql-*.log

Проверка состояния кластера после перезагрузки сервера

sudo reboot

После загрузки:

pg_lsclusters
sudo -u postgres pg_isready

Не перезагружайте production-сервер только ради проверки без согласованного окна обслуживания.

Проверка установленных расширений

sudo -u postgres   psql   -c '\dx'

Стандартно присутствует:

plpgsql

Пакет postgresql-contrib делает доступными дополнительные расширения, но не включает их автоматически во все базы.

Проверка доступных расширений

sudo -u postgres   psql   -c   "SELECT name, default_version
   FROM pg_available_extensions
   ORDER BY name;"

Включение конкретных расширений рассматривается в отдельных статьях.

Проверка локали кластера

sudo -u postgres   psql   -c   "SELECT
       datname,
       datcollate,
       datctype
   FROM pg_database
   ORDER BY datname;"

Локаль выбирается при создании кластера и влияет на сортировку и сравнение строк.

Не пересоздавайте кластер только ради смены локали без анализа приложений и backup.

Проверка часового пояса

sudo -u postgres   psql   -c 'SHOW timezone;'

Проверка системного времени:

timedatectl

Разница часовых поясов приложения, ОС и PostgreSQL может приводить к ошибочной интерпретации дат.

Проверка потребления памяти

ps -C postgres   -o pid,ppid,%cpu,%mem,rss,cmd

На пустом сервере нагрузка должна быть минимальной.

Проверка открытых файлов

sudo lsof -u postgres |
head -50

Проверка владельцев файлов

sudo ls -ld   /var/lib/postgresql   /var/lib/postgresql/*   /var/lib/postgresql/*/main

Каталог данных должен принадлежать пользователю postgres.

Не меняйте владельца на root или обычного пользователя.

UFW на этапе локальной установки

Если PostgreSQL используется только локально, открывать порт 5432 в UFW не требуется.

Проверьте:

sudo ufw status verbose

Не выполняйте:

sudo ufw allow 5432/tcp

до отдельной настройки remote access и pg_hba.conf.

Типичные проблемы

postgresql.service показывает active (exited)

Проверьте:

pg_lsclusters

Если кластер имеет статус online, сервер работает нормально.

Кластер имеет статус down

Проверьте журнал:

sudo tail -100   /var/log/postgresql/postgresql-*.log

Попробуйте запустить:

sudo pg_ctlcluster   VERSION   main   start

Порт 5432 не отображается на внешнем интерфейсе

Это ожидаемо для безопасной локальной установки.

Проверьте:

sudo -u postgres   psql   -c 'SHOW listen_addresses;'

Удалённое подключение настраивается отдельно.

sudo -u postgres psql не подключается

Проверьте:

pg_lsclusters
sudo -u postgres pg_isready

Проверьте журнал PostgreSQL.

Ошибка role does not exist

Не запускайте просто:

psql

от обычного Linux-пользователя, если одноимённая роль PostgreSQL ещё не создана.

Используйте:

sudo -u postgres psql

Ошибка peer authentication failed

Peer-аутентификация сопоставляет Linux-пользователя с ролью PostgreSQL.

Для административного подключения используйте:

sudo -u postgres psql

Настройка других методов аутентификации рассматривается отдельно.

Не найден pg_lsclusters

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

dpkg -l |
grep postgresql-common

При необходимости:

sudo apt install -y postgresql-common

Журнал пустой или находится в другом месте

Проверьте:

sudo -u postgres   psql   -c 'SHOW log_directory;'
sudo -u postgres   psql   -c 'SHOW logging_collector;'

Также проверьте systemd journal.

Сервер не запускается после изменения конфигурации

Проверьте:

sudo journalctl   -u postgresql@VERSION-main   -n 100   --no-pager

Восстановите резервную копию изменённого файла и повторите запуск.

Удаление PostgreSQL

Перед удалением обязательно создайте backup нужных баз.

Остановите службу:

sudo systemctl stop postgresql

Удалите метапакеты:

sudo apt remove -y   postgresql   postgresql-contrib

Это не обязательно удалит все version-specific пакеты и данные.

Полное удаление пакетов

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

dpkg -l |
grep postgresql

Для полного удаления конфигурации:

sudo apt purge -y   postgresql   postgresql-contrib   'postgresql-*'

Проверьте список пакетов перед подтверждением.

Удаление данных

Каталоги данных могут сохраниться:

/var/lib/postgresql/

Не удаляйте их без подтверждённой резервной копии.

Для полного удаления тестовой установки:

sudo rm -rf /var/lib/postgresql
sudo rm -rf /etc/postgresql
sudo rm -rf /var/log/postgresql

Эти команды необратимо удаляют базы и конфигурацию.

На рабочем сервере такой способ без плана восстановления недопустим.

Быстрый набор команд

Установка:

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

Проверка:

pg_lsclusters
systemctl status postgresql --no-pager

Подключение:

sudo -u postgres psql

Готовность:

sudo -u postgres pg_isready

Версия:

sudo -u postgres   psql   -c 'SELECT version();'

Журнал:

sudo tail -100   /var/log/postgresql/postgresql-*.log

Итог

После выполнения инструкции:

  • PostgreSQL установлен из стандартного репозитория Ubuntu;
  • проверены пакеты и версия;
  • проверен стандартный кластер;
  • выполнено локальное подключение;
  • проверены порт и Unix socket;
  • определены конфигурационные файлы;
  • проверены каталоги данных и журналов;
  • рассмотрено управление службой;
  • разобраны основные ошибки установки.

Следующим этапом можно создать отдельную базу данных и отдельного пользователя PostgreSQL для приложения.

← Предыдущая статья Настройка ротации логов Nginx в Ubuntu Следующая статья → Создание базы данных и отдельного пользователя PostgreSQL