Skip to content

Фаза 4: Разборка orchestrator.py — модульный startup и shutdown #494

@ShaerWare

Description

@ShaerWare

Parent

Часть плана модульной декомпозиции: #489

Цель

Разобрать orchestrator.py (4170 строк) до ~100-200 строк. Вынести legacy endpoints, модулизировать startup/shutdown, перевести background tasks на TaskRegistry.

Sub-issues

Граф зависимостей

#545 (аудит)
  ├──→ #546 (StreamingTTSManager)
  │       └──→ #550 (admin endpoints) ──┐
  ├──→ #547 (widget endpoints) ─────────┤
  ├──→ #548 (/v1/* + core) ────────────┤
  ├──→ #549 (finetune) ────────────────┤
  └──→ #551 (background tasks) ────────┤
                                        │
                                        └──→ #552 (startup + shutdown)
                                                └──→ #553 (документация)

#545 блокирует все extraction-задачи. Батчи #546#551 независимы друг от друга (кроме #550#546). #552 ждёт завершения всех extraction + tasks. #553 — после финальной сборки.

Подробности подэтапов

4a. Вынести legacy endpoints (~2600 строк)

Разбито на 5 sub-issues (#546#550):

  • StreamingTTSManager (~224 строк) → modules/speech/streaming.py
  • Widget public endpoints (~516 строк) → modules/channels/widget/router_public.py
  • /v1/* + core endpoints (~511 строк) → modules/compat/router.py
  • Admin finetune (~377 строк) → modules/llm/router_finetune.py + modules/speech/router_finetune.py
  • Admin LLM/voice/monitoring/models/auth (~1400 строк) → domain routers

4b+4d+4e. Модульный startup + shutdown + deployment modes (#552)

Заменить 394-строчный startup_event() на per-module init(). Graceful shutdown: tasks → bots → bridge → DB. Deployment modes через загрузку/не-загрузку модулей.

4c. Background tasks → TaskRegistry (#551)

6 задач из asyncio.create_task()TaskRegistry.register():

Задача Интервал Домен
_cleanup_expired_sessions() 1 час core
_periodic_vacuum() 7 дней core
_periodic_kanban_sync() 15 мин kanban
_periodic_woocommerce_sync() ежедневно 23:00 UTC ecommerce
_build_wiki_embeddings() one-shot knowledge
_load_collection_indexes() one-shot knowledge

Целевой orchestrator.py

~100-200 строк:

  • Создание FastAPI app
  • Middleware (CORS, rate limiter, security headers)
  • Загрузка модулей по deployment mode
  • Startup/shutdown lifecycle
  • Точка входа uvicorn

Критерии готовности

  • orchestrator.py ≤ 200 строк
  • Все legacy /v1/* endpoints вынесены в отдельный роутер
  • Startup модульный — каждый модуль инициализируется через свой init()
  • Background tasks управляются через TaskRegistry
  • Graceful shutdown останавливает задачи → ботов → bridge → DB
  • Deployment modes реализованы через загрузку/не-загрузку модулей
  • Health check показывает только загруженные модули
  • Все endpoints работают
  • Боты стартуют корректно
  • CI зелёный

Риск: высокий

Это самая сложная фаза. Затрагивает точку входа приложения, инициализацию всех сервисов и lifecycle. Каждый подэтап — отдельный PR с тщательным тестированием.

Зависимости

  • Фазы 0-3 ✅ (все модули на месте)

Оценка: XL (9 sub-issues, 9 PR)

Metadata

Metadata

Assignees

No one assigned

    Labels

    P1High priorityphase:5-techdebtPhase 5: Technical DebtrefactoringArchitectural refactoring

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions