Установка и подключение
Способы установки
Три варианта:
- Пакетный менеджер —
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.
Дальше — типы данных.