3.0 KiB
3.0 KiB
ВМ-загрузка в drhider — реализовано (v0.0.58, 2026-08-21)
Реализация паттерна «ВМ-буфер + pull» по плану 2026-08-21-pattern-vm-buffer-pull-plan.md.
Снимок до изменений: ветка save-pre-vm-upload-2026-08-21.
Что сделано
- 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. - Фронт (
site/templates/index.html,uploadFiles()) — Фаза 1 переделана:- 1a: каждый файл →
PUTна ВМhttps://contracts.kube5s.ru/drhider-upload/<токен>_<k>(XHR, прогресс по-прежнему в строке), собирает refs. - 1b: один маленький
POST /api/upload_refs(<64КБ). - Токен —
crypto.randomUUID(). КонстантаVM_UPLOAD_URL.
- 1a: каждый файл →
- ВМ (
5.172.178.213) — nginxnginx-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.
- Версия —
site/app.py: 0.0.57 → 0.0.58.
Отклонение от плана
- URL файла на ВМ — БЕЗ имени:
.../drhider-upload/<токен>_<k>(имя — только в метаданных). Иначе кириллица/пробелы в имени ломали бы 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_compileapi_bp/app — OK;node --checkJS из 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).