Урок 02

Установка и подключение

Способы установки

Три варианта:

  • Пакетный менеджер — apt, yum, brew. Просто, но версия из репозитория может отставать.
  • Официальный репозиторий PostgreSQL — свежая версия.
  • Docker — изолированно, быстро, для разработки.

Apt (Ubuntu / Debian)

Официальный репозиторий:

sudo apt install -y curl ca-certificates
sudo install -d /usr/share/postgresql-common/pgdg

sudo curl -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc \
    --fail https://www.postgresql.org/media/keys/ACCC4CF8.asc

sudo sh -c 'echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] \
    https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" \
    > /etc/apt/sources.list.d/pgdg.list'

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

Что установилось:

  • /usr/lib/postgresql/16/bin/ — бинарники.
  • /etc/postgresql/16/main/ — конфиги.
  • /var/lib/postgresql/16/main/ — данные.
  • Сервис — postgresql.

Запуск и автозапуск

sudo systemctl status postgresql
sudo systemctl start postgresql
sudo systemctl enable postgresql
sudo systemctl restart postgresql

Логи:

sudo journalctl -u postgresql -f
# или
sudo tail -f /var/log/postgresql/postgresql-16-main.log

Docker

Простой вариант:

docker run -d \
    --name postgres \
    -e POSTGRES_PASSWORD=secret \
    -e POSTGRES_USER=app \
    -e POSTGRES_DB=myapp \
    -p 5432:5432 \
    -v pg_data:/var/lib/postgresql/data \
    postgres:16-alpine

Docker Compose:

services:
  postgres:
    image: postgres:16-alpine
    environment:
      POSTGRES_PASSWORD: secret
      POSTGRES_USER: app
      POSTGRES_DB: myapp
    ports:
      - "5432:5432"
    volumes:
      - pg_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U app"]
      interval: 5s

volumes:
  pg_data:

Запуск:

docker compose up -d
docker compose logs -f postgres

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

Локально:

sudo -u postgres psql

По TCP:

psql -h 127.0.0.1 -p 5432 -U app -d myapp

С паролем из переменной:

PGPASSWORD=secret psql -h 127.0.0.1 -U app -d myapp

Строка подключения:

psql postgresql://app:secret@127.0.0.1:5432/myapp

Полезные команды psql

Мета-команды:

\l              -- список баз
\c myapp        -- подключиться к базе
\dt             -- список таблиц
\d users        -- структура таблицы
\di             -- список индексов
\du             -- список ролей
\dn             -- список схем
\df             -- список функций
\x              -- расширенный вывод (по строкам)
\timing         -- время выполнения запроса
\e              -- открыть редактор
\i file.sql     -- выполнить файл
\o file.txt     -- вывод в файл
\q              -- выход

Файлы конфигурации

Основные:

  • postgresql.conf — общие настройки.
  • pg_hba.conf — правила аутентификации.
  • pg_ident.conf — маппинг пользователей.

Путь (Ubuntu):

/etc/postgresql/16/main/

Путь (Docker):

/var/lib/postgresql/data/

postgresql.conf — важное

# Подключения
listen_addresses = 'localhost'   # или '*' для всех интерфейсов
port = 5432
max_connections = 100

# Память
shared_buffers = 256MB            # 25% RAM
work_mem = 4MB
maintenance_work_mem = 64MB

# WAL
wal_level = replica
max_wal_size = 1GB

# Логирование
logging_collector = on
log_min_duration_statement = 200  # логировать запросы > 200мс
log_line_prefix = '%m [%p] %u@%d '

# Локаль
lc_messages = 'ru_RU.UTF-8'
timezone = 'Europe/Moscow'

Применить:

sudo systemctl reload postgresql

pg_hba.conf — аутентификация

Формат:

тип  база  пользователь  адрес       метод

Примеры:

# Локальные Unix-сокеты
local   all   postgres              peer
local   all   all                   md5

# TCP
host    all   all   127.0.0.1/32    scram-sha-256
host    all   all   ::1/128         scram-sha-256
host    myapp app   10.0.0.0/8      scram-sha-256

# Reject
host    all   all   0.0.0.0/0       reject

Методы:

  • trust — без пароля (только локально).
  • peer — по Unix-пользователю.
  • md5 — старый MD5.
  • scram-sha-256 — современный, рекомендуется.
  • reject — отклонить.

Правило: в проде — только scram-sha-256, listen_addresses не * без firewall.

Удалённое подключение

1. В postgresql.conf:

listen_addresses = '*'

2. В pg_hba.conf:

host    all   all   0.0.0.0/0   scram-sha-256

3. Пользователь с паролем:

CREATE USER app WITH PASSWORD 'secret';

4. Firewall:

sudo ufw allow from 10.0.0.0/8 to any port 5432

⚠️ Открывать 5432 в интернет — плохо. Используйте SSH-туннель или VPN.

SSH-туннель

Проброс локального порта на удалённый PostgreSQL:

ssh -L 5433:localhost:5432 user@server

Теперь подключаетесь к localhost:5433:

psql -h 127.0.0.1 -p 5433 -U app -d myapp

Переменные окружения клиента

export PGHOST=127.0.0.1
export PGPORT=5432
export PGUSER=app
export PGPASSWORD=secret
export PGDATABASE=myapp

psql  # подключится с этими настройками

Файл .pgpass

Хранит пароли для автоматизации:

# ~/.pgpass
127.0.0.1:5432:myapp:app:secret

Права:

chmod 600 ~/.pgpass

Что даёт: не нужно вводить пароль в скриптах.

Проверка соединения

Сервер жив:

pg_isready -h 127.0.0.1 -p 5432
# 127.0.0.1:5432 - accepting connections

Активные подключения:

SELECT pid, usename, application_name, state, query_start
FROM pg_stat_activity
WHERE state != 'idle';

Размер БД:

SELECT pg_size_pretty(pg_database_size('myapp'));

Частые ошибки

1. FATAL: Peer authentication failed:

peer` требует совпадения Unix-пользователя

Решение: использовать sudo -u postgres или md5.

2. could not connect to server: Connection refused:

Сервер не запущен или listen_addresses не тот

Решение: systemctl start postgresql, проверить listen_addresses.

3. no pg_hba.conf entry:

Нет правила для этого адреса

Решение: добавить строку в pg_hba.conf и reload.

4. Порт занят:

Проверить `ss -tlnp | grep 5432`

5. Docker-контейнер не видит данные:

Не смонтирован volume

Решение: -v pg_data:/var/lib/postgresql/data.

Практика

1. Установите PostgreSQL 16 через apt или Docker.

2. Настройте pg_hba.conf на scram-sha-256 для TCP.

3. Создайте пользователя и БД, подключитесь по TCP.

4. Проверьте pg_isready, посмотрите pg_stat_activity.

5. Настройте .pgpass для автоматизации.

Итог

  • Установка: apt (PGDG), Docker, бинарники.
  • Конфиги: postgresql.conf, pg_hba.conf.
  • Аутентификация: scram-sha-256.
  • Подключение: psql, строка, env, .pgpass.
  • Удалённо — SSH-туннель или VPN, не открытый порт.
  • Проверка: pg_isready, pg_stat_activity.

Дальше — типы данных.