Система сборки 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, который применяется программой обновления. В архиве LBmigrations/deleted_files.txtтакже содержит список всех файлов, которые были удалены при сборке LB (см. LB Build — Удаленные файлы при обновлении).
Дополнительные выходы:
XC_VM.zip— установочный пакет (install/+xc_vm.tar.gz)hashes.md5— Контрольные суммы MD5 для проверки целостности
Зависимости композитора¶
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:
Плюс корневые файлы: 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/PlayerV2/ |
Контроллеры Web player v2 (область действия плеера, не маршрутизируемые на LB) |
Public/Controllers/Reseller/ |
Контроллеры панели реселлера |
Public/Views/ |
Шаблоны панелей |
Public/assets/ |
Панель статических активов |
Public/routes/ |
Карты маршрутов на панели |
Domain/User/ |
Управление пользователями |
Domain/Device/ |
Регистрация устройства |
Core/Reference/ |
Ссылка администратора-классы данных (только для ОСНОВНЫХ) |
Core/Localization/lang/ |
Файлы языковых ресурсов (.ini) |
Удаленные файлы (они отражают LB_FILES_TO_REMOVE в Makefile):
| Файл | Причина |
|---|---|
Public/admin/api.php, Public/admin/proxy_api.php |
API-интерфейсы администратора и прокси-сервера (только для MAIN; только маршруты LB nginx /admin/{live,timeshift,thumb,vod}) |
Public/stream/auth.php, Public/stream/probe.php |
Проверка подлинности в Viewer и stream probe (только для MAIN; для них требуется разделенный Domain/User, и LB nginx не маршрутизирует их) |
Public/Controllers/Api/AdminApiController.php, AdminAPIWrapper.php |
Полный admin API удален из LB |
Public/Controllers/Api/ResellerRestApiController.php, ResellerAPIWrapper.php |
API реселлера удален из LB |
Public/Controllers/Api/ActiveCodeApiController.php |
API кода активации (LB nginx никогда не маршрутизирует active_code) |
Infrastructure/ResellerApiDispatcher.php, ResellerTableRenderer.php |
Помощники на панели реселлеров |
config/rclone.conf |
Конфигурация резервного копирования |
Domain/Epg/EPG.php |
Класс обработки EPG |
Core/Enum/Theme.php, ResellerAction.php, ClientFilter.php |
Перечисления только для панели |
bin/nginx/conf/gzip.conf |
Конфигурация Gzip (LB использует собственную) |
Средство просмотра-контроллеры API (PlayerApiController, Enigma2ApiController, XPluginApiController,
EpgApiController, PlaylistApiController и их BaseApiController) все еще отправляются, потому что
lb_configs/nginx.conf по-прежнему направляет /api/player_api и другие конечные точки просмотра на
Public/index.php. Они будут удалены вместе с этими маршрутами на более позднем этапе.
CLI commands removed:
| Файл | Причина |
|---|---|
Cli/Commands/MigrateCommand.php, Cli/migration_logic.php |
Миграция является ОСНОВНОЙ |
Cli/Commands/DbMigrateCommand.php |
Применяет перенос схемы MAIN (только для MAIN) |
Cli/Commands/CacheHandlerCommand.php |
Обработчик кэша доступен только для MAIN |
Cli/Commands/ServerInstallCommand.php |
Установщик сервера (не требуется для самой LB) |
Cli/Commands/ServerSyncOpensslExtraCommand.php |
Отправляет значение MAIN OPENSSL_EXTRA в LBs (только для MAIN) |
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 |
Метаданные серии (только для основной версии) |
Примечание: Связанные с модулем crons (Plex, Watch) находятся внутри
src/Modules/<name>/и автоматически исключаются из LB-сборок -Modules/отсутствует вLB_DIRS. The TMDB crons are not module crons:Cli/CronJobs/TmdbCronJob.phpandCli/CronJobs/TmdbPopularCronJob.phpявляются основными заданиями и отправляются в архив LB.Министр (
src/Ministra/, портал Stalker — ~50 МБ ресурсов) также исключен из списка упущение: его нет в спискеLB_DIRS, поэтому он никогда не копировался в архив LB (там нет явное правило удаления для него — отсюда и проверка отсутствияministraв Build Verification ниже).
Конфигурации, замененные при сборке 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 Build — Удаленные файлы при обновлении¶
Обновление извлекает архив поверх установленного дерева, поэтому файл исчезает из установленного LB
только когда migrations/deleted_files.txt выводит его в списке (MigrationRunner::runFileCleanup() выполняется в
после обновления). make lb поэтому список LB-архива всегда записывается как объединение:
- записи в области LB из
src/migrations/deleted_files.txt(пути подLB_DIRS, удаленныеLB_RETIRED_DIRSдеревьяresources/иwww/, или записьLB_ROOT_FILES); - каждый файл, который удаляется при сборке LB: записи
LB_FILES_TO_REMOVEи отслеживаемые файлы в разделеLB_DIRS_TO_REMOVE, ограниченный кодовыми деревьями (Cli/,Core/,Domain/,Infrastructure/,Public/,Streaming/).bin/,config/иcontent/содержат файлы времени выполнения и для каждого сервера, а никогда не удаляются из списков разделов. Деревья вLB_KEEP_ON_UPDATEтакже не учитываются.
Таким образом, файл, недавно добавленный в список удаленных файлов, также удаляется из LBs, установленного в более старой версии.
LB_KEEP_ON_UPDATE содержит Domain/User. Свежий фунт никогда этого не получит, но Public/stream/rtmp.php (самый
RTMP on_play auth), и контроллеры viewer-API по-прежнему вызывают его на маршрутах, которые обслуживает LB nginx. Один
старые LB, которые все еще носят его с собой, сохраняют его до тех пор, пока эти маршруты не будут удалены.
Проверка сборки завершается неудачей, если в списке указан файл, который отправляется архивом LB (DELETES-SHIPPED).
ОСНОВНЫЕ отличия от LB — Key Differences¶
| Аспект | главный | фунт |
|---|---|---|
| Панель администратора | ✅ Полный пользовательский интерфейс | ❌ Не входит в комплект поставки |
| Роль базы данных | Чтение + запись | Пользователь, доступный только для чтения |
| Управление пользователями/устройствами | ✅ | ❌ |
| Обработка EPG | ✅ | ❌ |
| Резервные копии | ✅ | ❌ |
| Инструмент для миграции | ✅ | ❌ |
| Потоковая доставка | ✅ | ✅ |
| Прием внутрь РТМФ | ✅ | ✅ |
| Транскодирование (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 не содержит списка команд. В нем отображаются команды Cli/Commands/*.php и Cli/CronJobs/*.php и
регистрирует каждый конкретный класс, который реализует CommandInterface:
foreach (glob($rDir . '/*.php') as $rFile) {
$rClass = $rNamespace . basename($rFile, '.php');
if (!class_exists($rClass)) {
continue;
}
// ... register it if it is a concrete CommandInterface
}
Команда или cron-задание, которые используются при сборке LB, просто отсутствуют в LB, поэтому они никогда не регистрируются. Никакой охраны не требуется.
Цепочка потоковых зависимостей¶
Серверы LB сохраняют полный конвейер потоковой передачи:
Public/stream/index.php (stream gateway) → Public/stream/<handler>.php
├── vendor/autoload.php (Composer PSR-4 autoloader)
├── Infrastructure/Bootstrap/StreamingRequestBootstrap.php
├── 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
Добавление нового кода в сборки¶
Новый каталог, относящийся к потоковой передаче, в разделе src/¶
Добавьте его в LB_DIRS в Makefile:
LB_DIRS := bin Cli config content Core Domain \
Infrastructure Public signals Streaming tmp vendor your_dir
Новый каталог, доступный только для администратора¶
Добавьте его к LB_DIRS_TO_REMOVE:
Новый файл, доступный только для администратора¶
Добавьте его к LB_FILES_TO_REMOVE:
Новая команда CLI (только для администратора)¶
Добавьте файл в LB_FILES_TO_REMOVE. Если у него есть привилегии, также добавьте его в SENSITIVE в
tools/ci/verify-lb-archive.sh. console.php определяет команды с помощью glob, поэтому не требует изменений.
Проверка сборки¶
make gates запускает tools/ci/verify-lb-archive.sh, который перестраивает список файлов LB из
Переменные Makefile (архиватор не требуется) и завершается ошибкой при:
| Обнаружение | Значение |
|---|---|
STALE |
Запись LB_DIRS / LB_ROOT_FILES / LB_DIRS_TO_REMOVE / LB_FILES_TO_REMOVE / LB_KEEP_ON_UPDATE не соответствует ни одному отслеживаемому пути в разделе src/. В противном случае переименованный или удаленный путь превратил бы это правило в недействительное. |
WRONG-LIST |
Тип записи не соответствует ее списку: файл находится в LB_DIRS, LB_DIRS_TO_REMOVE или LB_KEEP_ON_UPDATE, или каталог находится в LB_ROOT_FILES или LB_FILES_TO_REMOVE. При сборке путь LB_DIRS_TO_REMOVE заменяется на путь rm -rf, поэтому файл в нем удаляется. rm -f и cp пропускают каталог, поэтому каталог в списке файлов ничего не делает. |
LEAK |
В LB будет отправлен привилегированный путь из списка SENSITIVE скрипта. |
MISSING |
Файл, к которому маршрутизируется LB nginx, удаляется. Скрипт проверяет все значения SCRIPT_FILENAME и Public/<scope>/<handler>.php для каждого обработчика, который принимают местоположения шлюза /stream/ и /admin/. Он также проверяет контроллер, который отправляет Public/index.php для каждого значения XC_API (например, internal для /api), а также BaseApiController, StreamingRequestBootstrap и WebApiBootstrap. Значение XC_API, которое не соответствует Public/index.php, также не отображается. |
DELETES-SHIPPED |
LB migrations/deleted_files.txt, созданный с помощью make lb_delete_files_list, присваивает имя файлу, который отправляется в архив LB, поэтому обновление удалит его из каждого LB. |
Когда вы удаляете новый файл, добавьте его в LB_FILES_TO_REMOVE (это должен быть отслеживаемый файл) и, если он
привилегированный, до SENSITIVE в tools/ci/verify-lb-archive.sh. Когда вы удаляете маршрутизируемый обработчик, также
удалите его маршрут из lb_configs/nginx.conf.
После изменения сборки проверьте оба варианта:
# 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
Ночные сборки (канал разработчиков)¶
.github/workflows/build-dev.yml публикует ежевечерние обновления main для панелей на канале обновления Dev. Он запускается в 02:00 UTC и отправляется вручную (force перестраивает неизмененный main). Он пропускает сборку, если значение main не изменилось с предыдущей ночи или не имеет коммитов с момента последнего выпуска.
Ночные сборки отправляются в репозиторий только для релизов Vateron-Media/XC_VM_Dev, а не в XC_VM по трем причинам:
- Панель отображает на одной странице до 100 выпусков. Ежедневные выпуски в
XC_VMбудут вытеснять стабильные версии с этой страницы. - Рабочие процессы выпуска принимают самый новый тег как
LAST_TAG, а ночные теги заменяют его. - Каждый выпуск в
XC_VMуведомляет наблюдателей репозитория иrelease-notifier.yml.
Версия. Каждая сборка помечена тегом <base>-dev.<run number>. <base> - это XC_VM_VERSION из исходного кода, если он уже прошел мимо последнего тега X.Y.Z, в противном случае - следующий патч после этого тега. Рабочий процесс сначала запускает модульные тесты, затем присваивает версии значение ConstantsInitializer.php и запускает make lb и make main, установив для LAST_TAG значение последней версии. deleted_files.txt Таким образом, учитываются все удаления, начиная с этой версии, поэтому панель, которая пропускает nightlies, по-прежнему корректно очищается.
Активы. Nightly содержит те же ресурсы, что и release (xc_vm.tar.gz, loadbalancer.tar.gz, XC_VM.zip, hashes.md5) плюс changelog.json, который создается на основе объектов фиксации, выполненных за предыдущую ночь. У XC_VM_Dev нет дерева исходных текстов, поэтому GitHubReleases::getChangelog() считывает ночные журналы изменений из этого ресурса, а не из помеченного changelog.json. В первой строке примечаний к выпуску (Source: …/commit/<sha>) записывается исходный коммит, и при следующем запуске выполняется сравнение с ним. Сохраняются только 20 самых новых ночных рубашек.
Боковая панель. UpdateChannels::mainReleases() предоставляет ОСНОВНОЙ клиентский релиз GIT_REPO_DEV. На канале dev GitHubReleases объединяет релизы обоих репозиториев, упорядочивает их с помощью version_compare() и извлекает каждый ресурс из репозитория, опубликовавшего его тег (GitHubReleases::isDevVersion()). Если XC_VM_Dev недоступен, канал разработчиков по-прежнему получает регулярные обновления.
Установка. Рабочий процесс публикуется с использованием детализированного персонального токена доступа, хранящегося в секрете репозитория DEV_RELEASE_TOKEN. Установите для токена значение только XC_VM_Dev с помощью Содержание: чтение и запись. Когда срок действия токена истекает, программа nightly завершает работу с ошибкой при первом вызове gh; выдайте новый токен и обновите секрет. XC_VM_Dev она должна быть общедоступной, поскольку панели загружаются с нее без токена, и для того, чтобы теги выпуска указывали на нее, требуется по крайней мере одна фиксация.