mirror of
https://github.com/Vateron-Media/XC_VM.git
synced 2026-10-07 20:02:40 +02:00
291 lines
17 KiB
Markdown
291 lines
17 KiB
Markdown
# 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` используется как для установки, так и для обновления; фильтрация происходит по
|
|
> сервер во время обновления (см. [Механизм обновления](../administration/update-system.md)). Чтобы удалить
|
|
> 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:
|
|
|
|
```text
|
|
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)|
|
|
| `Core/Reference/` |Ссылка администратора-классы данных (только для ОСНОВНЫХ)|
|
|
| `Core/Localization/lang/` |Файлы языковых ресурсов (`.ini`)|
|
|
|
|
**Удаленные файлы** (они отражают `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 вместо панели администратора:
|
|
|
|
```nginx
|
|
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:
|
|
|
|
```php
|
|
if (file_exists(__DIR__ . '/Cli/Commands/CacheHandlerCommand.php')) {
|
|
$rRegistry->register(new CacheHandlerCommand());
|
|
}
|
|
```
|
|
|
|
Это предотвращает сбои при попытке LB зарегистрировать команду, файл которой был удален во время сборки.
|
|
|
|
### Цепочка потоковых зависимостей
|
|
|
|
Серверы LB сохраняют полный конвейер потоковой передачи:
|
|
|
|
```text
|
|
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:
|
|
|
|
```makefile
|
|
LB_DIRS := bin Cli config content Core Domain \
|
|
Infrastructure Public resources signals Streaming tmp vendor www your_dir
|
|
```
|
|
|
|
### Новый каталог, доступный только для администратора
|
|
|
|
Добавьте его к `LB_DIRS_TO_REMOVE`:
|
|
|
|
```makefile
|
|
LB_DIRS_TO_REMOVE = ... your_dir/admin_stuff
|
|
```
|
|
|
|
### Новый файл, доступный только для администратора
|
|
|
|
Добавьте его к `LB_FILES_TO_REMOVE`:
|
|
|
|
```makefile
|
|
LB_FILES_TO_REMOVE = ... your_dir/admin_file.php
|
|
```
|
|
|
|
### Новая команда CLI (только для администратора)
|
|
|
|
1. Добавить `file_exists()` защиту в `console.php`
|
|
2. Добавьте файл в `LB_FILES_TO_REMOVE`
|
|
|
|
---
|
|
|
|
## Проверка сборки
|
|
|
|
После изменения сборки проверьте оба варианта:
|
|
|
|
```bash
|
|
# 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
|
|
```
|