# Механизм обновлений в XC_VM

Система обновлений XC_VM реализована как многоуровневый процесс: от веб-интерфейса до системных скриптов. Такой подход обеспечивает надёжность, автоматизацию и целостность данных при обновлении панели.

> 📋 Пошаговая инструкция со скриншотами — на странице [Обновление сервера](ru-ru/administration/server-update.md).

---

## 1. Инициация обновления

Процесс начинается с **нажатия кнопки "Обновить"** в веб-интерфейсе панели.

* Создаётся сигнал `update`, который записывается в таблицу `signals` базы данных.
* Этот сигнал выступает **триггером**, запускающим дальнейший процесс обновления.

---

## 2. Запуск через CRON

Каждую **минуту** выполняется системное задание CRON:

```bash
/home/xc_vm/console.php cron:root_signals
```

Крон-задача `root_signals` проверяет наличие новых сигналов и при обнаружении `update` запускает:

```bash
/home/xc_vm/console.php update update
```

> ⚙️ Этот механизм позволяет выполнять обновления **автоматически**, без ручного вмешательства администратора.

---

## 3. Управление обновлением (PHP-уровень)

Основная логика находится в классе `UpdateCommand`:

```
src/Cli/Commands/UpdateCommand.php
```

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

1. Определение **текущей версии панели** (`MAIN` или `LB`).
2. Получение данных о новой версии с **GitHub**:

   * Ссылка на архив обновления.
   * Контрольная сумма (хеш) для проверки целостности.
3. Скачивание архива во временную директорию.
4. Проверка соответствия хеш-суммы.
5. Запуск системного обновления с помощью Python:

```bash
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`, который запускает [миграции базы данных](ru-ru/guides/cli-tools.md#обновление-бд-после-обновления-версии) и post-update очистку.

---

## 4. Системное обновление (Python-уровень)

После вызова передача управления переходит к скрипту:

```
/home/xc_vm/update
```

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

1. **Повторная проверка контрольной суммы** архива.
2. **Остановка панели**, чтобы избежать конфликтов при обновлении.
3. **Распаковка** архива во временную директорию:

   ```bash
   /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`

5. **Копирование оставшихся файлов** поверх рабочей установки:

   ```bash
   cp -a /tmp/xc_vm_update_*/. /home/xc_vm/
   ```
6. **Настройка прав доступа:**

   ```bash
   chown -R xc_vm:xc_vm /home/xc_vm/
   ```
7. **Запуск пост-обновления:**

   ```bash
   /home/xc_vm/console.php update post-update
   ```
8. **Перезапуск панели** в рабочем режиме.
9. **Очистка** временной директории и удаление архива.

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

---

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

Финальные действия выполняются в фазе `post-update` команды `UpdateCommand`:

1. Проверка, **включено ли автообновление LB**:

   * Если обновлялся `MAIN`, создаются сигналы обновления для всех Load Balancer’ов.
2. Обновление **версии панели** в базе данных.
3. Удаление устаревших файлов.
4. Повторное выравнивание прав:

   ```bash
   chown -R xc_vm:xc_vm /home/xc_vm/
   ```
5. Перезагрузка системных демонов:

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

   ```bash
   sudo /home/xc_vm/console.php status
   ```
7. Завершение процесса обновления.

---

## 6. Итоговая схема работы

```text
[ Веб-интерфейс ]
        │
        ▼
[ БД: сигнал update ]
        │
        ▼
[ CRON → console.php cron:root_signals ]
        │
        ▼
[ UpdateCommand (PHP): скачивание + проверка хеша ]
        │
        ▼
[ update (Python): распаковка в /tmp → удаление исключённых → копирование ]
        │
        ▼
[ post-update → UpdateCommand ]
        │
        ▼
[ Завершение, рестарт демонов, обновление версии ]
```

---

## Ключевые особенности

* 🔒 **Двойная проверка целостности** (на уровне PHP и Python).
* 🧠 **Автоматическое распространение обновлений** между MAIN и LB.
* 🧹 **Очистка устаревших файлов** и выравнивание прав доступа.
* 🔄 **Безопасный перезапуск панели** после установки.
* ⚙️ **Гибкость и автономность** за счёт CRON и сигналов.

---