Files
de-roadmap/postgres-bookings/README.md
T

125 lines
5.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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‑окончаниями).
Проверка окружения:
```bash
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
bash download_db.sh
chmod +x psql_sh
```
2) Поднимите кластер:
```bash
docker compose up -d
```
3) Проверьте, что сервис готов (статус `healthy`) и подключайтесь:
```bash
docker compose ps
./psql_sh
```
Внутри `psql` можно проверить данные:
```sql
\dt;
SELECT COUNT(*) FROM bookings.flights;
```
> **DBeaver:** Host `127.0.0.1`, Port `5432` (или ваш из `.env`), Database `demo`, User `postgres`, Password `postgres`, SSL — Off.
---
## Как поменять порт/логин/пароль
Создайте файл `.env` в корне проекта:
```ini
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
PG_PORT=5432
```
Перезапустите контейнеры:
```bash
docker compose down && docker compose up -d
```
---
## Частые команды
```bash
# запустить в фоне / остановить
docker compose up -d
docker compose down
# статус и логи
docker compose ps
docker compose logs -f --tail=200
# открыть psql
./psql_sh
```
---
## Сброс и повторная заливка
> Автозагрузка из `initdb/` выполняется **только** при первом старте с пустым томом данных.
- Полный сброс и переинициализация:
```bash
docker compose down -v && docker compose up -d
```
- Перезалить данные без удаления тома:
```bash
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.