# ВМ-загрузка в drhider — реализовано (v0.0.58, 2026-08-21) _Реализация паттерна «ВМ-буфер + pull» по плану `2026-08-21-pattern-vm-buffer-pull-plan.md`._ _Снимок до изменений: ветка `save-pre-vm-upload-2026-08-21`._ ## Что сделано 1. **Flask** (`site/routes/api_bp.py`) — новый `POST /api/upload_refs`: принимает JSON `{session, files:[{name,size,url}]}`, тянет каждый файл с ВМ ИСХОДЯЩИМ GET (httpx, stream по частям), кладёт в сессию `add_file()`, после успешного pull делает DELETE с ВМ. Ошибки egress → 502. 2. **Фронт** (`site/templates/index.html`, `uploadFiles()`) — Фаза 1 переделана: - 1a: каждый файл → `PUT` на ВМ `https://contracts.kube5s.ru/drhider-upload/<токен>_` (XHR, прогресс по-прежнему в строке), собирает refs. - 1b: один маленький `POST /api/upload_refs` (<64КБ). - Токен — `crypto.randomUUID()`. Константа `VM_UPLOAD_URL`. 3. **ВМ** (`5.172.178.213`) — nginx `nginx-contracts.conf`: - `location /drhider-upload/` → `alias /var/www/drhider-upload/`, `dav_methods PUT DELETE`, `create_full_put_path on`, `client_max_body_size 1024m`, CORS-заголовки для `drhider.pythonk8s.dev.nubes.ru`, OPTIONS → 204. - Каталог `/var/www/drhider-upload/` (www-data). - Backup: `/tmp/nginx-contracts.conf.bak.20260821`. - TTL-чистка в root cron: `*/5 * * * * find /var/www/drhider-upload -type f -mmin +30 -delete`. 4. **Версия** — `site/app.py`: 0.0.57 → 0.0.58. ## Отклонение от плана - URL файла на ВМ — БЕЗ имени: `.../drhider-upload/<токен>_` (имя — только в метаданных). Иначе кириллица/пробелы в имени ломали бы URL. ## Тесты (2026-08-21) - ВМ: PUT 10МБ → 201 (1.0с); GET → 200, 10485760B; OPTIONS preflight → 204 с CORS; DELETE → 204; GET после DELETE → 404. - Сквозной: PUT на ВМ → `POST /api/upload_refs` → 200, файл в сессии (10485760B), файл с ВМ удалён (404). - `py_compile` api_bp/app — OK; `node --check` JS из index.html — OK. ## Замечания - ГРАБЛИ: на Krupski `dd` алиасится на `docker compose down` — для генерации файлов использовать `head -c N /dev/urandom > file`. - Локальные curl/httpx к contracts.kube5s.ru — через прокси (`172.17.192.1:10808`): для тестов `--noproxy '*'` / `NO_PROXY=contracts.kube5s.ru`. - Прод-безопасность (позже): токены без TTL-времени в самом URL, авторизация на ВМ (сейчас ключ — случайный UUID, файл живёт ≤30 мин по cron).