- добавлен 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 и документация
4.0 KiB
Image Platform
Image Platform - отдельная площадка для управления изображениями, variants, PostgreSQL metadata и S3/Object Storage.
Статус
Сейчас создан базовый monorepo, dev-инфраструктура, NestJS backend с Swagger, чистый Vite React TS admin, Fastify gateway, Drizzle database package, shared queue/storage packages и worker. Минимальный read-through flow уже реализован для dev.
Целевая схема
client
-> CDN optional
-> Fastify gateway + L1 memory cache
-> NestJS backend
-> S3/Object Storage persistent variants
-> generator/worker on miss
-> RabbitMQ
-> external imgproxy
-> source/original image
imgproxy всегда считается внешним сервисом и подключается через IMGPROXY_UPSTREAM.
Локальная разработка
В Docker поднимается только базовая инфраструктура:
- PostgreSQL
- MinIO
- MinIO bucket init
- imgproxy dev instance
- RabbitMQ
Нодой запускается:
- NestJS backend
- React/Vite admin
- Fastify gateway
- worker
Gateway принимает /images/{assetId}/v{version}/{preset}?w={width}&q={quality}&f=auto, выбирает фактический формат по Accept, вызывает Backend ensure endpoint и кэширует готовые bytes в L1 memory cache.
cp .env.example .env
pnpm install
pnpm infra:up
pnpm db:migrate
pnpm infra:config
pnpm backend:dev
pnpm admin:dev
pnpm gateway:dev
pnpm worker:dev
.env игнорируется git. Runtime-код не содержит dev credentials fallback: для production нужно передать реальные DATABASE_URL, RABBITMQ_URL, S3_* и IMGPROXY_UPSTREAM через окружение.
Минимальный smoke flow:
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"}'
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"
Сейчас доступны static presets из packages/image-config: card, hero, avatar. Произвольный single-image режим доступен через /images/{assetId}/v{version}/custom?..., если включён IMAGE_ALLOW_CUSTOM_TRANSFORMS=true.
Business API без админки:
curl -sS http://localhost:3001/api/presets
curl -sS http://localhost:3001/api/assets
curl -sS http://localhost:3001/api/assets/asset_demo/variants
curl -sS -X POST http://localhost:3001/api/assets/asset_demo/variants \
-H 'content-type: application/json' \
-d '{"preset":"card","mode":"family"}'
Порты по умолчанию:
| Сервис | URL |
|---|---|
| PostgreSQL | localhost:5433 |
| MinIO API | http://localhost:9000 |
| MinIO Console | http://localhost:9001 |
| imgproxy | http://localhost:18080 |
| RabbitMQ | amqp://localhost:5672 |
| RabbitMQ Management | http://localhost:15672 |
| Backend API | http://localhost:3001/api |
| Swagger | http://localhost:3001/docs |
| Admin | http://localhost:5173 |
| Gateway | http://localhost:8888 |
Если старый локальный image-gateway уже занимает 8888, остановите его или задайте другой GATEWAY_PORT в .env.
Документация
docs/architecture.md- целевая архитектура и ответственность компонентов.docs/development.md- локальный dev flow.docs/data-model.md- текущая Drizzle/PostgreSQL модель.docs/backend-contract-draft.md- черновик будущего backend-контракта.docs/imgproxy-contract.md- контракт с external imgproxy.docs/next-image-provider.md- контракт custom provider дляnext/image.