Files
XC_VM/docs/ru/development/architecture.md
T
Divarion-D 76844fef11 docs: restructure, fix PSR-4 drift, and unify en/ru
Overhaul the Docsify documentation (English + Russian) so it matches the current
codebase and follows one consistent pattern.

Content accuracy (post-migration):
- Rewrite development/autoloader.md to PSR-4 / Composer (the old XC_Autoloader
  scanner, igbinary tmp/cache/autoload_map and registerDirectories are gone).
- PascalCase every source path (src/core -> src/Core, domain/Stream, cli/Commands,
  public/Controllers, Infrastructure/Redis, ...) across all docs.
- Replace the removed autoload.php references with vendor/autoload.php
  (build_system, bootstrap-contexts, error-handling, modules).
- ssl-generation: note that the installer now auto-generates a unique self-signed
  certificate before Nginx starts.

Common pattern (Clean & uniform):
- Strip emoji from headings; remove the in-page Navigation blocks (the Docsify
  sidebar already provides navigation).
- One H1 + intro per doc; uniform "Related files" / "Связанные файлы" section,
  added to the code-centric docs that lacked it.

Structure:
- Remove the empty stray docs/api/; move updates_checklist.md into builds/;
  link the previously-orphaned ucs-integration.md.
- Regroup the sidebars (split the oversized guides group into Developer Guides /
  Security & Access / Integrations; fold builds into Build & Release).

Augment:
- dev-workflow: Local Setup (make dev-tools) + Quality Checks (phpstan, cs, gates).
- build_system: Composer Dependencies section (committed prod-only vendor,
  committed lock, dev tools via composer install, no build-time vendor step).

en/ru parity:
- Apply the same structure, fixes and pattern to docs/ru/ (translated), including
  a new Russian ucs-integration.md. The en and ru file sets are now identical.
2026-06-26 15:56:15 +03:00

5.2 KiB
Raw Blame History

Обзор архитектуры

Тип проекта

Структурированный PHP-монолит с модульным слоем расширений.

  • Без DDD, Hexagonal или Clean Architecture — намеренное решение.
  • Разделение по контекстам с минимумом абстракций: Controller → Service → Repository.
  • Два артефакта сборки из одной кодовой базы: MAIN (полная панель) и LB (load balancer).

Структура src

Путь Роль
src/Core/ Инфраструктурные примитивы: DI-контейнер, события, HTTP, конфиг, auth, логирование
src/Domain/ Бизнес-контексты: Stream, VOD, Line, User, Server, Security и др.
src/Modules/ Опциональный слой расширений — загружается ModuleLoader
src/Public/ Front controller, router, controllers, views, assets
src/Cli/ Консольные команды и точки входа для cron
src/ministra/ Stalker Portal — изолированная подсистема (BoundaryInterface)

Модель рантайма

Зависимости направлены внутрь — модули могут использовать core и domain, но не наоборот.

Public/index.php
    └── XC_Bootstrap::boot(BootContext::ADMIN)
            └── ServiceContainer (DI)
                    ├── EventDispatcher (PSR-14)
                    ├── ModuleLoader → loadAll() → bootAll()
                    └── Router → dispatch()

Domain-классы получают базу данных через инъекцию setDb() (вызывается из bootstrap.php::wireDomainDatabase()). global $db в web-пути запроса отсутствует.


Система модулей

Модули — изолированные директории в src/Modules/ с манифестом module.json и классом, расширяющим BaseModule. Полный справочник: Система модулей.

src/Modules/my-module/
├── module.json           # метаданные
├── MyModuleModule.php    # extends BaseModule, namespace XcVm\Module\MyModule
└── ...

Контексты Bootstrap

Четыре контекста определяют набор инициализируемых подсистем. Подробнее: Контексты Bootstrap.

Контекст Применение
BootContext::MINIMAL Скрипты, которым нужны только пути/конфиг
BootContext::CLI Cron-задачи и CLI-команды
BootContext::STREAM Стриминговые эндпоинты
BootContext::ADMIN Панель администратора / реселлера

Варианты сборки (MAIN vs LB)

MAIN LB
Панель администратора ✅ ❌
Стриминг ✅ ✅
Система модулей ✅ подмножество

Управляется enum ServerEnvironment и полем environment в module.json (main / lb / any).


Ключевые точки расширения

Механизм Как использовать
PSR-14 события EventDispatcher::listen() или атрибут #[ListensTo]
Декорирование сервисов $container->decorate('id', callable, priority)
Stream middleware Реализовать StreamMiddlewareProviderInterface
Cron-записи Переопределить getCronEntries() в классе модуля
DB-миграции Реализовать MigratableInterface::getMigrations()

Правила для контрибьюторов

  1. Модули не должны изменять файлы ядра.
  2. Запрещены eval, monkey patching и подмена файлов во время выполнения.
  3. Любой модуль можно отключить через config/modules.php без изменений ядра.
  4. Защищённые сервисы (db, settings, config, auth) нельзя декорировать.
  5. EN и RU документация обновляются в одном коммите.

Связанные файлы

Файл Роль
src/Core/ Примитивы фреймворка (DI, события, HTTP, конфиг, auth, логирование)
src/Domain/ Бизнес-контексты (Stream, VOD, Line, User, Server, Security)
src/Infrastructure/ Внешние адаптеры (DatabaseFactory, CacheReader, Redis)
src/Streaming/ Стриминг-подсистема
src/Modules/ Опциональные модули (загружаются ModuleLoader)
src/Public/ Front controller, контроллеры, view
src/Cli/ Консольные команды и cron-задачи