локальный вход задаётся конфигом: заголовки подставляет сам сервис

- в конфиг добавлены секция [auth.test_headers] и предохранитель [server] debug:
  заголовки входа подставляет слой транспорта, второго процесса локальный запуск
  больше не требует
- подкоманда devtools proxy удалена целиком: всё, ради чего её поднимали, делает
  сам сервис
- адресного предохранителя нет по решению владельца — цена названа в ADR и в
  модели угроз
This commit is contained in:
av
2026-08-23 13:12:47 +03:00
parent 75c6f0168a
commit 52fe31319a
35 changed files with 3548 additions and 144 deletions
+22
View File
@@ -62,6 +62,16 @@ type ServerConfig struct {
Port int `toml:"port"`
ShutdownTimeout int `toml:"shutdown_timeout"`
ForceShutdownTimeout int `toml:"force_shutdown_timeout"`
// Debug — предохранитель отладочного запуска. Умолчание — «выключено»:
// отсутствие ключа читается как боевой прогон, а не как отладочный.
//
// Означает он одно: прогон идёт на машине разработчика, и сервису позволено
// подставить то, что в бою даёт окружение. Сегодня подставляется ровно одна
// вещь — заголовки входа, — и перечень следствий закрыт: уровня журнала,
// текстов внутренних отказов, ограничителя частоты, подмены распознавателя и
// проверок старта признак не касается. Новое следствие вешается на него
// только отдельной нормой спеки `access`.
Debug bool `toml:"debug"`
}
// StorageConfig — хранилище сервиса: каталог данных и числа его базы.
@@ -121,6 +131,18 @@ type AuthConfig struct {
// пересылаемым распоряжается тот, кто шлёт запрос, и барьер, подделываемый
// той же строкой, которой он обходится, не барьер вовсе.
TrustedProxies []string `toml:"trusted_proxies"`
// TestHeaders — имитация заголовков, которые в бою ставит обратный прокси.
// Ключ — имя заголовка, значение — то, чем сервис назовёт пришедшего сам.
//
// Работает только при включённом предохранителе `[server] debug`, и
// заполненная секция без него роняет старт: состояние «имитация есть,
// предохранителя нет» не читается никак, а обе его прочтения — поломка.
//
// Умолчание — пустая секция. Непустой она считается по наличию ключа, каким
// бы ни было его значение: `Remote-User = ""` — заполненная имитация, а не
// отсутствие её.
TestHeaders map[string]string `toml:"test_headers"`
}
// TrustedNetworks разбирает перечень доверенных адресов.