From 1635cd18d7072ac84567e4b676e4495d6b29cc00 Mon Sep 17 00:00:00 2001 From: Dmitry Dementev Date: Sun, 14 Sep 2025 21:37:42 +0300 Subject: [PATCH] =?UTF-8?q?=D0=92=D0=B0=D1=80=D0=B8=D0=B0=D0=BD=D1=82=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA=D0=B0=20Postgres=20=D0=B2?= =?UTF-8?q?=20Docker?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- postgres-bookings/.gitignore | 1 + postgres-bookings/README.md | 124 +++++++++++++++++++++++++++ postgres-bookings/docker-compose.yml | 23 +++++ postgres-bookings/download_db.sh | 17 ++++ postgres-bookings/psql_sh | 2 + 5 files changed, 167 insertions(+) create mode 100644 postgres-bookings/.gitignore create mode 100644 postgres-bookings/README.md create mode 100644 postgres-bookings/docker-compose.yml create mode 100755 postgres-bookings/download_db.sh create mode 100755 postgres-bookings/psql_sh diff --git a/postgres-bookings/.gitignore b/postgres-bookings/.gitignore new file mode 100644 index 0000000..f73c41c --- /dev/null +++ b/postgres-bookings/.gitignore @@ -0,0 +1 @@ +initdb/*.sql diff --git a/postgres-bookings/README.md b/postgres-bookings/README.md new file mode 100644 index 0000000..c5f5c92 --- /dev/null +++ b/postgres-bookings/README.md @@ -0,0 +1,124 @@ +# 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. + diff --git a/postgres-bookings/docker-compose.yml b/postgres-bookings/docker-compose.yml new file mode 100644 index 0000000..c628b09 --- /dev/null +++ b/postgres-bookings/docker-compose.yml @@ -0,0 +1,23 @@ +services: + db: + image: postgres:17 + # container_name: pg-demo + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + # гарантируем UTF-8 и предсказуемую сортировку + POSTGRES_INITDB_ARGS: "--encoding=UTF8 --lc-collate=en_US.UTF-8 --lc-ctype=en_US.UTF-8" + ports: + - "5432:5432" + volumes: + - pgdata:/var/lib/postgresql/data + - ./initdb:/docker-entrypoint-initdb.d:ro + healthcheck: + test: ["CMD-SHELL", "pg_isready -U postgres -d postgres"] + interval: 5s + timeout: 5s + retries: 20 + restart: unless-stopped + +volumes: + pgdata: diff --git a/postgres-bookings/download_db.sh b/postgres-bookings/download_db.sh new file mode 100755 index 0000000..7c8b46f --- /dev/null +++ b/postgres-bookings/download_db.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +# создадим папку проекта и подпапку для init-скриптов +mkdir -p initdb +rm -rf initdb/*.sql + +# пример: «средняя» демо-база (3 месяца данных, ~700 МБ после загрузки) +wget https://edu.postgrespro.com/demo-medium-en.zip +unzip demo-medium-en.zip -d initdb +rm -f demo-medium-en.zip + +# переименуем SQL для удобства +# (имя исходного файла содержит дату; это нормально) +mv initdb/demo-*.sql initdb/01_bookings.sql +cat > initdb/00_init.sql <<'SQL' +CREATE DATABASE demo; +SQL diff --git a/postgres-bookings/psql_sh b/postgres-bookings/psql_sh new file mode 100755 index 0000000..2692371 --- /dev/null +++ b/postgres-bookings/psql_sh @@ -0,0 +1,2 @@ +#!/bin/bash +docker compose exec -it db psql -U ${POSTGRES_USER:-postgres} -d demo