DaydreamMods
Файлы сборок
Куда кладётся ZIP, как он называется в базе и как его забирает игрок.
Платный архив не лежит в public и не имеет адреса вида /packs/warpgate.zip.
Загрузка из админки
Раздел «Версии». Администратор выбирает сборку, номер, дату выпуска, текст изменений, статус и файл с компьютера. Принимается ZIP. Пока байты идут, полоса показывает процент и «сколько из скольких». На 100% подпись меняется: файл передан, сервер его записывает. Страницу не закрывают.
Успешный ответ содержит storageKey вида local:<имя>.zip, исходное имя и размер. Эти поля подставляются в форму. Кнопку «Сохранить» всё равно нажимают: загрузка кладёт файл на диск, запись версии — отдельно в таблицу project_versions.
Каталог на диске: PACK_STORAGE_DIR, в проде /opt/daydreammods/storage/packs. Имя файла случайное, не исходное. Исходное имя хранится в file_name и уходит в заголовок Content-Disposition.
Лимит маршрута — 512 МБ на сам обработчик и до 1 ГБ на nginx. Файл больше лимита не «зависает молча»: клиент получает текст, что сервер отклонил размер. Оборванная передача файл не оставляет.
Картинки баннеров идут тем же маршрутом, но в public/uploads, лимит 4 МБ, в ответе поле url.
Статусы версии
draft— черновик, в кабинете нет.published— видна владельцам доступа.hidden— скрыта, файл на диске может остаться.
Без storageKey версию сохранить можно, но скачивание не найдёт архив. В форме это предупреждение жёлтым.
Выдача игроку
1. Кабинет вызывает account.requestDownload с id версии.
2. Сервер проверяет: версия опубликована; есть подписка active; в plan_entitlements этот тариф связан с проектом версии; срок подписки не истёк по данным статуса.
3. В download_tokens пишется хеш токена и expires_at = сейчас + 10 минут.
4. Браузер открывает https://daydreammods.ru/downloads/<сырой токен>.
5. API находит хеш, отказывает если токен просрочен или уже использован, помечает used_at и отдаёт поток.
Если ключ начинается с local:, читается файл из каталога сборок. Если настроен S3 и ключ обычный — объект бакета. Иначе текстовая заглушка для разработки: это не игровой архив.
Повторно той же ссылкой скачать нельзя. Нужна новая кнопка в кабинете.
CDN в настройках помечен «в разработке» и файлы через него не раздаёт. Предупреждение в разделе «Версии» об этом остаётся, пока бакет не подключён.