Files
de-roadmap/postgres-bookings

Postgres + demoDB "bookings" в Docker — README для менти

Этот стенд поднимает локальный PostgreSQL в Docker и загружает учебную БД Postgres Pro demo “Airlines/Bookings”. После запуска можно работать через psql (внутри контейнера) и через DBeaver (с хоста).


Что нужно заранее

  • Docker Desktop (Windows/macOS) или Docker Engine (Linux) + docker compose.
  • Утилита unzip (Linux: sudo apt install unzip / sudo dnf install unzip).
  • Свободный порт 5432 (или задайте другой через .env).
  • Windows: желательно запускать команды в WSL2 либо в Git Bash (так проще с shell‑скриптами и LF‑окончаниями).

Проверка окружения:

docker --version
docker compose version

Состав проекта (что у вас должно быть в папке)

postgres-bookings/
├─ docker-compose.yml
├─ .env                 # опционально: логин/пароль/порт
├─ initdb/
│   ├─ 00_init.sql      # создаёт БД demo (страхует первый запуск)
│   └─ 01_bookings.sql  # скрипт с учебными данными
└─ psql_sh              # помощник: открыть psql внутри контейнера

Если нет файлов initdb/00_init.sql и initdb/01_bookings.sql, запустите скрипт ниже (раздел «Быстрый старт», шаг 1).


Быстрый старт (Linux/macOS/WSL2)

  1. Подготовьте init‑скрипты (скачивание демо‑БД):
bash download_db.sh
chmod +x psql_sh
  1. Поднимите кластер:
docker compose up -d
  1. Проверьте, что сервис готов (статус healthy) и подключайтесь:
docker compose ps
./psql_sh

Внутри psql можно проверить данные:

\dt;
SELECT COUNT(*) FROM bookings.flights;

DBeaver: Host 127.0.0.1, Port 5432 (или ваш из .env), Database demo, User postgres, Password postgres, SSL — Off.


Как поменять порт/логин/пароль

Создайте файл .env в корне проекта:

POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
PG_PORT=5432

Перезапустите контейнеры:

docker compose down && docker compose up -d

Частые команды

# запустить в фоне / остановить
docker compose up -d
docker compose down

# статус и логи
docker compose ps
docker compose logs -f --tail=200

# открыть psql
./psql_sh

Сброс и повторная заливка

Автозагрузка из initdb/ выполняется только при первом старте с пустым томом данных.

  • Полный сброс и переинициализация:
docker compose down -v && docker compose up -d
  • Перезалить данные без удаления тома:
docker compose exec -T db psql -U postgres -d postgres \
  -f /docker-entrypoint-initdb.d/01_bookings.sql

Частые проблемы и решения

  • Порт 5432 занят. Поменяйте PG_PORT в .env, затем docker compose down && docker compose up -d.
  • ./psql_sh: Permission denied. Дайте права: chmod +x psql_sh.
  • psql: could not connect to server / статус не healthy. Смотрите логи: docker compose logs -f --tail=200.
  • Windows и CRLF. Если редактировали файлы Блокнотом, убедитесь в LF‑окончаниях (используйте Git Bash/WSL2).
  • unzip: command not found (Linux). Установите unzip командой дистрибутива.

Зачем нужен 00_init.sql?

Учебный скрипт 01_bookings.sql начинается с DROP DATABASE demo; (без IF EXISTS). На самом первом запуске БД demo ещё нет, поэтому DROP вызвал бы ошибку. Файл 00_init.sql предварительно создаёт БД demo, чтобы импорт прошёл без сбоев.


Что внутри демо‑БД

Схема bookings: таблицы airports, aircrafts, flights, tickets, ticket_flights, boarding_passes и др. Идеально для практики JOIN, оконных функций, индексов и анализа планов (EXPLAIN ANALYZE).

Безопасность: значения по умолчанию (postgres/postgres) — только для учебных целей на локальной машине. Для реальных проектов используйте сильные пароли и SSL.