# Upload Platform Переиспользуемый сервис загрузки файлов через ВМ-буфер. Выносит два слоя — **выбор файлов** (фронт) и **закачку через ВМ** (фронт + бэк) — в отдельный проект, который копируется в любой другой проект. Паттерн: браузер → `PUT` на ВМ-буфер → Flask `POST /api/upload_refs` (egress pull) → сессия. ## Слои | Слой | Ответственность | |---|---| | 0. Конфиг | `vmUploadUrl`, `allowedExt`, лимиты, ретраи | | 1. Выбор файлов | таблица, дедуп, раскрытие ZIP, рекурсивный обход папки | | 2. Закачка через ВМ | PUT на ВМ → pull в сессию | | 3. Логика приложения | здесь — стаб-заглушка (в каждом проекте своя) | ## Структура ``` upload-platform/ ├── requirements.txt ├── config.json # слой 0 (рабочий конфиг этого демо) ├── upload/ # ← переиспользуемый модуль (копируется в любой проект) │ ├── README.md # инструкция интеграции │ ├── config.example.json │ ├── frontend/ # слои 1+2 (vanilla JS, ES-модули) │ │ ├── zip/ │ │ ├── table/ │ │ └── upload/ │ └── backend/ # слой 2 (Python) │ ├── upload_refs/ │ └── session/ └── site/ # демо-обёртка (не переиспользуется) ├── app.py ├── routes/ ├── templates/ └── static/ ``` ## Локальный запуск ```bash pip install -r requirements.txt python site/app.py # → http://127.0.0.1:5000/ ``` ## Деплой на Nubes - Точка входа: `site/app.py` (платформа запускает `python site/app.py`). - `app.run(host="0.0.0.0", port=5000, debug=False)`. - Маршрут `/health` → `200` (иначе liveness-проба платформы убивает под). - Без `site/__init__.py` и factory pattern. ## Как интегрировать слои в другой проект 1. Скопировать папку `upload/` в свой проект. 2. Задать свой конфиг (по образцу `upload/config.example.json`). 3. Фронт: подключить ES-модули из `upload/frontend/` через `