diff --git a/History/sonnet-question-upload-rst-2026-07-15.md b/History/sonnet-question-upload-rst-2026-07-15.md new file mode 100644 index 0000000..f9d6a0f --- /dev/null +++ b/History/sonnet-question-upload-rst-2026-07-15.md @@ -0,0 +1,70 @@ +# Вопрос для Sonnet — проблема первого upload (без ссылок на файлы) + +## Ситуация + +Мигрировали сервис "Сверка договоров" с ВМ на Flask (managed Python, Штурвал). +Всё работает: классификация LLM, парсинг, группы, сравнение через SSE. +НО: **первый файл при upload из браузера падает с ERR_CONNECTION_RESET**. + +Та же проблема прямо сейчас на втором сервисе — drhider (Обфускация документов). +Вчера (14 июля) drhider работал, сегодня (15 июля) — оба сервиса сломаны одинаково. + +## Симптомы + +- **Браузер**: первый POST с файлом (~63KB) зависает на 100% прогресса, ответ не приходит +- **curl с ВМ (5.172.178.213)**: 5/5 upload успешно, ~80-100ms каждый +- **Затрагивает оба сервиса**: contractor и drhider +- **Признак**: ERR_CONNECTION_RESET в Chrome/Electron + +## Что проверено (инфраструктура) + +Cilium MTU: 1400 +Ingress (shturval-ingress-controller, nginx): + keep-alive: 75 + use-http2: false + proxy-body-size: 1024m + client-body-timeout: 60 + client-header-timeout: 30 +Ingress-поды: 2/2 Ready, 1/1 Running +Образ ingress: r.shturval.tech/ingress-nginx/controller:v1.12.6 + +Размещение подов сейчас: + Ingress: control-plane (172.16.0.73) + workers-v8zq4 (172.16.3.149) + Contractor: workers-6f74n (172.16.1.182) + Drhider: workers-6f74n (172.16.1.99) + +Кластер: 4 ноды (3 worker + 1 control-plane), Cilium с Geneve-энкапсуляцией, kube-vip. + +## Что проверено (код) + +- В JS добавлен warmup fetch('/health') при загрузке страницы +- Flask no_cache after_request (Cache-Control: no-cache) +- app.run(threaded=True) + +## Хронология + +- 13 июля: Helm ingress revision 7 — drhider работал +- 15 июля 02:00 UTC: Helm upgrade → revision 8 — сбросил ingress ConfigMap на дефолты + (keep-alive: 10, body-size: 8m, client-body-timeout: 10, client-header-timeout: 10) +- 15 июля ~08:00 UTC: патч ConfigMap обратно (keep-alive: 75, etc.) + kubectl rollout restart ingress +- После патча: curl работает, браузер — нет +- Helm values ИДЕНТИЧНЫ между revision 7 (рабочей) и 8 (сломанной): + ``` + controller: + hostPort.enabled: true + replicaCount: 2 + service.type: LoadBalancer + ``` + +## Что ещё + +- drhider проходил эту проблему 14 июля — есть документ PROBLEM-AND-SOLUTION.md + Фиксы оттуда ВСЕ применены: MTU 1400, keep-alive 75, use-http2 false, warmup, proxy-body-size 1024m +- Там же сказано: даже после всех фиксов "5× POST 63KB | 4× OK, 1× ABORTED" — 20% отказов + +## Вопрос + +1. Почему после Helm upgrade (revision 7→8) браузерные upload перестали работать, + если все значения ConfigMap восстановлены вручную до прежних? +2. Что ещё мог изменить Helm upgrade кроме ConfigMap? +3. Как добиться 100% надёжности первого upload из браузера? diff --git a/History/sonnet-question-upload-v2-2026-07-15.md b/History/sonnet-question-upload-v2-2026-07-15.md new file mode 100644 index 0000000..909c913 --- /dev/null +++ b/History/sonnet-question-upload-v2-2026-07-15.md @@ -0,0 +1,40 @@ +# Вопрос для Sonnet v2 — первый upload браузер vs curl + +## Ситуация + +Мигрировали сервис на Flask (managed Python, Штурвал). Всё работает кроме ОДНОГО: +**первый POST с файлом из браузера зависает на 100% и не завершается.** + +## Ключевые факты (проверено, не врать) + +1. **Curl работает, браузер — нет. С ОДНОЙ машины.** + - curl: 20/20, ~80ms каждый + - Браузер (Chrome/Electron): первый файл → XHR 100% → завис намертво + - Остальные файлы даже не начинают загружаться (первый блокирует очередь) + +2. **Браузерный запрос НЕ доходит до nginx.** + - `kubectl logs ingress` показывает ТОЛЬКО curl-запросы + - Браузерный XHR: прогресс 100% (данные ушли), но ответ не приходит + - onerror НЕ срабатывает (не RST, не таймаут — просто тишина) + - xhr.timeout = 180000 (3 минуты) + +3. **Инфраструктура проверена:** + - Cilium MTU: 1400 (underlay 1450, Geneve -50 = pod 1400) + - Ingress ConfigMap: keep-alive 75, client-body-timeout 60, client-header-timeout 30, proxy-body-size 1024m + - Ingress аннотации: proxy-body-size 1024m, proxy-connect-timeout 120, proxy-read-timeout 600, proxy-send-timeout 600 + - HTTP/2: выключен (use-http2 false) + - Cilium: 4/4 ноды reachable, tunnel-protocol geneve + - kube-vip: DaemonSet на всех 4 нодах, все Running + - Ingress поды: 2/2 Ready, образ v1.12.6 + - Helm upgrade 15 июля 02:00 UTC НЕ менял значения (revision 7 и 8 идентичны) + +4. **Код:** + - warmup `fetch('/health')` при загрузке страницы — есть + - Flask no_cache (Cache-Control: no-cache) — есть + - app.run(threaded=True) + +5. **Затрагивает ОБА сервиса:** и contractor, и drhider (который работал вчера) + +## Вопрос + +Почему curl (20/20) работает, а браузерный XHR (0/1) — нет, при том что ОБА с одной машины через один и тот же интернет-канал? diff --git a/contracts-flask b/contracts-flask index 9e22182..1bd62a5 160000 --- a/contracts-flask +++ b/contracts-flask @@ -1 +1 @@ -Subproject commit 9e22182f9aba482e21775db2e1e8c3d8636a22ae +Subproject commit 1bd62a51efd11b2aa5f0a4853453404d575ba488