fix(v1): сделать отзыв доступа, бэкап и диагностику соответствующими своим именам
Проход по операциям, которые делают не то, что обещает их имя. P0. Удаление bootstrap-admin-peer не было отзывом доступа. Признаком «создавать пир или нет» служило наличие строки в таблице, а HY2XS_ADMIN_CON_PASS продолжает жить в /etc/hy2xs/hy2xs.env — его читает systemd-юнит. Оператор удалял пира, доступ исчезал, и ближайший restart возвращал того же пира с тем же секретом. Молча. Признаком стала отметка BOOTSTRAP_PEER_SEEDED в таблице config: «создавался когда-либо», а не «существует сейчас». Отметка и пир пишутся одной транзакцией. P1. Резервная копия с includeSecrets=true проглатывала и ошибку расшифровки, и отсутствие шифртекста, отдавая пира с пустым secret и успешный ответ. Теперь недоступный секрет любого пира отклоняет весь запрос с указанием имени. P1. DecryptPeerSecret возвращала содержимое колонки как расшифрованный секрет, если оно не начиналось с v1: — остаток поколения с открытыми секретами. P1. doctor перезапускал hysteria-server и hy2xs-admin: диагностика подозрения на проблему обрывала все живые соединения. P1. Админка сама генерировала HYSTERIA2_TRAFFIC_STATS_SECRET, записать который в /etc/hysteria/config.yaml она не может. Сервис объявлял себя здоровым, а machine auth переставал совпадать. P1. Обходы проверки зависимостей (accepted-risk/skipped) не могли произвести артефакт: приёмка требует dependency_security_gate=true. Удалены из сборки и документации, отсутствие проверяется приёмкой. P2. UPDATE по отсутствующей строке config считался успехом, и cron перепланировался при несохранённом значении. Решение по RowsAffected. P2. Слой данных не отличал «записи нет» от «база не ответила»: sentinel-значения ErrPeerNotFound / ErrAdminUserNotFound / ErrConfigNotFound / ErrStorage. P2. Удалены алиасы /:id/client-url и /:id/qr. Контракт разработки: apps/go.mod объявляет toolchain go1.26.7 (директива go — языковой baseline, а не выбор компилятора), tools/dev/doctor.sh|.ps1 сверяют среду с versions.env.
This commit is contained in:
@@ -116,6 +116,22 @@ hy2xs-orchestrator doctor --package-dir /usr/local/lib/hy2xs/package --config /e
|
||||
|
||||
Команда выполняет preflight + smoke как post-install/post-reboot validation.
|
||||
|
||||
`doctor` **не перезапускает сервисы**: он диагностирует работающую установку.
|
||||
Раньше он собирал контекст с параметрами по умолчанию и звал общий smoke, а тот
|
||||
первым же действием выполняет `systemctl restart hysteria-server hy2xs-admin` —
|
||||
то есть команда, которую этот раздел предлагает запускать при подозрении на
|
||||
проблему, гарантированно обрывала все живые VPN-соединения, включая случай,
|
||||
когда с сервисом всё в порядке. Диагностика, меняющая то, что диагностирует,
|
||||
отвечает не на заданный вопрос: после рестарта проверяется уже другое состояние.
|
||||
|
||||
Остальные проверки smoke выполняются полностью — слушатели, права и владельцы
|
||||
файлов, machine auth (включая негативные случаи), семантика
|
||||
`/etc/hysteria/config.yaml` против production-профиля, версия установленного
|
||||
бинаря. Состояние сервера ни одна из них не меняет.
|
||||
|
||||
Перезапуск сервисов остаётся операцией `install`, `reconfigure --apply` и
|
||||
`repair` — там он является частью применения изменений, а не проверкой.
|
||||
|
||||
## 13. Admin UI access via SSH tunnel
|
||||
|
||||
Production policy: UI остаётся loopback-only (`HY2XS_UI_BIND_HOST=127.0.0.1`), внешний доступ к `8080/tcp` не открывается.
|
||||
|
||||
Reference in New Issue
Block a user