Перейти к содержанию

Закрытый файловый архив: загрузки, S3 и обработка изображений

В серии вы последовательно собираете учебный проект «Архив». Каждый урок добавляет один механизм к результату предыдущего; в архиве приведены полные накопительные состояния lesson-01—lesson-12.

Нужны основы JavaScript, HTTP и SQL, локальная среда Node.js и отдельная лабораторная база PostgreSQL. Конкретные прямые зависимости закреплены в исходниках. Архив не содержит установленной среды и разрешённого lockfile.

Урок Результат
1. Модель закрытого файлового архива Разделить карточку, байты и состояния файла.
2. Политика размера и типа файла Проверить заявку по размеру, имени и допустимым типам.
3. Владелец файла и авторизация запросов Привязать каждую операцию к аутентифицированному владельцу.
4. Закрытое S3-совместимое хранилище Подключить закрытый бакет с обязательным versioning.
5. Разрешение на прямую загрузку Создать ограниченный presigned POST и зарезервировать квоту.
6. Подтверждение загруженной версии Зафиксировать versionId, длину и задачу обработки атомарно.
7. Временная ссылка на скачивание Выдать GET только на готовую версию своего файла.
8. Безопасные производные изображения Декодировать и перекодировать JPEG/PNG/WebP в безопасный WebP.
9. Фоновая обработка файлов Добавить SQL-очередь с lease, повторами и fencing.
10. Удаление файла и гонки операций Сначала запретить новые выдачи, затем удалить версии.
11. Очистка сирот и сроки хранения Согласовать сборку сирот, неприкосновенный журнал и retention.
12. Подготовка архива к выпуску Описать эксплуатационный выпуск и восстановление без запуска.

Скачать исходники. Выберите одно состояние вместо смешивания файлов разных уроков. Файлы схемы предназначены для пустой лабораторной базы; они не заявлены как миграции существующего приложения.

Материалы опубликованы. Учебные приложения, контейнеры, схемы и обработчики не запускались; показанные ответы и изменения описывают ожидаемый контракт. Версии и API сверены по первичной документации, а воспроизводимость среды предстоит проверить отдельно.