Нужное поведение - Cloudinary-like: публичный URL изображения сам запускает read-through pipeline, если variant ещё не создан.
`image-platform` строится ради совместимости с`next/image` как custom loader provider. Next.js application не должен заранее вызывать API, ждать генерацию и затем подставлять S3 URL. Он должен передавать `src`, `width` и `quality` в loader, а loader должен вернуть стабильный URL нашего image origin.
Gateway поэтому является обязательной частью public delivery path, а не опциональным кешем.
Backend управляет процессами: PostgreSQL, S3 read, RabbitMQ enqueue, ожидание ready variant. Worker выполняет CPU-heavy generation через external imgproxy и пишет результат в S3.
`v{version}` берётся из `image_assets.current_version` и меняется при обновлении source image. Это даёт immutable cache без purge старых CDN/L1/S3 keys.
`f=auto` нужен для совместимости с`next/image` custom loader: Next передаёт в loader `src`, `width` и `quality`, но не выбирает AVIF/WebP сам при custom loader. Image origin должен выбрать формат по `Accept` header, как Cloudinary `f_auto`.
Из-за `f=auto` обязательно:
- S3 key должен включать фактически выбранный формат;
- response должен выставлять `Vary: Accept`;
- CDN и Gateway L1 cache должны учитывать `Accept`;
- response должен выставлять `Cache-Control: public, max-age=31536000, immutable` для versioned assets.
Для ручного `<picture>`/`srcset` можно добавить явный формат позже: