cb20d8d28f
Отзыв секрета не сходился: `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
39 lines
1.7 KiB
Go
39 lines
1.7 KiB
Go
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"`
|
||
}
|