Files
drhider/History/infra/2026-08-21-vm-upload-implemented.md
T

3.0 KiB
Raw Blame History

ВМ-загрузка в 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/<токен>_<k> (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/<токен>_<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_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).