44 lines
3.0 KiB
Markdown
44 lines
3.0 KiB
Markdown
# ВМ-загрузка в 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).
|