Ноябрь 2025 — релиз в январе 2026 — остановлен в мае 2026
Моя зона
Клиент, сервер, воркеры, админка, инфраструктура
Команда проекта
Дизайн, промпты стилей, маркетинг и закупка — на стороне издателя Evrika Games; интеграцию платежей и подписок доделывал ещё один разработчик
Задача
Мобильное приложение для AI-фотосессий с собственной системой обработки изображений: от загрузки фото до готовой серии снимков и видео в выбранном стиле.
Путь одного заказа
Генерация занимает от минуты до десяти — дольше, чем живёт HTTP-запрос. Поэтому заказ идёт через очередь и отдельный workflow: упавший воркер или оборванная сеть не теряют результат.
APPFlutter-клиент
Пережимает фото — обычно до 1 МБ — и загружает по протоколу tus с докачкой после обрыва. Повторное фото не грузится заново — его узнаёт хеш.
APINestJS API
Проверяет пресет и баланс монет, записывает заказ в PostgreSQL и ставит задачу в очередь с id заказа.
QUEUEBullMQ на Redis
Воркеры забирают задачи из очереди; зависшую задачу очередь отдаёт другому воркеру.
WORKFLOWbull-dozer
Шаги заказа: генерация в Replicate, для видео — ожидание модели и обработка в ffmpeg, затем ватермарка. У каждого шага свои ретраи.
CDNS3 и CloudFront
Оригинал, превью и версия с ватермаркой. Подписанные cookie открывают только файлы своего профиля.
RESULTВозврат в приложение
Сервер публикует статус в Redis-канал пользователя, клиент ждёт его long-polling-запросом до 60 секунд.
Сбой воркера не оплачивается дважды
bull-dozer хранит результат каждого шага в Redis. Перезапущенный workflow берёт готовые шаги из кеша и не вызывает платную модель повторно; сырое видео сохраняется в S3 до того, как истечёт ссылка Replicate.
Результат — в момент готовности
Long-polling поверх Redis pub/sub: клиент узнаёт о завершении сразу, без опроса по таймеру и без отдельной push-инфраструктуры.
Пайплайн на Replicate: очередь заказов, многоэтапные генерации, видео по нескольким сценариям, совместные генерации, постобработка, ватермарки, ретраи.