Files

Postgres + demoDB "bookings" в Docker

Этот стенд поднимает локальный 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

Структура проекта

Важно: файлы 00_init.sql и 01_bookings.sql создаются скриптом download_db.sh и изначально отсутствуют.

postgres-bookings/
├─ docker-compose.yml
├─ download_db.sh       # скрипт скачивания и подготовки демо-БД
├─ .env                 # опционально: логин/пароль/порт
├─ initdb/              # изначально пусто
└─ psql_sh              # помощник: открыть psql внутри контейнера

После выполнения шага «Быстрый старт → п.1» в initdb/ появятся:

initdb/
├─ 00_init.sql # создаёт БД demo (страхует первый запуск)
└─ 01_bookings.sql # учебные данные Postgres Pro

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

  1. Скачать и подготовить демо‑БД:
bash download_db.sh
chmod +x psql_sh
  1. Запустить кластер:
docker compose up -d
  1. Проверить статус и подключиться к psql:
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

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

# запустить в фоне / остановить
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.