# Эксплуатация ## Ротация credential Интерактивно: ```bash sudo vpn-egressctl import --stdin ``` Из защищённого файла: ```bash sudo vpn-egressctl import --file /run/credentials/new-hysteria2.uri ``` Файл должен иметь режим `0600`. Не используйте positional argument, environment variable, shell history или URL в тикете/логе. ## Изменение policy ```bash install -m 0600 new-policy.json /etc/vpn-egress/policy.json vpn-egressctl check vpn-egressctl diff vpn-egressctl sync ``` Path unit следит только за URI. Policy применяется явным `sync`, чтобы случайное редактирование инфраструктурных параметров не вызвало неожиданный restart. ## Состояние ```bash vpn-egressctl status vpn-egressctl status --json ``` State содержит только hashes, endpoint без auth, версию, время и результат. ## Rollback ```bash vpn-egressctl rollback ``` Команда проверяет last-good реальным sing-box, атомарно меняет конфиги местами, перезапускает сервис и выполняет тот же healthcheck. Повторный rollback возвращает конфигурацию, которая была активна до первого rollback. После ручного rollback desired URI остаётся прежним. `status` показывает `status=rolled_back`, а `doctor` сообщает `config-drift`, потому что production config отличается от заново отрендеренного desired state. Перед новым `sync` нужно либо исправить URI, либо осознанно вернуть desired state. ## Реакция systemd.path `PathChanged` запускает oneshot `vpn-egress-sync.service`. Одновременный ручной import сериализуется lock-файлом. Если новый URI некорректен, production config не меняется, а unit завершается с ошибкой, видимой в journal. ```bash journalctl -u vpn-egress-sync.service -n 100 --no-pager systemctl reset-failed vpn-egress-sync.service ``` ## Плановое обновление Обновление policy или пакета внутри 1.13.19: 1. `vpn-egressctl check`; 2. `vpn-egressctl diff`; 3. backup артефакта пакета; 4. обновление; 5. `vpn-egressctl sync`; 6. `vpn-egressctl doctor`; 7. контролируемый rollback-тест на staging.