feat: добавить генерацию image variants
- добавлен shared config presets, custom transforms и allowlist hosts - реализованы Backend endpoints для assets, presets и variants - добавлена orchestration через PostgreSQL, RabbitMQ, S3 и worker - обновлён Gateway read-through flow с L1 cache и корректным Vary: Accept - добавлена миграция resize_mode для variants lookup - обновлены dev scripts, env template, lockfile и документация
This commit is contained in:
@@ -12,7 +12,7 @@
|
||||
- imgproxy dev instance;
|
||||
- RabbitMQ.
|
||||
|
||||
`backend` уже создан как NestJS app. `admin` уже создан как чистый Vite React TS app. `gateway` уже создан как Fastify app. `worker` уже создан как RabbitMQ skeleton.
|
||||
`backend` уже умеет регистрировать assets и выполнять internal ensure. `gateway` уже ходит в Backend и держит L1 memory cache. `worker` уже читает RabbitMQ jobs, вызывает imgproxy и пишет variants в S3.
|
||||
Gateway обязателен для Cloudinary-like поведения и интеграции с `next/image`.
|
||||
|
||||
## Запуск инфраструктуры
|
||||
@@ -21,8 +21,11 @@ Gateway обязателен для Cloudinary-like поведения и инт
|
||||
cp .env.example .env
|
||||
pnpm install
|
||||
pnpm infra:up
|
||||
pnpm db:migrate
|
||||
```
|
||||
|
||||
`.env` используется только локально и игнорируется git. Backend, Gateway, Worker и Drizzle scripts автоматически подхватывают его через Node `--env-file-if-exists`; в production эти переменные должны приходить из окружения процесса.
|
||||
|
||||
Проверить compose config:
|
||||
|
||||
```bash
|
||||
@@ -73,6 +76,31 @@ curl http://localhost:3001/api/health
|
||||
open http://localhost:3001/docs
|
||||
```
|
||||
|
||||
Зарегистрировать source image в dev mode:
|
||||
|
||||
```bash
|
||||
curl -sS -X POST http://localhost:3001/api/assets \
|
||||
-H 'content-type: application/json' \
|
||||
-d '{"sourceUrl":"https://storage.yandexcloud.net/shared1318/img/1.jpg","publicId":"asset_demo"}'
|
||||
```
|
||||
|
||||
Посмотреть business API:
|
||||
|
||||
```bash
|
||||
curl -sS http://localhost:3001/api/presets
|
||||
curl -sS http://localhost:3001/api/assets
|
||||
curl -sS http://localhost:3001/api/assets/asset_demo
|
||||
curl -sS http://localhost:3001/api/assets/asset_demo/variants
|
||||
```
|
||||
|
||||
Явно поставить jobs на генерацию family variants без Gateway lazy request:
|
||||
|
||||
```bash
|
||||
curl -sS -X POST http://localhost:3001/api/assets/asset_demo/variants \
|
||||
-H 'content-type: application/json' \
|
||||
-d '{"preset":"card","mode":"family"}'
|
||||
```
|
||||
|
||||
## Database
|
||||
|
||||
Drizzle schema живёт в `packages/database/src/schema.ts`, миграции - в `packages/database/drizzle`.
|
||||
@@ -130,17 +158,27 @@ pnpm gateway:dev
|
||||
curl http://localhost:8888/health
|
||||
```
|
||||
|
||||
Проверить placeholder image origin route:
|
||||
Проверить image origin route после запуска Backend и Worker:
|
||||
|
||||
```bash
|
||||
curl -i "http://localhost:8888/images/asset_123/v4/card?w=640&q=80&f=auto"
|
||||
curl -i "http://localhost:8888/images/asset_demo/v1/card?w=640&q=80&f=auto"
|
||||
curl -i "http://localhost:8888/images/asset_demo/v1/avatar?f=auto"
|
||||
curl -i "http://localhost:8888/images/asset_demo/v1/custom?w=777&h=333&q=72&fit=fill&f=webp"
|
||||
```
|
||||
|
||||
Ожидаемый текущий статус - `501`, потому что S3/imgproxy генерация ещё не реализована.
|
||||
Первый запрос должен пройти через Backend/RabbitMQ/Worker/imgproxy/S3 и вернуться с `x-image-platform-l1: MISS`. Повторный запрос должен вернуться из gateway L1 с `x-image-platform-l1: HIT`.
|
||||
|
||||
Статические presets сейчас лежат в `packages/image-config`:
|
||||
|
||||
- `card` - responsive, widths `320`, `640`, `960`.
|
||||
- `hero` - responsive, widths `1280`, `1920`.
|
||||
- `avatar` - fixed `256x256`.
|
||||
|
||||
Mock allowlist source hosts задаётся через `SOURCE_ALLOWED_HOSTS`. В dev по умолчанию разрешён `storage.yandexcloud.net`.
|
||||
|
||||
## Worker
|
||||
|
||||
Worker запускается нодой и сейчас только объявляет RabbitMQ topology, слушает `image.generate-variant` и отправляет полученные jobs в DLQ, потому что генерация ещё не реализована.
|
||||
Worker запускается нодой, объявляет RabbitMQ topology, слушает `image.generate-variant`, вызывает `imgproxy` и пишет готовый variant в S3.
|
||||
|
||||
```bash
|
||||
pnpm worker:dev
|
||||
|
||||
Reference in New Issue
Block a user