Полнота бэкапа: SSH, весь UFW, свои юниты, конфиги пакетов, системные параметры
Агент: - ssh: sshd_config(.d), ключи хоста, authorized_keys root и пользователей - system: весь /etc/ufw и /etc/default/ufw, /etc/sysctl.conf, /etc/hosts, свои файлы в /etc/cron.d (пакетные отсекаются через dpkg -S) - certs: /etc/letsencrypt, /root/.acme.sh; xui: сертификаты по путям из базы - docker: daemon.json и логины в registry; telegraf: /etc/default/telegraf - caddy: бинарник бэкапится, если Caddy собран с плагинами - units: свои systemd-юниты с состоянием enabled/active и drop-in *.service.d - etc: изменённые конфиги любых пакетов (dpkg conffiles) и свои файлы в /etc, кроме привязанного к железу и облаку - в манифесте: часовой пояс, swap, вручную поставленные пакеты; версия apt-пакета в строке категории - предупреждения: программы юнитов вне бэкапа, каталоги /opt и /usr/local/bin без категории, контейнеры без compose Restore: - часовой пояс, swap-файл, доустановка вручную поставленных пакетов - свои юниты включаются и запускаются как на старом сервере Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
cbd3cde01d
commit
1947b26913
14 files changed
+747
-45
No files matched your search
@@ -151,13 +151,16 @@ curl -fsSL https://backup.example.com/restore.sh | sudo bash -s -- --token bm_..
|
||||
|
||||
1. Показывается сводка бэкапа и запрашивается подтверждение.
|
||||
2. Базовая подготовка системы (`internal/restore/provision.sh`): пользователь с sudo, hostname, fail2ban, UFW, blocklist, SSH hardening. Docker, Caddy и Telegraf ставятся **тех же версий apt-пакетов**, если такие версии ещё есть в репозитории. Спрашиваются только логин и пароль пользователя.
|
||||
3. Распаковка: файлы ложатся на свои места, docker-тома — прямо в тома.
|
||||
4. Категории восстанавливаются по порядку:
|
||||
3. Системные параметры старого сервера: часовой пояс (от него зависит время cron-заданий), swap-файл того же размера, вручную поставленные пакеты (`apt-mark showmanual`), если они есть в репозиториях.
|
||||
4. Распаковка: файлы ложатся на свои места, docker-тома — прямо в тома.
|
||||
5. Категории восстанавливаются по порядку:
|
||||
- 3x-ui, Nebula и sing-box ставятся той версии, что была на старом сервере. Если скачать не получилось, используется копия бинарника из бэкапа;
|
||||
- база x-ui кладётся на место;
|
||||
- compose-проекты: образы закрепляются по digest (`compose.restore.yml`), базы поднимаются, в них заливаются дампы, затем запускается весь проект;
|
||||
- systemd-сервисы включаются и запускаются так, как было на старом сервере.
|
||||
5. В конце выводятся итог и список того, что осталось сделать: DNS, lighthouse, перезагрузка.
|
||||
- systemd-сервисы включаются и запускаются так, как было на старом сервере;
|
||||
- sshd проверяется (`sshd -t`) и перезапускается со старым конфигом и ключами хоста;
|
||||
- свои systemd-юниты включаются и запускаются как на старом сервере.
|
||||
6. В конце выводятся итог и список того, что осталось сделать: DNS, lighthouse, перезагрузка. Перезагрузка нужна в том числе для того, чтобы все сервисы перечитали восстановленные конфиги.
|
||||
|
||||
Флаги:
|
||||
- `--backup ID` — конкретный бэкап;
|
||||
@@ -171,18 +174,32 @@ curl -fsSL https://backup.example.com/restore.sh | sudo bash -s -- --token bm_..
|
||||
|
||||
| Категория | Что входит |
|
||||
|---|---|
|
||||
| system | правила UFW, все crontab (`/var/spool/cron/crontabs`), `ban-blacklist`, `/etc/sysctl.d` |
|
||||
| xui | `/etc/x-ui` (снимок базы через `VACUUM INTO`, без логина в панель), `/root/cert`, свои geo-файлы `/usr/local/x-ui/bin/*.dat` (ipcheck, discord и т.п., кроме штатных), версия 3x-ui |
|
||||
| system | весь `/etc/ufw` и `/etc/default/ufw`, все crontab (`/var/spool/cron/crontabs`) и свои файлы `/etc/cron.d`, `/etc/sysctl.conf`, `/etc/sysctl.d`, `/etc/hosts`, `ban.sh` |
|
||||
| ssh | `sshd_config`, `sshd_config.d`, ключи хоста, `authorized_keys` root и пользователей |
|
||||
| certs | `/etc/letsencrypt`, `/root/.acme.sh` |
|
||||
| xui | `/etc/x-ui` (снимок базы через `VACUUM INTO`, без логина в панель), `/root/cert`, свои geo-файлы `/usr/local/x-ui/bin/*.dat` (ipcheck, discord и т.п., кроме штатных), сертификаты по путям из базы (панель, подписка, инбаунды), версия 3x-ui |
|
||||
| fail2ban | `jail.local`, `jail.d/` (в т.ч. `3x-ipl.local`), IP-лимит 3x-ui (`filter.d`/`action.d/3x-ipl.conf`), свои `*.local`; при восстановлении создаются логи `3xipl.log` |
|
||||
| nebula | `/etc/nebula`, юнит, версия |
|
||||
| caddy | `/etc/caddy`, `/var/www`, сертификаты |
|
||||
| telegraf | `/etc/telegraf`, sudoers |
|
||||
| caddy | `/etc/caddy`, `/var/www`, сертификаты; бинарник — если Caddy собран с плагинами |
|
||||
| telegraf | `/etc/telegraf`, sudoers, `/etc/default/telegraf` |
|
||||
| docker | `/etc/docker/daemon.json`, логины в registry (`/root/.docker/config.json`) |
|
||||
| sing-box-warp | `/opt/sing-box-warp`, `/etc/sing-box-warp`, юнит, sysctl, версия sing-box-extended |
|
||||
| scripts | `/var/scripts`, `update-geosite.sh` |
|
||||
| pnvpanel | `/opt/PnvPanel` целиком, кроме `pgdata`; `pg_dump`; том `ticket_uploads` |
|
||||
| stoat | `/opt/stoat`, кроме `data/db` и `data/rabbit`; `mongodump`; `data/minio` идёт отдельной heavy-частью раз в неделю |
|
||||
| stoat-mbot | `/opt/stoat-mbot` целиком, восстанавливается после stoat |
|
||||
| etc | страховка: изменённые конфиги любых пакетов (`dpkg` conffiles) и свои файлы в `/etc`, кроме привязанного к железу и облаку (сеть, диски, cloud-init, apt, загрузчик) |
|
||||
| psiphon | отключён |
|
||||
| units | свои systemd-юниты (не из пакетов) с состоянием enabled/active и drop-in переопределения `*.service.d` |
|
||||
|
||||
Кроме файлов, в манифест записываются часовой пояс, swap и список вручную поставленных пакетов.
|
||||
|
||||
Агент ищет то, что могло не попасть в бэкап, и показывает это в карточке клиента как предупреждения:
|
||||
- скрипты из crontab и программы из юнитов, которые не покрыты ни одной категорией;
|
||||
- каталоги в `/opt` и программы в `/usr/local/bin` и `/usr/local/sbin` без категории;
|
||||
- контейнеры, запущенные через `docker run`, а не через compose.
|
||||
|
||||
Ненужное убирается глобальным `exclude` в конфиге клиента.
|
||||
|
||||
Compose-проекты, которых нет в каталоге, находятся автоматически (`docker compose ls`). Они бэкапятся с настройками по умолчанию и помечаются в морде как «авто». Базы распознаются по образу (postgres, mongo, mysql, mariadb) и дампятся без остановки.
|
||||
|
||||
|
||||
Reference in new issue
Block a user