Установка 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 для всех параметров через одну стандартную команду.
Безопасный порядок:
- создать резервную копию файла;
- изменить один параметр;
- выполнить reload;
- проверить журнал;
- проверить значение через
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 для приложения.