Files
XC_VM/docs/ru/administration/update-system.md
T
2026-09-01 16:07:06 +03:00

11 KiB
Raw Blame History

Механизм обновления в 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

На этом этапе выполняются следующие действия:

  1. Определите значение текущий тип панели (MAIN или LB).
  2. Извлекать обновленные метаданные из ГитХаб:
    • Прямая ссылка на архив обновлений.
    • Контрольная сумма SHA для проверки целостности.
  3. Загрузите архив во временный каталог.
  4. Убедитесь, что загруженный файл соответствует ожидаемому хэшу.
  5. Передайте управление программе обновления системного уровня (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

Он выполняет привилегированные системные операции:

  1. Повторная проверка контрольная сумма архива.

  2. Остановите панель для предотвращения конфликтов во время обновления.

  3. Извлекать архив во временный каталог:

    /tmp/xc_vm_update_*/
    
  4. Удаление исключенных каталогов из временной копии — двоичные файлы, конфигурации и пользовательские данные, которые нельзя перезаписывать:

bin/ffmpeg_bin, bin/nginx, bin/nginx_rtmp, bin/php, bin/redis, bin/install, bin/maxmind, bin/certbot, content, backups, tmp, config, signals

  1. Скопируйте оставшиеся файлы поверх текущей установки:

    cp -a /tmp/xc_vm_update_*/. /home/xc_vm/
    
  2. Закрепить право собственности:

    chown -R xc_vm:xc_vm /home/xc_vm/
    
  3. Выполнение задач после обновления:

    /home/xc_vm/console.php update post-update
    
  4. Перезапуск панель находится в нормальном рабочем режиме.

  5. Уборка откройте временный каталог и удалите архив.

ℹ️ Один и тот же архив используется как для установки, так и для обновления. Фильтрация выполняется на сервере во время обновления — список исключений определяется непосредственно в src/update.


5. Завершение обновления

Заключительные шаги выполняются на этапе post-update из UpdateCommand:

  1. Если включено значение Автоматическое обновление LB и был обновлен главный узел (MAIN), → создайте сигналы update для всех подсистем балансировки нагрузки.

  2. Обновите значение панельная версия в базе данных.

  3. Удалите устаревшие файлы.

  4. Повторно примените правильные разрешения:

    chown -R xc_vm:xc_vm /home/xc_vm/
    
  5. Перезагрузить systemd демонов:

    sudo systemctl daemon-reload
    
  6. Проверка состояния панели:

    sudo /home/xc_vm/console.php status
    
  7. Отметьте процесс обновления как завершенный.


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 могут быть понижены независимо друг от друга.

  1. Инициация. В Серверы → Управление серверами меню "Действия для каждого сервера" содержит пункт Версия для отката. Открывается диалоговое окно со списком более ранних версий (предварительные версии помечены как (beta)), выбранных с помощью действия rollback_versions API (GitHubReleases::getPreviousVersions()). При выборе версии вводится сигнал — {"action":"rollback","version":"X.Y.Z"} - для этого сервера.

  2. Триггер CRON. cron:root_signals обрабатывает сигнал rollback, запуская:

    /home/xc_vm/console.php update rollback X.Y.Z
    
  3. PHP layer (UpdateCommand, rollback case).

    • Проверьте целевую версию (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).
  4. Система + завершение. Аналогично обновлению: скрипт на 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 +.