XC_VM Система сборки (ОСНОВНАЯ против LB)¶
Как XC_VM создает два варианта сборки из одной кодовой базы: полноценный основной сервер и облегченный сервер балансировки нагрузки (LB).
Варианты сборки¶
XC_VM поддерживает две роли развертывания из одного дерева исходных текстов:
| Вариант | Архив | Цель |
|---|---|---|
| MAIN | xc_vm.tar.gz |
Полное приложение — админ-панель, потоковое вещание, все модули, задания cron |
| фунт (Балансировщик нагрузки) | loadbalancer.tar.gz |
Сервер только для потоковой передачи — нет панели администратора, нет управления пользователями |
главный - это основной сервер, который управляет всем: пользовательским интерфейсом администратора, записями в базу данных, управлением пользователями/устройствами, EPG обработкой, резервным копированием и т.д.
фунт - это облегченный потоковый узел, который получает потоки из MAIN (или других источников) и доставляет их клиентам. Он подключается к базе данных master в режиме только для чтения и не имеет панели администратора или возможностей управления.
Целевые объекты Makefile¶
| Цель | Выход | Описание |
|---|---|---|
make main |
dist/xc_vm.tar.gz |
Полная ОСНОВНАЯ сборка |
make lb |
dist/loadbalancer.tar.gz |
Сборка LB (подмножество только для потоковой передачи) |
make new |
(сбрасывает значение dist/) |
Удалите и воссоздайте пустой каталог вывода dist/ — запускается перед сборкой; само по себе ничего не создается |
make generate_deleted_files |
src/migrations/deleted_files.txt |
Список файлов, удаленных с момента последнего добавления тега (см. ниже) |
Обновления повторно используют весь архив. Нет отдельной цели для инкрементного обновления - одна и та же
xc_vm.tar.gz/loadbalancer.tar.gzиспользуется как для установки, так и для обновления; фильтрация происходит по сервер во время обновления (см. Механизм обновления). Чтобы удалить files that were removed between releases,make generate_deleted_files [LAST_TAG=vX.Y.Z]diffs git и записываетdeleted_files.txt, который применяется программой обновления.
Дополнительные выходы:
XC_VM.zip— установочный пакет (install/+xc_vm.tar.gz)hashes.md5— Контрольные суммы MD5 для проверки целостности
Composer Зависимости¶
src/vendor/ (автозагрузчик Composer PSR-4 плюс производственные зависимости) - это
привержен и поставляется как есть - путь развертывания не содержит Composer и никогда не выполняется
composer install. Он поддерживается только для производства через composer install --no-dev, так что
оба варианта сборки предназначены для бережливого производства без инструментов разработки.
src/composer.lockфиксируется таким образом, чтобыcomposer installможно было воспроизвести.- Инструменты разработки (PHPStan, phpcs) имеют значения
require-devи нет в зарегистрированный поставщик или архивы. Разработчики и CI добавляют их с помощьюmake dev-tools(composer install); шлюзcheck-vendor-prod-onlyзавершается сбоем, если пакет разработчика когда-либо совершенные подsrc/vendor/. - Нет шага поставщика во время сборки -
make main/make lbскопируйте зафиксированныйvendor/непосредственно в архив.
Что входит в Каждую Сборку¶
ОСНОВНАЯ сборка¶
ОСНОВНАЯ сборка содержит каталог весь src/.
Каталоги— включенные в сборку LB¶
Только эти каталоги копируются в архив LB:
bin/ Cli/ config/ content/ Core/
Domain/ Infrastructure/ Public/ resources/
signals/ Streaming/ tmp/ vendor/ www/
Плюс корневые файлы: bootstrap.php, console.php, service, update.
Содержимое— исключенное из сборки LB¶
После копирования содержимое, относящееся к администратору, становится удаленный из сборки LB:
Directories removed:
| Путь | Причина |
|---|---|
bin/install/ |
Установочные скрипты (в LB они не нужны) |
bin/redis/ |
Redis двоичный файл (LB не запускает свой собственный Redis) |
bin/nginx/conf/codes/ |
Страницы с кодами ошибок (пользовательский интерфейс администратора) |
Public/Controllers/Admin/ |
Контроллеры панели администратора |
Public/Controllers/Player/ |
Контроллеры панели проигрывателя |
Public/Controllers/Reseller/ |
Контроллеры панели реселлера |
Public/Views/ |
Шаблоны панелей |
Public/assets/ |
Панель статических активов |
Public/routes/ |
Карты маршрутов на панели |
Domain/User/ |
Управление пользователями |
Domain/Device/ |
Регистрация устройства |
Domain/Auth/ |
Управление авторизацией (panel auth) |
resources/langs/ |
Файлы языковых ресурсов |
resources/libs/ |
Администрирование библиотечных ресурсов |
Удаленные файлы (они отражают LB_FILES_TO_REMOVE в Makefile):
⚠️ В нескольких записях здесь используется устаревший префикс
www/…(например,www/stream/auth.php,www/xplugin.php).src/www/больше не существует — конечные точки потоковой передачи/API перемещены подsrc/Public/stream/иsrc/Public/…. Таким образом, этиwww/…записи об удалении равны никаких операций сегодня и заслуживают аудита в Makefile (файл, который должен быть удален из LB, на самом деле может все еще отправляется по своему путиPublic/).
| Файл | Причина |
|---|---|
Public/Controllers/Api/AdminApiController.php |
Полный admin API удален из LB |
Public/Controllers/Api/ResellerRestApiController.php |
API реселлера удален из LB |
www/xplugin.php, www/probe.php, www/playlist.php |
Конечные точки администрирования |
www/player_api.php, www/epg.php, www/enigma2.php |
Конечные точки клиентского API (обслуживаемые MAIN) |
www/stream/auth.php |
Конечная точка аутентификации (устаревший путь — см. примечание) |
www/admin/api.php, www/admin/proxy_api.php |
API администратора |
bin/maxmind/GeoLite2-City.mmdb |
GeoIP БД поставляется отдельно |
config/rclone.conf |
Конфигурация резервного копирования |
Domain/Epg/EPG.php |
EPG класс обработки |
bin/nginx/conf/gzip.conf |
Конфигурация Gzip (LB использует собственную) |
CLI commands removed:
| Файл | Причина |
|---|---|
Cli/Commands/MigrateCommand.php |
Миграция является ОСНОВНОЙ |
Cli/Commands/CacheHandlerCommand.php |
Обработчик кэша доступен только для MAIN |
Cli/Commands/ServerInstallCommand.php |
Установщик сервера (не требуется для самой LB) |
Cli/Commands/LbInstallFlow.php |
Помощник по установке LB (не требуется для самого LB) |
Cli/Commands/ProxyInstallFlow.php |
Помощник по установке прокси-сервера (не требуется для самой LB) |
Cron jobs removed:
| Файл | Причина |
|---|---|
Cli/CronJobs/RootMysqlCronJob.php |
Обслуживание базы данных (только для ОСНОВНОЙ системы) |
Cli/CronJobs/BackupsCronJob.php |
Резервные копии (только для ОСНОВНОЙ системы) |
Cli/CronJobs/CacheEngineCronJob.php |
Полная перестройка кэша (только для основного) |
Cli/CronJobs/EpgCronJob.php |
EPG обработка (только для ОСНОВНОЙ системы) |
Cli/CronJobs/UpdateCronJob.php |
Проверка обновлений (только для основной системы) |
Cli/CronJobs/ProvidersCronJob.php |
Синхронизация с поставщиком (только для ОСНОВНОГО) |
Cli/CronJobs/SeriesCronJob.php |
Метаданные серии (только для основной версии) |
Примечание: CRON, связанные с модулями (TMDB, Plex, Watch), находятся внутри
src/Modules/<name>/и автоматически исключаются из LB-сборок -Modules/отсутствует вLB_DIRS.Ministra (
src/Ministra/, портал Stalker — ~50 МБ ресурсов) также исключен из списка упущение: его нет в спискеLB_DIRS, поэтому он никогда не копировался в архив LB (там нет явное правило удаления для него — отсюда и проверка отсутствияministraв Проверке сборки ниже).
Конфигурации, замененные при сборке LB¶
Эти файлы из lb_configs/ заменять ОСНОВНЫХ версий:
| Источник | Цель | Цель |
|---|---|---|
lb_configs/nginx.conf |
bin/nginx/conf/nginx.conf |
Настроенная производительность nginx для потоковой передачи |
lb_configs/live.conf |
bin/nginx_rtmp/conf/live.conf |
RTMP перехватчики обратного вызова |
ОСНОВНЫЕ отличия от LB — Key Differences¶
| Аспект | главный | фунт |
|---|---|---|
| Панель администратора | ✅ Полный пользовательский интерфейс | ❌ Не входит в комплект поставки |
| Роль базы данных | Чтение + запись | Пользователь, доступный только для чтения |
| Управление пользователями/устройствами | ✅ | ❌ |
| EPG обработка | ✅ | ❌ |
| Резервные копии | ✅ | ❌ |
| Инструмент для миграции | ✅ | ❌ |
| Потоковая доставка | ✅ | ✅ |
| RTMP прием внутрь | ✅ | ✅ |
| Транскодирование (FFmpeg) | ✅ | ✅ |
| Команды CLI | 26 | ~15 (удалено только для администратора) |
| Задания Cron | 25 | ~16 (удалено только для администратора) |
| Модульная система | ✅ | ❌ |
Конфигурация LB Nginx¶
В сборке LB используется специализированная конфигурация nginx, оптимизированная для потоковой передачи с высокой пропускной способностью:
| Установка | Ценность | Цель |
|---|---|---|
| Рабочие процессы | auto |
Масштабирование до ядер центрального процессора |
| Рабочие связи | 16,000 | Высокая параллельность на одного работника |
| Максимальное количество файловых дескрипторов | 300,000 | Ограничение системных ресурсов |
| Пул потоков | pool_xc_vm (32 потока) |
Асинхронный ввод-вывод для потоковой передачи |
| Gzip-файл | прочь | Потоковые данные уже сжаты |
| Журналы доступа | прочь | Сократите накладные расходы на ввод-вывод |
| Ограничение скорости | 20 запросов в секунду на IP-адрес | Смягчение последствий DDoS-атак |
| Время ожидания отправки | 20 мин | Поддержка длительных потоков |
RTMP перехватывает (lb_configs/live.conf) аутентификацию маршрута с помощью локальных обратных вызовов HTTP вместо панели администратора:
on_play http://127.0.0.1:8080/stream/rtmp;
on_publish http://127.0.0.1:8080/stream/rtmp;
on_play_done http://127.0.0.1:8080/stream/rtmp;
Поведение во время выполнения на LB¶
Загрузка условной команды¶
console.php использует защиту file_exists() для команд, которые могут отсутствовать на серверах LB:
if (file_exists(__DIR__ . '/Cli/Commands/CacheHandlerCommand.php')) {
$rRegistry->register(new CacheHandlerCommand());
}
Это предотвращает сбои при попытке LB зарегистрировать команду, файл которой был удален во время сборки.
Цепочка потоковых зависимостей¶
Серверы LB сохраняют полный конвейер потоковой передачи:
www/stream/*.php
├── www/stream/init.php
├── vendor/autoload.php (Composer PSR-4 autoloader)
├── bootstrap.php (lightweight stream/bootstrap path)
├── Core/* (Config, Database, Cache, Auth, Http, Logging, Util)
├── Domain/Stream, Domain/Server, Domain/Vod, Domain/Bouquet
├── Streaming/* (Auth, Delivery, Codec, Protection)
├── Infrastructure/Redis, Infrastructure/Database
└── resources/data
Добавление нового кода в сборки¶
Новый каталог, относящийся к потоковой передаче, в разделе src/¶
Добавьте его в LB_DIRS в Makefile:
LB_DIRS := bin Cli config content Core Domain \
Infrastructure Public resources signals Streaming tmp vendor www your_dir
Новый каталог, доступный только для администратора¶
Добавьте его к LB_DIRS_TO_REMOVE:
Новый файл, доступный только для администратора¶
Добавьте его к LB_FILES_TO_REMOVE:
Новая команда CLI (только для администратора)¶
- Добавить
file_exists()защиту вconsole.php - Добавьте файл в
LB_FILES_TO_REMOVE
Проверка сборки¶
После изменения сборки проверьте оба варианта:
# Build both
make new
# Check LB contains streaming code
tar -tzf dist/loadbalancer.tar.gz | grep -cE "Core/|Domain/Stream|Streaming/"
# Expected: > 0
# Check LB does NOT contain admin code
tar -tzf dist/loadbalancer.tar.gz | grep -cE "admin/|player/|ministra|reseller"
# Expected: 0
# Compare sizes (LB should be significantly smaller)
ls -lh dist/xc_vm.tar.gz dist/loadbalancer.tar.gz