Механизм обновления в XC_VM¶
Система обновления XC_VM реализована как многоуровневый процесс, от веб-интерфейса до сценариев системного уровня. Такой подход обеспечивает надежность, автоматизацию и целостность данных при обновлении панели.
📋 Пошаговое руководство со скриншотами см. в разделе Обновление сервера.
1. Инициирование обновления¶
Процесс начинается, когда администратор нажимает кнопку "Обновить" в веб-интерфейсе.
- Сигнал с именем
updateвставляется в таблицуsignalsв базе данных. - Этот сигнал действует как спусковой крючок для всей процедуры обновления.
2. Триггер CRON¶
Каждые минута выполняется следующее задание CRON:
Задание cron root_signals проверяет наличие новых сигналов.
Когда он обнаруживает сигнал update, он запускает:
3. Управление обновлениями (уровеньPHP)¶
Основная логика находится в классе UpdateCommand:
На этом этапе выполняются следующие действия:
- Определите значение текущий тип панели (
MAINилиLB). - Извлекать обновленные метаданные из ГитХаб:
- Прямая ссылка на архив обновлений.
- Контрольная сумма SHA для проверки целостности.
- Загрузите архив во временный каталог.
- Убедитесь, что загруженный файл соответствует ожидаемому хэшу.
- Передайте управление программе обновления системного уровня (Python):
💡 После завершения обновления Python программа вызывает
console.php update post-update, что запускает миграцию базы данных и очистку после обновления.
4. Обновление на системном уровне (уровень Python)¶
Управление передается скрипту на Python:
Он выполняет привилегированные системные операции:
- Повторная проверка контрольная сумма архива.
- Остановите панель для предотвращения конфликтов во время обновления.
- Извлекать архив во временный каталог:
- Удаление исключенных каталогов из временной копии — двоичные файлы, конфигурации и пользовательские данные, которые нельзя перезаписывать:
bin/ffmpeg_bin, bin/nginx, bin/nginx_rtmp, bin/php, bin/redis, bin/install, bin/maxmind, bin/certbot, content, backups, tmp, config, signals
- Скопируйте оставшиеся файлы поверх текущей установки:
- Закрепить право собственности:
- Выполнение задач после обновления:
- Перезапуск панель находится в нормальном рабочем режиме.
- Уборка откройте временный каталог и удалите архив.
ℹ️ Один и тот же архив используется как для установки, так и для обновления. Фильтрация выполняется на сервере во время обновления — список исключений определяется непосредственно в
src/update.
5. Завершение обновления¶
Заключительные шаги выполняются на этапе post-update из UpdateCommand:
- Если включено значение Автоматическое обновление LB и был обновлен главный узел (
MAIN), → создайте сигналыupdateдля всех подсистем балансировки нагрузки. - Обновите значение панельная версия в базе данных.
- Удалите устаревшие файлы.
- Повторно примените правильные разрешения:
- Перезагрузить systemd демонов:
- Проверка состояния панели:
- Отметьте процесс обновления как завершенный.
6. Полная схема рабочего процесса¶
[ Web Interface ]
│
▼
[ DB: "update" signal ]
│
▼
[ CRON → console.php cron:root_signals ]
│
▼
[ UpdateCommand (PHP): download + verify hash ]
│
▼
[ update (Python): extract to /tmp → remove excluded → copy over ]
│
▼
[ post-update → UpdateCommand ]
│
▼
[ Finalize, restart daemons, update version in DB ]
Откат (понижение рейтинга)¶
Сервер также можно откатить до версии ранее. Это повторяет описанный выше процесс обновления, но нацелен на выбранную версию, а не на последнюю — повторно используется тот же конвейер signal → CRON → PHP → Python и тот же инструмент src/update applier'а. Откат выполняется для каждого сервера, поэтому MAIN и каждый LB могут быть понижены независимо друг от друга.
-
Инициация. В Серверы → Управление серверами меню "Действия для каждого сервера" содержит пункт Версия для отката. Открывается диалоговое окно со списком более ранних версий (предварительные версии помечены как
(beta)), выбранных с помощью действияrollback_versionsAPI (GitHubReleases::getPreviousVersions()). При выборе версии вводится сигнал —{"action":"rollback","version":"X.Y.Z"}- для этого сервера. -
Триггер CRON.
cron:root_signalsобрабатывает сигналrollback, запуская:
- PHP layer (
UpdateCommand,rollbackcase). - Проверьте целевую версию (
X.Y.Z, строго более старую, чем текущая версия). - Только для главный: выполните автоматическое резервное копирование базы данных в
backups/pre_rollback_<from>_to_<to>_<timestamp>.sql, прервав его в случае сбоя. Узлы LB не имеют базы данных и пропустите это. - Откройте архив версии точный с помощью
GitHubReleases::getVersionFile()(MAIN →xc_vm.tar.gz, LB →loadbalancer.tar.gz), загрузите его и проверьте MD5. -
Передайте в тот же Python updater (
src/update). -
Система + завершение. Аналогично обновлению: скрипт на Python останавливает панель, заменяет дерево (сохраняя двоичные файлы/конфигурацию/данные) и
post-updateустанавливает версию в базе данных на откатную версию и перезапускает панель.
The version list is channel-aware: the stable channel offers only stable releases, unstable also offers (beta) pre-releases.
⚠️ Понижение версии не отменяет перенос базы данных (они доступны только в прямом режиме). Схема поддерживается с обратной совместимостью, а автоматическое ОСНОВНОЕ резервное копирование является способом восстановления. Программа Python выполняет копирование по дереву (
cp -a) без удаления файлов, поэтому файлы, добавленные в более новой версии, сохраняются до следующего обновления.
ключевые функции¶
- Двойная проверка целостности (оба уровня - PHP и Python - проверяют хэш).
- Автоматическое распространение обновлений от ОСНОВНОГО до всех подсистем балансировки нагрузки.
- Уборка для удаления устаревших файлов и нормализации разрешений.
- Безопасный перезапуск панели управления после установки.
- Гибкость и автономность благодаря запуску на основе сигнала CRON +.