В прошлый раз мы разобрались, что такое postgresql и из чего состоит СУБД. Теперь ставим её руками и доводим до первого живого подключения. Задача урока - поставить сервер тремя разными способами (пакеты Linux, инсталлятор Windows, контейнер Docker), понять, где лежат данные, как запускается служба и почему в свежей системе уже есть базы template0, template1 и postgres. К концу вы откроете psql и выполните первый запрос.

Как это работает
Сначала важно развести два понятия, которые новички путают. Есть исполняемые файлы сервера (postgres, initdb, pg_ctl, psql) - это сама программа. И есть кластер баз данных - каталог на диске, где живут данные. Один установленный сервер может обслуживать несколько кластеров, но обычно у вас один.
Кластер - это не про несколько машин, как в Kubernetes. В терминологии PostgreSQL кластер - это один каталог данных (PGDATA) и набор баз внутри него, которыми управляет один процесс-сервер на одном порту (по умолчанию 5432). Создаётся этот каталог утилитой initdb: она раскладывает служебные файлы, заводит системный каталог и три стартовые базы.
Базы template1 и template0 - это шаблоны. Когда вы делаете CREATE DATABASE, новая база физически копируется с template1. Поэтому всё, что вы добавите в template1 (расширение, схему, права), автоматически окажется во всех будущих базах. template0 - это нетронутый эталон на крайний случай: его не меняют, из него восстанавливают, если template1 случайно испортили, и из него создают базы с другой кодировкой. База postgres - просто рабочая база по умолчанию, чтобы было куда подключиться сразу после установки.
Суперпользователь СУБД создаётся при initdb и по умолчанию называется postgres. Это роль внутри сервера, не путать с системным пользователем ОС, хотя при пакетной установке в Linux заводится и одноимённый системный аккаунт. Современная аутентификация по паролю использует метод SCRAM-SHA-256 (в PG 15 это значение по умолчанию для password_encryption) - старый md5 считаем устаревшим.
После initdb каталог данных надо запустить как службу. В пакетных установках это делает systemd, в Windows - служба Windows, в Docker - процесс внутри контейнера. Сервер начинает слушать порт, и к нему можно подключиться клиентом psql.
SQL и примеры
Debian/Ubuntu, установка из официального репозитория PGDG (apt). Пакет postgresql-15 при установке сам вызывает initdb и поднимает службу:
Код: Выделить всё
sudo apt update
sudo apt install -y postgresql-common
sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh
sudo apt install -y postgresql-15
systemctl status postgresql@15-main
RHEL/Fedora (dnf). Здесь после установки кластер нужно инициализировать вручную, служба сама не стартует:
Код: Выделить всё
sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo dnf -qy module disable postgresql
sudo dnf install -y postgresql15-server
sudo /usr/pgsql-15/bin/postgresql-15-setup initdb
sudo systemctl enable --now postgresql-15
Первое подключение в Linux. Пакеты настроены на peer-аутентификацию: системный пользователь postgres заходит без пароля:
Код: Выделить всё
sudo -u postgres psql
Код: Выделить всё
SELECT version();
\l
\conninfo
Код: Выделить всё
ALTER ROLE postgres WITH PASSWORD 'StrongPass2026';
SHOW password_encryption;
Код: Выделить всё
pg_ctl status -D "C:\Program Files\PostgreSQL\15\data"
Код: Выделить всё
docker volume create pgdata
docker run -d --name pg15 \
-e POSTGRES_PASSWORD=StrongPass2026 \
-e POSTGRES_DB=demo \
-p 5432:5432 \
-v pgdata:/var/lib/postgresql/data \
postgres:15
Код: Выделить всё
docker exec -it pg15 psql -U postgres -d demo -c "\l"
docker exec -it pg15 psql -U postgres -c "SHOW server_encoding;"
Частые грабли
- Удалили Docker-контейнер без volume - данные пропали. Always монтируйте том на /var/lib/postgresql/data.
- На RHEL/Fedora забыли postgresql-15-setup initdb и пытаются стартовать службу - она падает, потому что кластер не создан.
- Путают системного пользователя ОС postgres и роль СУБД postgres. Это разные сущности, просто с одинаковым именем.
- Меняют template0 - так делать нельзя, это эталон. Кастомизируйте template1.
- Connection refused при подключении с другой машины - сервер слушает только localhost. Нужно править listen_addresses в postgresql.conf и добавлять запись в pg_hba.conf.
- На свежей установке нет пароля у postgres и не понимают, как зайти - в Linux это peer-аутентификация через sudo -u postgres.
- Ставят несколько мажорных версий и обращаются не к тому порту (5432 у первой, 5433 у второй).
- Поставьте PostgreSQL 15 любым удобным способом (пакеты, инсталлятор или Docker).
- Подключитесь через psql и выполните SELECT version(); запишите точную версию.
- Командой \l выведите список баз и найдите там template0, template1, postgres.
- Узнайте каталог данных: SHOW data_directory; и SHOW config_file;
- Создайте свою базу: CREATE DATABASE sandbox; подключитесь к ней через \c sandbox
- Проверьте метод аутентификации: SHOW password_encryption; убедитесь, что это scram-sha-256.
- Создайте таблицу с первичным ключом через GENERATED ALWAYS AS IDENTITY и вставьте пару строк.
- Чем кластер баз данных в PostgreSQL отличается от кластера в смысле нескольких серверов?
- Зачем нужны две базы-шаблона template0 и template1 и в чём разница между ними?
- Что делает утилита initdb и почему на RHEL её надо вызывать вручную, а на Debian нет?
- Почему при работе с Docker критично монтировать volume на каталог данных?
- Чем системный пользователь postgres в ОС отличается от роли postgres внутри сервера?
- Какой метод шифрования пароля используется по умолчанию в PG 15 и чем он лучше md5?