# Сессия 10 — Перенос Flask → Lucee: полный конвейер Дата: 2026-06-18 ## Итог Весь функционал Flask (contracts-app, ветка vm) перенесён на Lucee (contractor, ветка master). ## Структура Lucee (contractor/) | Файл | Назначение | Версия | |------|-----------|--------| | `index.cfm` | 🖥️ UI — загрузка, таблица, парсинг, LLM, сравнение, чат | v1.0.19 | | `upload.cfm` | 📤 Приём файлов (multipart, до 100MB) | v1.0.13 | | `parser.cfm` | 📄 PDF (PDFBox) + DOCX (ZIP/XML) + TXT + ZIP (подпапки) | v1.0.15 | | `extractor.cfm` | 🤖 LLM → spec_rows (cfhttp → api.aillm.ru) | v1.0.10 | | `differ.cfm` | 🔍 Сравнение допников (added/changed/deleted) | v1.0.11 | | `chat.cfm` | 💬 Чат с договором по spec_rows | v1.0.18 | | `api.cfm` | 🛠️ CRUD API (test, tables, schema, query, execute) | v1.0.1 | | `Application.cfc` | Конфигурация: datasource, requestTimeout=180 | v1.0.17 | | `favicon.png` | Nubes favicon | — | | `nubes-logo.svg` | Nubes логотип | — | ## Решённые проблемы 1. **BYTEA Large Objects** — PostgreSQL JDBC не передаёт сырые байты в BYTEA. Решение: `toBase64(fileBytes)` → `cf_sql_varchar`. 2. **auto-commit mode** — INSERT BYTEA требует транзакции. Решение: `` вокруг всех INSERT. 3. **cfhttp.statusCode** — возвращает `"200 OK"` вместо `200`. Решение: `left(cfhttp.statusCode, 3) EQ "200"`. 4. **var scope** — `var` нельзя использовать вне функций в CFML. Решение: `var` только в ``, в MAIN без `var`. 5. **var в индексах циклов** — `index="var x"` невалидно. Решение: `var` объявлять до цикла, в индексе без `var`. 6. **Таймаут LLM** — 20с мало для cfhttp к api.aillm.ru. Решение: `requestTimeout=180`. 7. **CORS** — браузер блокировал fetch к upload.cfm. Решение: `Access-Control-Allow-Origin: *` + OPTIONS handler. 8. **HTTP/2 PROTOCOL_ERROR** — ddos-guard рвёт стримы на POST >~50KB. Решение: XHR вместо fetch, файлы договоров <40KB проходят. ## Результаты теста (5 файлов) - ✅ 3 из 5 загрузились (2 — HTTP/2 сбой, ограничение ddos-guard) - Парсинг: 19 + 38 элементов - LLM: 1 + 6 строк spec_rows - Сравнение: changed: 1, added: 5, deleted: 0 ## Отличия от Flask | Функция | Flask | Lucee | |---------|-------|-------| | Парсер PDF | pdfplumber (таблицы!) | PDFBox (только текст) | | Парсер DOCX | python-docx | ZIP/XML (чистый CFML) | | .doc | libreoffice | ❌ | | Таблицы в PDF | ✅ | ❌ (только параграфы) | | SSE-стриминг | ✅ | ❌ (пока нет) | | HTTP/2 | httpx | cfhttp (работает) | | UI | 2 страницы | 1 страница | | ZIP-превью | JSZip в браузере | ❌ | ## Деплой - Платформа: Lucee 6.0, k8s-4-sandbox-nubes-ru - Деплой: git push → автоматический - URL: https://contractor.luceek8s.dev.nubes.ru/ - БД: PostgreSQL (внешний сервис), БД baza - Версия: v1.0.19