11 KiB
Механизм обновления в XC_VM
Система обновления XC_VM реализована как многоуровневый процесс, от веб-интерфейса до сценариев системного уровня. Такой подход обеспечивает надежность, автоматизацию и целостность данных при обновлении панели.
📋 Пошаговое руководство со скриншотами см. в разделе Обновление сервера.
1. Инициирование обновления
Процесс начинается, когда администратор нажимает кнопку "Обновить" в веб-интерфейсе.
- Сигнал с именем
updateвставляется в таблицуsignalsв базе данных. - Этот сигнал действует как спусковой крючок для всей процедуры обновления.
2. Триггер CRON
Каждые минута выполняется следующее задание CRON:
/home/xc_vm/console.php cron:root_signals
Задание cron root_signals проверяет наличие новых сигналов.
Когда он обнаруживает сигнал update, он запускает:
/home/xc_vm/console.php update update
3. Управление обновлениями (уровеньPHP)
Основная логика находится в классе UpdateCommand:
src/Cli/Commands/UpdateCommand.php
На этом этапе выполняются следующие действия:
- Определите значение текущий тип панели (
MAINилиLB). - Извлекать обновленные метаданные из ГитХаб:
- Прямая ссылка на архив обновлений.
- Контрольная сумма SHA для проверки целостности.
- Загрузите архив во временный каталог.
- Убедитесь, что загруженный файл соответствует ожидаемому хэшу.
- Передайте управление программе обновления системного уровня (Python):
sudo /usr/bin/python3 /home/xc_vm/update "/home/xc_vm/tmp/.update.tar.gz" "HASH" > /dev/null 2>&1 &
💡 После завершения обновления Python программа вызывает
console.php update post-update, что запускает миграцию базы данных и очистку после обновления.
4. Обновление на системном уровне (уровень Python)
Управление передается скрипту на Python:
/home/xc_vm/update
Он выполняет привилегированные системные операции:
-
Повторная проверка контрольная сумма архива.
-
Остановите панель для предотвращения конфликтов во время обновления.
-
Извлекать архив во временный каталог:
/tmp/xc_vm_update_*/ -
Удаление исключенных каталогов из временной копии — двоичные файлы, конфигурации и пользовательские данные, которые нельзя перезаписывать:
bin/ffmpeg_bin, bin/nginx, bin/nginx_rtmp, bin/php, bin/redis, bin/install, bin/maxmind, bin/certbot, content, backups, tmp, config, signals
-
Скопируйте оставшиеся файлы поверх текущей установки:
cp -a /tmp/xc_vm_update_*/. /home/xc_vm/ -
Закрепить право собственности:
chown -R xc_vm:xc_vm /home/xc_vm/ -
Выполнение задач после обновления:
/home/xc_vm/console.php update post-update -
Перезапуск панель находится в нормальном рабочем режиме.
-
Уборка откройте временный каталог и удалите архив.
ℹ️ Один и тот же архив используется как для установки, так и для обновления. Фильтрация выполняется на сервере во время обновления — список исключений определяется непосредственно в
src/update.
5. Завершение обновления
Заключительные шаги выполняются на этапе post-update из UpdateCommand:
-
Если включено значение Автоматическое обновление LB и был обновлен главный узел (
MAIN), → создайте сигналыupdateдля всех подсистем балансировки нагрузки. -
Обновите значение панельная версия в базе данных.
-
Удалите устаревшие файлы.
-
Повторно примените правильные разрешения:
chown -R xc_vm:xc_vm /home/xc_vm/ -
Перезагрузить systemd демонов:
sudo systemctl daemon-reload -
Проверка состояния панели:
sudo /home/xc_vm/console.php status -
Отметьте процесс обновления как завершенный.
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, запуская:/home/xc_vm/console.php update rollback X.Y.Z -
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, beta also offers (beta) pre-releases.
⚠️ Понижение версии не отменяет перенос базы данных (они доступны только в прямом режиме). Схема поддерживается с обратной совместимостью, а автоматическое ОСНОВНОЕ резервное копирование является способом восстановления. Программа Python выполняет копирование по дереву (
cp -a) без удаления файлов, поэтому файлы, добавленные в более новой версии, сохраняются до следующего обновления.
ключевые функции
- Двойная проверка целостности (оба уровня - PHP и Python - проверяют хэш).
- Автоматическое распространение обновлений от ОСНОВНОГО до всех подсистем балансировки нагрузки.
- Уборка для удаления устаревших файлов и нормализации разрешений.
- Безопасный перезапуск панели управления после установки.
- Гибкость и автономность благодаря запуску на основе сигнала CRON +.