v0.0.58: ВМ-загрузка (паттерн ВМ-буфер+pull) — PUT на ВМ + /api/upload_refs (egress), nginx /drhider-upload/ + CORS + TTL
Deploy drhider / validate (push) Canceled after 0s
Deploy drhider / validate (push) Canceled after 0s
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
# ПЛАН: перенос паттерна «ВМ-буфер + pull» в drhider
|
||||
|
||||
_Дата: 2026-08-21. Основа: `contracts/loadtest/History/2026-08-21-pattern-vm-buffer-pull.md`._
|
||||
_Статус: план, код НЕ менялся. Писать будет DeepSeek Flash._
|
||||
_Статус: РЕАЛИЗОВАНО 2026-08-21 (v0.0.58), см. `2026-08-21-vm-upload-implemented.md`._
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
# ВМ-загрузка в 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).
|
||||
Reference in New Issue
Block a user