Вариант запуска Postgres в Docker
This commit is contained in:
@@ -0,0 +1 @@
|
|||||||
|
initdb/*.sql
|
||||||
@@ -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.
|
||||||
|
|
||||||
@@ -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:
|
||||||
Executable
+17
@@ -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
|
||||||
Executable
+2
@@ -0,0 +1,2 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
docker compose exec -it db psql -U ${POSTGRES_USER:-postgres} -d demo
|
||||||
Reference in New Issue
Block a user