From eb48b0cae447a4e2e72f4b19e232cb69dd6fd1c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Thu, 23 Jul 2026 12:27:19 +0400 Subject: [PATCH] Architecture review: Sonnet answers + my concerns + 5 follow-up questions --- DOCS/architecture-review-sonnet.md | 69 ++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 DOCS/architecture-review-sonnet.md diff --git a/DOCS/architecture-review-sonnet.md b/DOCS/architecture-review-sonnet.md new file mode 100644 index 0000000..fe4adb5 --- /dev/null +++ b/DOCS/architecture-review-sonnet.md @@ -0,0 +1,69 @@ +# Архитектура app-autotest — ответы Sonnet + моё мнение + +## Sonnet предложил + +### Q1: Модель данных — SQLite, четыре таблицы, YAML-seed при старте +### Q2: Pipeline — последовательный в threading.Thread, поллинг 10s, таймаут 5мин +### Q3: UI — три вкладки (Тесты, Конфигурация, История) +### Q4: Архитектура — Flask + blueprints, sqlite3, без очередей/WS +### Q5: Multi-stand — отдельный деплой на стенд, env vars + +## Мои замечания + +### ⛔ 1. Factory pattern (`create_app()`) — НЕ СОВМЕСТИМ с pythonk8s + +Sonnet предлагает `app/` с фабрикой. ЭТО НЕ РАБОТАЕТ. + +Nubes pythonk8s запускает `python site/app.py`. Папка `site/` **не может быть пакетом** (конфликт с stdlib `site.py`). `__init__.py` в `site/` ломает импорты. + +Правильная структура для Nubes: +``` +site/ ← НЕ пакет, без __init__.py +├── app.py ← точка входа: app = Flask(__name__) +├── api/ +│ └── client.py ← from api.client import ... +├── db.py +├── runner.py +├── yaml_loader.py +├── routes/ +│ ├── config.py +│ └── history.py +├── static/ +└── templates/ +``` + +Все импорты — без префикса `site.`, например: `from api.client import HttpClient`. + +### ⚠️ 2. SQLite + Persistent Volume + +pythonk8s на Nubes — есть ли persistent volume? Если нет — данные теряются при редеплое. Варианты: +- `/tmp/` — теряется при рестарте пода +- Встроить SQLite внутрь? Но тогда это read-only FS +- Использовать env var для пути БД + +Нужно проверить: монтирует ли pythonk8s какие-то persistent тома. + +### ⚠️ 3. threading.Thread + Flask debug=True + +Сейчас `debug=True` (как в шаблоне). С reloader'ом (watchdog) треды могут дублироваться. В проде `debug=False`, но gunicorn workers тоже создают проблемы с тредами. Лучше: +- Отдельный процесс (`subprocess`) вместо треда +- Или `threading` только при `debug=False` + +### ⚠️ 4. YAML-файлы — где брать? + +YAML лежат в основном репо: `/home/naeel/nubes/autotest/STANDS/`, а не в app-autotest. Нужно: +- Либо скопировать в app-autotest +- Либо сделать git submodule +- Либо mount volume с конфигами + +## Вопросы к Sonnet + +1. **Persistent storage**: как хранить SQLite на pythonk8s? Есть ли volume mounts у этого типа сервиса? + +2. **YAML seeding**: если YAML не меняются (seed только при первом старте), может проще держать их прямо в репо app-autotest? Обновлять при изменениях в STANDS/? + +3. **Threading**: не лучше ли `subprocess.Popen` вместо `threading.Thread` для pipeline? gunicorn workers + debug reloader могут создать проблемы. + +4. **Параметры операций**: в YAML есть `dataDescriptor` (подполя map-fixed) и `valueList`. Как их показывать в UI? JSON textarea для каждого параметра или динамическая форма? + +5. **Приоритет реализации**: что первое — pipeline (запуск тестов) или конфигурация (UI настроек)? Без pipeline нечего тестировать, без конфигурации нечего запускать. Может MVP: ручной запуск + жёстко закодированный набор тестов?