2026-04-17 19:56:58 +03:00
# 🛠 CLI-инструменты и миграции БД
2026-03-15 00:02:19 +03:00
2026-04-17 19:56:58 +03:00
Справочник по командной строке XC_VM, системным утилитам и системе миграций базы данных. Покрывает повседневные операции, экстренный доступ и создание новых миграций БД.
2026-03-15 00:02:19 +03:00
---
## 📚 Навигация
2026-04-17 19:56:58 +03:00
- [🖥 Точка входа консоли ](#точка-входа-консоли )
- [📋 Полный реестр команд ](#полный-реестр-команд )
- [🆕 Регистрация новой команды ](#регистрация-новой-команды )
- [🔧 Команда tools ](#команда-tools )
- [🗃 Миграции базы данных ](#миграции-базы-данных )
- [📝 Создание новой миграции ](#создание-новой-миграции )
- [⚙️ Типичные CLI-операции ](#типичные-cli-операции )
2026-03-15 00:02:19 +03:00
---
2026-04-17 19:56:58 +03:00
## Точка входа консоли
2026-03-15 00:02:19 +03:00
Все CLI-команды выполняются через `console.php` :
```bash
2026-04-07 20:49:44 +03:00
/home/xc_vm/console.php <command> [ args...]
2026-03-15 00:02:19 +03:00
```
Консоль поддерживает три типа команд:
| Тип | Кол-во | Описание |
2026-04-17 19:56:58 +03:00
| --- | --- | --- |
2026-03-15 00:02:19 +03:00
| **Commands** | 26 | Разовые операции (update, status, tools и др.) |
| **CronJobs** | 25 | Запланированные задачи (автозапуск через crontab) |
| **Daemons** | 8 | Фоновые процессы-демоны (Commands, использующие `DaemonTrait` ) |
> **Примечание:** Демоны — это обычные Commands с трейтом `DaemonTrait`. Отдельной директории `Daemons/` нет.
Для просмотра всех доступных команд:
```bash
2026-04-07 20:49:44 +03:00
/home/xc_vm/console.php list
2026-03-15 00:02:19 +03:00
```
---
2026-04-17 19:56:58 +03:00
## Полный реестр команд
2026-03-15 00:02:19 +03:00
### Утилитарные команды
| Команда | Класс | Описание | Пользователь |
2026-04-17 19:56:58 +03:00
| --- | --- | --- | --- |
2026-03-15 00:02:19 +03:00
| `status` | `StatusCommand` | Статус системы, миграции БД, проверка конфигурации | root |
| `update` | `UpdateCommand` | Обновление системы (update / post-update) | xc_vm |
| `service` | `ServiceCommand` | Управление сервисом XC_VM: start, stop, restart, reload | root |
2026-04-17 19:56:58 +03:00
| `tools` | `ToolsCommand` | Утилиты обслуживания (см. раздел "Команда tools") | root/xc_vm |
2026-03-15 00:02:19 +03:00
| `certbot` | `CertbotCommand` | Генерация SSL-сертификата через certbot | root |
| `binaries` | `BinariesCommand` | Обновление бинарников и GeoLite из GitHub | xc_vm |
| `startup` | `StartupCommand` | Инициализация системы: daemons.sh, crontab, кеш | root |
| `monitor` | `MonitorCommand` | Мониторинг стрима по ID (запуск/перезапуск/отслеживание) | xc_vm |
| `thumbnail` | `ThumbnailCommand` | Генерация превью-кадров для стрима | xc_vm |
| `plex_item` | `PlexItemCommand` | Обработка элемента Plex (фильм/сериал) | xc_vm |
| `watch_item` | `WatchItemCommand` | Обработка элемента Watch (поиск/обновление TMDB) | xc_vm |
| `migrate` | `MigrateCommand` | Миграция данных из БД `xc_vm_migrate` | xc_vm |
| `balancer` | `BalancerCommand` | Установка/настройка балансировщика по SSH | root |
> Опциональные команды (условная регистрация через `file_exists()`): `cache_handler`, `balancer`, `migrate`.
### Команды-демоны (фоновые процессы)
Эти команды используют `DaemonTrait` и работают непрерывно через `while(true)` :
| Команда | Класс | Описание |
2026-04-17 19:56:58 +03:00
| --- | --- | --- |
2026-03-15 00:02:19 +03:00
| `signals` | `SignalsCommand` | Обработка kill/cache сигналов из БД и Redis |
| `watchdog` | `WatchdogCommand` | Мониторинг системы: CPU, соединения, обновление серверов |
| `queue` | `QueueCommand` | Обработка фоновых задач из очереди |
| `scanner` | `ScannerCommand` | Сканирование новых стримов/устройств |
| `cache_handler` | `CacheHandlerCommand` | Операции с кешем (опционально) |
### Команды обработки стримов
| Команда | Класс | Описание |
2026-04-17 19:56:58 +03:00
| --- | --- | --- |
2026-03-15 00:02:19 +03:00
| `proxy` | `ProxyCommand` | Проксирование MPEG-TS потоков через сокеты |
| `archive` | `ArchiveCommand` | TV-архив — запись стрима в сегменты |
| `created` | `CreatedCommand` | Created Channel — компоновка канала из источников |
| `delay` | `DelayCommand` | Задержка воспроизведения HLS-стрима |
| `loopback` | `LoopbackCommand` | Приём MPEG-TS с другого сервера |
| `llod` | `LlodCommand` | Low-Latency On-Demand обработчик стримов |
| `record` | `RecordCommand` | Запись стрима в MP4 |
| `ondemand` | `OndemandCommand` | Завершение стримов без активных зрителей |
### Крон-задачи (25 шт.)
Имена всех крон-задач имеют префикс `cron:` . Они используют `CronTrait` и вызываются системным crontab.
| Команда | Класс | Описание |
2026-04-17 19:56:58 +03:00
| --- | --- | --- |
2026-03-15 00:02:19 +03:00
| `cron:activity` | `ActivityCronJob` | Импорт логов активности пользователей в БД |
| `cron:backups` | `BackupsCronJob` | Управление бэкапами (опционально) |
| `cron:cache` | `CacheCronJob` | Управление кешем |
| `cron:cache_engine` | `CacheEngineCronJob` | Генерация кеша для линий, стримов, сериалов, групп (опционально) |
| `cron:certbot` | `CertbotCronJob` | Продление SSL-сертификата |
| `cron:cleanup` | `CleanupCronJob` | Очистка временных файлов и логов |
| `cron:epg` | `EpgCronJob` | Загрузка и обработка EPG (опционально) |
| `cron:errors` | `ErrorsCronJob` | Обработка логов ошибок |
| `cron:lines_logs` | `LinesLogsCronJob` | Импорт логов клиентских запросов в БД |
| `cron:plex` | `PlexCronJob` | Обработка обновлений Plex |
| `cron:providers` | `ProvidersCronJob` | Обновление провайдеров (опционально) |
| `cron:root_mysql` | `RootMysqlCronJob` | Обслуживание БД (root, опционально) |
| `cron:root_signals` | `RootSignalsCronJob` | Обработка сигналов, iptables, nginx, управление сервисом (root) |
| `cron:series` | `SeriesCronJob` | Обновление данных сериалов (опционально) |
| `cron:servers` | `ServersCronJob` | Мониторинг сервера, запуск демонов, обновление статистики |
| `cron:stats` | `StatsCronJob` | Подсчёт и сохранение статистики |
| `cron:streams` | `StreamsCronJob` | Проверка и обновление статуса стримов |
| `cron:streams_logs` | `StreamsLogsCronJob` | Импорт логов стримов |
| `cron:tmdb` | `TmdbCronJob` | Получение метаданных TMDB (опционально) |
| `cron:tmdb_popular` | `TmdbPopularCronJob` | Получение популярного контента TMDB (опционально) |
| `cron:tmp` | `TmpCronJob` | Очистка временных файлов |
| `cron:update` | `UpdateCronJob` | Проверка и применение обновлений (опционально) |
| `cron:users` | `UsersCronJob` | Управление пользовательскими соединениями, синхронизация Redis |
| `cron:vod` | `VodCronJob` | Обработка VOD-контента |
| `cron:watch` | `WatchCronJob` | Обработка обновлений Watch-библиотеки |
> Опциональные крон-задачи (условная регистрация): `cron:backups`, `cron:cache_engine`, `cron:epg`, `cron:providers`, `cron:root_mysql`, `cron:series`, `cron:tmdb`, `cron:tmdb_popular`, `cron:update`.
---
2026-04-17 19:56:58 +03:00
## Регистрация новой команды
2026-03-15 00:02:19 +03:00
Все CLI-команды реализуют `CommandInterface` и явно регистрируются в `console.php` .
### CommandInterface
```php
interface CommandInterface {
public function getName () : string ; // Уникальное имя команды (используется в CLI)
public function getDescription () : string ; // Однострочное описание (показывается в `list`)
public function execute ( array $rArgs ) : int ; // Точка входа, возвращает код выхода
}
```
### Шаг 1. Создайте класс
Создайте файл в `src/cli/Commands/` (или `src/cli/CronJobs/` для крон-задач):
```php
<? php
class MyNewCommand implements CommandInterface {
public function getName () : string {
return 'my_command' ;
}
public function getDescription () : string {
return 'Краткое описание команды' ;
}
public function execute ( array $rArgs ) : int {
// Ваша логика
echo "Done. \n " ;
return 0 ; // 0 = успех, 1 = ошибка
}
}
```
Для **команд-демонов** используйте также `DaemonTrait` :
```php
class MyDaemonCommand implements CommandInterface {
use DaemonTrait ;
// ...
}
```
Для **крон-задач** используйте `CronTrait` :
```php
class MyCronJob implements CommandInterface {
use CronTrait ;
public function getName () : string {
return 'cron:my_job' ; // Имена кронов имеют префикс cron:
}
// ...
}
```
### Шаг 2. Зарегистрируйте в console.php
Добавьте в `console.php` :
```php
// Всегда загружается
$rRegistry -> register ( new MyNewCommand ());
// Или условно (для опциональных функций)
if ( file_exists ( CLI_PATH . 'Commands/MyNewCommand.php' )) {
$rRegistry -> register ( new MyNewCommand ());
}
```
### Шаг 3. Добавьте в Makefile (если исключается из LB)
Если команда НЕ должна входить в сборку Load Balancer, добавьте её путь в `LB_FILES_TO_REMOVE` в `Makefile` .
### Шаг 4. Тестирование
```bash
# Проверьте, что команда отображается в списке
2026-04-07 20:49:44 +03:00
/home/xc_vm/console.php list
2026-03-15 00:02:19 +03:00
# Запустите
2026-04-07 20:49:44 +03:00
/home/xc_vm/console.php my_command
2026-03-15 00:02:19 +03:00
```
---
2026-04-17 19:56:58 +03:00
## Команда tools
2026-03-15 00:02:19 +03:00
Команда `tools` предоставляет утилиты для обслуживания системы.
```bash
console.php tools <subcommand>
```
### Подкоманды (запуск от `root`)
| Подкоманда | Описание |
2026-04-17 19:56:58 +03:00
| --- | --- |
2026-03-15 00:02:19 +03:00
| `rescue` | Создать временный код доступа для экстренного входа в панель. Выводит URL. **Удалите код после использования!** |
| `access` | Перегенерировать все конфигурации кодов доступа nginx и перезагрузить nginx. Выводит URL всех кодов админ-панели. |
| `ports` | Перегенерировать конфигурации портов nginx (HTTP, HTTPS, RTMP) из базы данных и перезагрузить nginx. |
| `migration` | Очистить базу миграций (`xc_vm_migrate` ) и опционально восстановить `.sql` -бэкап. |
| `user` | Создать rescue-администратора со случайными учётными данными. Выводит логин и пароль. **Удалите пользователя после использования!** |
| `mysql` | Переавторизовать привилегии MySQL для всех серверов балансировки нагрузки. |
| `database` | Восстановить чистую БД XC_VM из `database.sql` . **Удаляет ВСЕ данные!** Требует флаг `--confirm` . |
| `flush` | Сбросить все заблокированные IP — очищает правила iptables, удаляет файлы блокировок и очищает таблицу `blocked_ips` . |
### Подкоманды (запуск от `xc_vm`)
| Подкоманда | Описание |
2026-04-17 19:56:58 +03:00
| --- | --- |
2026-03-15 00:02:19 +03:00
| `images` | Скачать недостающие изображения стримов/фильмов/сериалов с TMDB. Сканирует БД и загружает отсутствующие файлы. |
| `duplicates` | Найти и удалить дубликаты VOD-стримов. Группирует по одинаковому источнику, оставляет первый, удаляет остальные. **Деструктивная операция!** |
| `bouquets` | Очистить устаревшие ссылки в букетах. Удаляет ID, которых больше нет в базе данных. |
### Примеры
```bash
# Экстренный доступ к панели (root)
2026-04-07 20:49:44 +03:00
sudo /home/xc_vm/console.php tools rescue
2026-03-15 00:02:19 +03:00
# Перегенерация кодов доступа (root) — требуется после изменения шаблона nginx
2026-04-07 20:49:44 +03:00
sudo /home/xc_vm/console.php tools access
2026-03-15 00:02:19 +03:00
# Перегенерация конфигурации портов (root)
2026-04-07 20:49:44 +03:00
sudo /home/xc_vm/console.php tools ports
2026-03-15 00:02:19 +03:00
# Очистить базу миграций (root)
2026-04-07 20:49:44 +03:00
sudo /home/xc_vm/console.php tools migration
2026-03-15 00:02:19 +03:00
# Очистить базу миграций и восстановить бэкап (root)
2026-04-07 20:49:44 +03:00
sudo /home/xc_vm/console.php tools migration /path/to/backup.sql
2026-03-15 00:02:19 +03:00
# Создать rescue-администратора (root)
2026-04-07 20:49:44 +03:00
sudo /home/xc_vm/console.php tools user
2026-03-15 00:02:19 +03:00
# Переавторизовать MySQL на всех серверах (root)
2026-04-07 20:49:44 +03:00
sudo /home/xc_vm/console.php tools mysql
2026-03-15 00:02:19 +03:00
# Восстановить чистую базу данных (root) — ДЕСТРУКТИВНАЯ ОПЕРАЦИЯ!
2026-04-07 20:49:44 +03:00
sudo /home/xc_vm/console.php tools database --confirm
2026-03-15 00:02:19 +03:00
# Сбросить все заблокированные IP (root)
2026-04-07 20:49:44 +03:00
sudo /home/xc_vm/console.php tools flush
2026-03-15 00:02:19 +03:00
# Скачать недостающие изображения (xc_vm)
2026-04-07 20:49:44 +03:00
su - xc_vm -c '/home/xc_vm/console.php tools images'
2026-03-15 00:02:19 +03:00
# Удалить дубликаты VOD (xc_vm)
2026-04-07 20:49:44 +03:00
su - xc_vm -c '/home/xc_vm/console.php tools duplicates'
2026-03-15 00:02:19 +03:00
# Очистить ссылки в букетах (xc_vm)
2026-04-07 20:49:44 +03:00
su - xc_vm -c '/home/xc_vm/console.php tools bouquets'
2026-03-15 00:02:19 +03:00
```
2026-04-17 19:56:58 +03:00
- ⚠️ **Внимание:** `duplicates` безвозвратно удаляет стримы и все связанные данные (логи, статистика, эпизоды, записи). Всегда делайте бэкап перед запуском.
- ⚠️ **Внимание:** `database --confirm` стирает всю базу данных и заменяет её чистой схемой. Это необратимая операция.
- 💡 **Совет:** После использования `rescue` всегда удаляйте код через админ-панель или запустив `tools access` после восстановления доступа.
- 💡 **Совет:** После использования `user` немедленно смените пароль и удалите rescue-пользователя по завершении работы.
2026-03-15 00:02:19 +03:00
---
2026-04-17 19:56:58 +03:00
## Миграции базы данных
2026-03-15 00:02:19 +03:00
XC_VM использует файловую систему миграций для управления изменениями схемы БД между версиями. Миграции выполняются автоматически при обновлениях и проверке статуса системы.
### Как это работает
2026-04-17 19:56:58 +03:00
- Файлы миграций хранятся как `.sql` файлы в `/home/xc_vm/migrations/` .
2026-03-15 00:02:19 +03:00
2026-04-17 19:56:58 +03:00
- Каждый файл именуется с числовым префиксом, например:
2026-03-15 00:02:19 +03:00
2026-04-17 19:56:58 +03:00
```text
001_drop_watch_folders_plex_token.sql
002_panel_logs_add_file_env.sql
003_drop_settings_segment_type.sql
```
2026-03-15 00:02:19 +03:00
2026-04-17 19:56:58 +03:00
- Применённые миграции отслеживаются в таблице `migrations` БД. Каждая миграция выполняется **ровно один раз** - если миграция уже применена, она пропускается.
- Миграции выполняются автоматически:
- `console.php update post-update` - после обновления панели
- `console.php status` - при проверке статуса системы (только на MAIN-сервере)
2026-03-15 00:02:19 +03:00
### Порядок выполнения миграций
```text
[ MigrationRunner::run() ]
│
▼
[ CREATE TABLE IF NOT EXISTS `migrations` ]
│
▼
[ Чтение всех *.sql файлов из migrations/ ]
│
▼
[ Для каждого файла, отсутствующего в таблице `migrations`: ]
├── Выполнить SQL-запросы
├── Записать в таблицу `migrations`
└── Вывести [OK] или [WARN]
```
---
2026-04-17 19:56:58 +03:00
## Создание новой миграции
2026-03-15 00:02:19 +03:00
Когда нужно изменить схему БД (добавить колонки, создать таблицы, вставить данные и т.д.), создайте новый SQL-файл миграции.
### Шаг 1. Выберите имя файла
Используйте следующий порядковый номер и описательное имя:
2026-04-17 19:56:58 +03:00
```text
2026-03-15 00:02:19 +03:00
NNN_short_description.sql
```
**Правила формата:**
2026-04-17 19:56:58 +03:00
2026-03-15 00:02:19 +03:00
- Числовой префикс: 3 цифры с ведущими нулями (например, `006` , `007` )
- Разделитель: нижнее подчёркивание `_`
- Имя: строчные буквы, подчёркивания, описание действия
- Расширение: `.sql`
**Примеры:**
2026-04-17 19:56:58 +03:00
```text
2026-03-15 00:02:19 +03:00
006_add_user_timezone.sql
007_create_audit_log_table.sql
008_insert_default_codec_settings.sql
```
### Шаг 2. Напишите SQL
Поместите SQL-запросы в файл. Несколько запросов разделяются `;` .
**Правила для SQL миграций:**
2026-04-17 19:56:58 +03:00
- **Используйте `IF EXISTS` / `IF NOT EXISTS` ** для идемпотентности:
2026-03-15 00:02:19 +03:00
```sql
-- Добавление колонки (безопасно)
ALTER TABLE ` settings ` ADD COLUMN IF NOT EXISTS ` timezone ` VARCHAR ( 64 ) DEFAULT 'UTC' ;
-- Удаление колонки (безопасно)
ALTER TABLE ` settings ` DROP COLUMN IF EXISTS ` old_column ` ;
-- Создание таблицы (безопасно)
CREATE TABLE IF NOT EXISTS ` audit_log ` (
` id ` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY ,
` action ` VARCHAR ( 255 ) NOT NULL ,
` created_at ` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE = InnoDB DEFAULT CHARSET = utf8 ;
```
2026-04-17 19:56:58 +03:00
- **Используйте условный `INSERT` ** для избежания дубликатов:
2026-03-15 00:02:19 +03:00
```sql
INSERT INTO ` streams_arguments ` ( argument_key , argument_name , argument_cmd )
SELECT 'my_key' , 'My Argument' , '-my_flag %s'
FROM DUAL
WHERE NOT EXISTS ( SELECT 1 FROM ` streams_arguments ` WHERE argument_key = 'my_key' );
```
2026-04-17 19:56:58 +03:00
- **Не смешивайте DDL и DML**, зависящие друг от друга, в одном файле. Если нужно добавить колонку и затем заполнить её, используйте два файла миграций.
2026-03-15 00:02:19 +03:00
2026-04-17 19:56:58 +03:00
- **Комментарии** поддерживаются с префиксом `--` (они пропускаются при выполнении).
2026-03-15 00:02:19 +03:00
### Шаг 3. Разместите файл
Скопируйте файл миграции в:
2026-04-17 19:56:58 +03:00
```text
2026-03-15 00:02:19 +03:00
/home/xc_vm/migrations/
```
> 💡 В репозитории исходного кода это `src/migrations/`.
2026-04-17 19:56:58 +03:00
### Шаг 4. Проверка миграции
2026-03-15 00:02:19 +03:00
Запустите команду status для применения ожидающих миграций:
```bash
2026-04-07 20:49:44 +03:00
sudo /home/xc_vm/console.php status first-run
2026-03-15 00:02:19 +03:00
```
Ожидаемый вывод:
2026-04-17 19:56:58 +03:00
```text
2026-03-15 00:02:19 +03:00
Migrations
------------------------------
[OK] 006_add_user_timezone.sql
```
Если запрос завершился с ошибкой, миграция всё равно будет записана, но покажет `[WARN]` — проверьте SQL и исправьте проблемы.
---
2026-04-17 19:56:58 +03:00
## Типичные CLI-операции
2026-03-15 00:02:19 +03:00
### Проверка статуса
```bash
2026-04-07 20:49:44 +03:00
sudo /home/xc_vm/console.php status
2026-03-15 00:02:19 +03:00
```
Проверяет, запущен ли XC_VM, подключается к БД, выполняет ожидающие миграции, исправляет права доступа и валидирует конфигурацию nginx. Требуется после установки или восстановления.
С аргументом `first-run` пропускает проверку статуса — используется при первоначальной настройке:
```bash
2026-04-07 20:49:44 +03:00
sudo /home/xc_vm/console.php status first-run
2026-03-15 00:02:19 +03:00
```
### Управление сервисом
```bash
2026-04-07 20:49:44 +03:00
sudo /home/xc_vm/console.php service start| stop| restart| reload
2026-03-15 00:02:19 +03:00
```
### Ручное обновление
```bash
2026-04-07 20:49:44 +03:00
sudo -u xc_vm /home/xc_vm/console.php update update
2026-03-15 00:02:19 +03:00
```
Скачивает и применяет последнее обновление с GitHub. Обычно запускается автоматически через веб-панель.
### Диагностика стримов
```bash
2026-04-07 20:49:44 +03:00
sudo -u xc_vm /home/xc_vm/console.php monitor <stream_id>
2026-03-15 00:02:19 +03:00
```
Запускает стрим вручную и отображает ошибки. Полезно для диагностики проблем запуска стримов.
### SSL-сертификат
```bash
2026-04-07 20:49:44 +03:00
sudo /home/xc_vm/console.php certbot
2026-03-15 00:02:19 +03:00
```
### Миграция (с других систем)
```bash
2026-04-07 20:49:44 +03:00
/home/xc_vm/console.php migrate
2026-03-15 00:02:19 +03:00
```
Переносит данные из базы миграции. Подробности в [Руководстве по миграции ](ru-ru/info/migration_guide.md ).
---