3.8 KiB
3.8 KiB
B5 SingBox Template Migration And Rollback Runbook
Цель
Операционный runbook для миграции legacy singbox-<id>.service к template-модели singbox@<id>.service и для аварийного отката при инциденте деплоя.
Контекст текущей модели
- Целевой runtime:
singbox@.service+ per-instance drop-insingbox@<id>.service.d/10-selective-vpn.conf. - One-shot миграция legacy unit выполняется автоматически в pre-action (
start/restart) дляkind=singbox. - Safety guard: legacy unit обрабатывается только при ownership marker
Environment=SVPN_TRANSPORT_ID=<client_id>.
Preflight перед деплоем
- Проверить runtime-зависимости:
scripts/check_runtime_dependencies.sh
- Проверить strict-режим (опционально для CI/релиза):
scripts/check_runtime_dependencies.sh --strict
- Проверить наличие template unit:
systemctl list-unit-files 'singbox@.service' --no-legend
Управление миграцией
- Отключить авто-миграцию для профиля:
config.singbox_legacy_unit_migrate=false
- Включить dry-run без изменений unit-файлов:
config.singbox_legacy_unit_migrate_dry_run=true
- Поведение dry-run:
- backend пишет trace/stdout о планируемом
legacy -> templateпереходе, stop/disable/removeне выполняются.
- backend пишет trace/stdout о планируемом
Нормальный migrate-путь
- Обновить API-бинарь и перезапустить
selective-vpn-api.service. - На
start/restartконкретного SingBox-клиента backend:- валидирует ownership legacy unit,
- выполняет
stop + disable + removelegacy unit, - выполняет
daemon-reload + reset-failedдля legacy unit, - запускает template instance
singbox@<id>.service.
- Проверить:
systemctl status 'singbox@<id>.service'systemctl list-unit-files 'singbox-*' --no-legend(legacy не должен появляться как managed unit)
Аварийный rollback (template -> legacy)
Важно: текущий прод-код нормализует SingBox clients к config.unit=singbox@.service, поэтому rollback делается на уровне release rollback (предыдущий API build + восстановление unit/state).
- Зафиксировать инцидент и остановить изменения policy:
- временно не выполнять
start/restart/switchчерез GUI/API.
- временно не выполнять
- Откатить API до предыдущего релиза (где legacy path поддерживался штатно).
- Восстановить
transport-clientsstate из backup/снапшота релиза (если в инциденте state был изменён). - Восстановить legacy unit-файлы
singbox-*.serviceиз backup среды (если удалены). - Выполнить:
systemctl daemon-reloadsystemctl reset-failed
- Поднять нужные legacy unit и проверить egress/health.
Проверка после rollback
systemctl is-active selective-vpn-api.servicesystemctl is-active 'singbox-<id>.service'(для rollback-релиза)- API smoke:
curl -fsS http://127.0.0.1:8080/healthzcurl -fsS http://127.0.0.1:8080/api/v1/transport/clients
Примечание
- Legacy
sing-box.serviceостаётся только как compat-артефакт окружения. - Production path для новых профилей: только
singbox@.service.