Files
founder cb20d8d28f fix(admin): связать отзыв учётных данных с идентичностью сессий и свести адрес control plane к одному
Отзыв секрета не сходился: `auth_id` при смене секрета оставался прежним,
поэтому сессия, установленная по отозванным учётным данным, была неотличима от
законной, и цикл учёта не имел признака, по которому её следовало завершить. У
состояния есть путь без единой неудачи — Hysteria регистрирует соединение в
Traffic Stats API только после возврата backend-auth, поэтому успешный /kick
может пройти мимо. Новое поколение credentials получает новый auth_id, kick идёт
по старому, пережившая сессия становится orphan.

Адрес Traffic Stats API имел два контракта: оркестратор принимал любой IPv4,
админка всегда шла на loopback. Валидная по всем гейтам конфигурация выключала
лимит устройств, учёт трафика и принудительное отключение разом. Адрес
зафиксирован, а расхождение файла с ним админка называет.

Состояние службы стало трёхзначным: util.Exec выбрасывал вывод systemctl при
ненулевом коде, поэтому «остановлена» и «спросить не удалось» приходили одним
значением, а доступность Traffic Stats API выводилась из него же. Журнал
Hysteria разбирается в фактическом формате upstream (time — дробное число),
страница конфигурации показывает файл вместо дефолтов UI и не возит секреты в
браузер, санитайзер выгрузки следует по YAML-якорям.

Разбор: docs/acceptance/2026-09-02-v1.0.0-rc4-preflight-findings.md
2026-09-02 23:24:01 +05:00

39 lines
1.7 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package vo
type LogSystemPage[T LogSystemVo | LogHysteria2Vo] struct {
LogSystemVos []T `json:"records"`
Total int64 `json:"total"`
}
// LogSystemVo — строка журнала админки в том виде, в каком её пишет
// middleware.LogHandler.
//
// Поля reqUri здесь нет намеренно: RequestURI несёт query string, а по
// машинному endpoint'у в ней приезжает действующий machine token. Логируется
// путь и, отдельно, имена переданных query-параметров без значений.
type LogSystemVo struct {
ClientIP string `json:"clientIp"`
LatencyTime int64 `json:"latencyTime"`
Level string `json:"level"`
Msg string `json:"msg"`
ReqMethod string `json:"reqMethod"`
ReqPath string `json:"reqPath"`
ReqQueryKeys string `json:"reqQueryKeys"`
StatusCode int64 `json:"statusCode"`
Time string `json:"time"`
}
// LogHysteria2Vo — строка журнала Hysteria в том виде, в каком её показывает
// панель.
//
// Тип НЕ является формой upstream-записи и никогда не разбирается прямым
// json.Unmarshal: JSON-логгер Hysteria 2.12.2 пишет `time` числом
// (zapcore.EpochMillisTimeEncoder), и попытка сложить его в строковое поле
// роняла разбор целиком. Форма провода живёт в service/journal.go, здесь —
// только результат.
type LogHysteria2Vo struct {
Level string `json:"level"`
Msg string `json:"msg"`
Time string `json:"time"`
}