feat(seed): add API test-data seeding script and make testdata target
- scripts/seed.py: stdlib HTTP client, JPEG+EXIF via optional Pillow (PNG fallback), additive-only, dry-run - Makefile: testdata target with ALBUMS/PHOTOS/SEED/TIMEOUT and boolean flags - README: usage section; new dev-seed-data capability spec
This commit is contained in:
@@ -29,11 +29,45 @@ SvelteKit через `go:embed`, запуск через systemd.
|
||||
cp .env.example .env
|
||||
```
|
||||
|
||||
Ключевые переменные: `PG_*`, `S3_*` (обязательны `UsePathStyle=true` и регион
|
||||
`garage`), `JWT_ACCESS_TTL`, `JWT_REFRESH_TTL`, `HTTP_ADDR`,
|
||||
`SSE_HEARTBEAT_INTERVAL`, `SSE_CLIENT_BUFFER`. Секрет подписи токенов не задаётся
|
||||
в окружении: он генерируется при первом старте и хранится в слое метаданных
|
||||
(`app_settings`).
|
||||
Секрет подписи токенов (`JWT_SECRET`) в окружении не задаётся: он генерируется
|
||||
при первом старте и хранится в слое метаданных (`app_settings`).
|
||||
|
||||
Все параметры окружения (регистр имён учитывается):
|
||||
|
||||
| Переменная | Значение по умолчанию | Описание |
|
||||
| --- | --- | --- |
|
||||
| `HTTP_ADDR` | `:8080` | Адрес прослушивания HTTP-сервера |
|
||||
| `APP_BASE_URL` | `http://localhost:8080` | Внешний базовый URL приложения (для ссылок и SSE) |
|
||||
| **База данных (метаданные)** | | |
|
||||
| `DB_BACKEND` | `sqlite` | Слой метаданных: `sqlite` или `postgres` |
|
||||
| `SQLITE_PATH` | `./galo.db` | Путь к файлу SQLite (при `DB_BACKEND=sqlite`) |
|
||||
| `PG_HOST` | `pg.localnet` | Хост PostgreSQL |
|
||||
| `PG_PORT` | `5432` | Порт PostgreSQL |
|
||||
| `PG_USER` | `album` | Пользователь PostgreSQL |
|
||||
| `PG_PASSWORD` | *(пусто)* | Пароль PostgreSQL (обязателен при `DB_BACKEND=postgres`) |
|
||||
| `PG_DATABASE` | `galo` | Имя БД PostgreSQL |
|
||||
| `PG_SSLMODE` | `disable` | SSL-режим PostgreSQL |
|
||||
| **Блочное хранилище** | | |
|
||||
| `STORAGE_BACKEND` | `fs` | Бэкенд блобов: `fs` или `s3` |
|
||||
| `FS_ROOT` | `./data` | Корень ФС для блобов (при `STORAGE_BACKEND=fs`) |
|
||||
| `S3_ENDPOINT` | `http://s3.localnet:3900` | Endpoint S3/Garage |
|
||||
| `S3_REGION` | `garage` | Регион S3 |
|
||||
| `S3_ACCESS_KEY` | *(пусто)* | Access key S3 |
|
||||
| `S3_SECRET_KEY` | *(пусто)* | Secret key S3 |
|
||||
| `S3_BUCKET` | `albums` | Имя бакета S3 |
|
||||
| `S3_USE_PATH_STYLE` | `true` | Использовать path-style запросы (обязательно для Garage) |
|
||||
| `OBJECT_URL_TTL` | `1h` | Время жизни подписанных URL объектов |
|
||||
| `URL_SECRET` | *(пусто)* | Секрет подписи URL объектов; при пустом — секрет из `app_settings` |
|
||||
| **Auth / JWT** | | |
|
||||
| `JWT_ACCESS_TTL` | `15m` | Время жизни access-токена |
|
||||
| `JWT_REFRESH_TTL` | `720h` | Время жизни refresh-токена |
|
||||
| **SSE** | | |
|
||||
| `SSE_HEARTBEAT_INTERVAL` | `25s` | Период heartbeat-сообщений каналов SSE |
|
||||
| `SSE_CLIENT_BUFFER` | `64` | Размер буфера клиента SSE (количество сообщений) |
|
||||
| **Фоновый воркер** (генерация вариантов + GC объектов) | | |
|
||||
| `WORKER_INTERVAL` | `5s` | Период проверки воркером очереди задач |
|
||||
| `WORKER_BATCH` | `10` | Размер батча обрабатываемых задач |
|
||||
| `WORKER_PENDING_TTL` | `10m` | TTL задачи в статусе `pending` до повторной попытки |
|
||||
|
||||
Слои данных выбираются параметрами (по умолчанию — локальный режим):
|
||||
|
||||
@@ -96,6 +130,57 @@ curl -s localhost:8080/api/health # {"status":"ok","db":"ok","s3":"ok"}
|
||||
cd frontend && npm run dev # Vite проксирует /api на :8080
|
||||
```
|
||||
|
||||
## Наполнение тестовыми данными
|
||||
|
||||
Скрипт `scripts/seed.py` наполняет запущенный инстанс тестовыми данными через публичный
|
||||
API: создаёт альбомы, генерирует фотографии и, по флагам, добавляет теги, комментарии,
|
||||
лайки, share-ссылки и инвайты. Работает только на добавление — существующие данные не
|
||||
удаляются и не изменяются.
|
||||
|
||||
```bash
|
||||
GALO_EMAIL=owner@example.com GALO_PASSWORD=secret \
|
||||
python3 scripts/seed.py --albums 2 --photos-per-album 10 --tags --likes
|
||||
```
|
||||
|
||||
Ту же операцию можно выполнить через Make-цель (параметры — переменные сборки):
|
||||
|
||||
```bash
|
||||
GALO_EMAIL=owner@example.com GALO_PASSWORD=secret \
|
||||
make testdata ALBUMS=3 PHOTOS=5 TAGS=1 LIKES=1 SEED=42
|
||||
```
|
||||
|
||||
Значения по умолчанию: `ALBUMS=2`, `PHOTOS=10`, `SEED=0`, `TIMEOUT=30`. Булевы
|
||||
параметры включаются значением `1`: `TAGS`, `COMMENTS`, `LIKES`, `SHARE`, `INVITES`,
|
||||
`WAIT`, `DRY`. Дополнительные флаги передаются через `ARGS`.
|
||||
|
||||
Переменные окружения:
|
||||
|
||||
| Переменная | По умолчанию | Описание |
|
||||
| --- | --- | --- |
|
||||
| `GALO_BASE_URL` | `http://localhost:8080` | Базовый URL инстанса |
|
||||
| `GALO_EMAIL` | — | Email владельца (обязательно) |
|
||||
| `GALO_PASSWORD` | — | Пароль владельца (обязательно) |
|
||||
|
||||
Параметры:
|
||||
|
||||
| Флаг | По умолчанию | Описание |
|
||||
| --- | --- | --- |
|
||||
| `--albums` | `2` | Число альбомов |
|
||||
| `--photos-per-album` | `10` | Фотографий в каждом альбоме |
|
||||
| `--seed` | `0` | Seed генератора (воспроизводимость) |
|
||||
| `--tags` | выкл. | Добавлять теги |
|
||||
| `--comments` | выкл. | Добавлять комментарии |
|
||||
| `--likes` | выкл. | Добавлять лайки |
|
||||
| `--share-links` | выкл. | Создавать share-ссылки на альбомы |
|
||||
| `--invites` | выкл. | Создавать инвайты (роль `member`) |
|
||||
| `--wait-variants` | выкл. | Дожидаться генерации превью каждого фото |
|
||||
| `--timeout` | `30` | Таймаут ожидания и сетевых запросов, сек |
|
||||
| `--dry-run` | выкл. | Показать план и не отправлять изменяющих запросов |
|
||||
|
||||
Изображения генерируются на лету: при установленной Pillow — JPEG с EXIF (дата съёмки и
|
||||
GPS), иначе — PNG без EXIF на стандартной библиотеке. Ядро скрипта не требует сторонних
|
||||
пакетов; Pillow — необязательная зависимость.
|
||||
|
||||
## Тесты
|
||||
|
||||
```bash
|
||||
|
||||
Reference in New Issue
Block a user