3.5 KiB
Сессия 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 логотип | — |
Решённые проблемы
-
BYTEA Large Objects — PostgreSQL JDBC не передаёт сырые байты в BYTEA. Решение:
toBase64(fileBytes)→cf_sql_varchar. -
auto-commit mode — INSERT BYTEA требует транзакции. Решение:
<cftransaction>вокруг всех INSERT. -
cfhttp.statusCode — возвращает
"200 OK"вместо200. Решение:left(cfhttp.statusCode, 3) EQ "200". -
var scope —
varнельзя использовать вне функций в CFML. Решение:varтолько в<cffunction>, в MAIN безvar. -
var в индексах циклов —
index="var x"невалидно. Решение:varобъявлять до цикла, в индексе безvar. -
Таймаут LLM — 20с мало для cfhttp к api.aillm.ru. Решение:
requestTimeout=180. -
CORS — браузер блокировал fetch к upload.cfm. Решение:
Access-Control-Allow-Origin: *+ OPTIONS handler. -
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