- в конфиг добавлены секция [auth.test_headers] и предохранитель [server] debug: заголовки входа подставляет слой транспорта, второго процесса локальный запуск больше не требует - подкоманда devtools proxy удалена целиком: всё, ради чего её поднимали, делает сам сервис - адресного предохранителя нет по решению владельца — цена названа в ADR и в модели угроз
6.4 KiB
Why
Чтобы открыть приложение на своей машине, сегодня мало запустить сервис: рядом надо поднять второй процесс — подставной обратный прокси из оснастки, — потому что сервис узнаёт пришедшего по заголовку, а браузер заголовков не ставит. Два процесса вместо одного, свой порт у каждого и правило «приложение открывают по адресу прокси, а не по адресу сервиса» — всё это надо помнить и объяснять каждому, кто пришёл в проект.
Владелец назвал желаемое прямо: один бинарник, а различия между запусками
задаются конфигом. Тестовый прогон должен подниматься тем же
go run ./cmd/transcriber -c config.toml, что и всякий другой, и отличаться от
боевого только содержимым файла настроек.
What Changes
- В секцию
[auth]добавляется подсекцияtest_headers— имитация заголовков, которые сервису на сервере ставит обратный прокси. Ключи подсекции задают значения, которыми сервис назовёт пришедшего сам, когда тот пришёл ни с чем. - В секцию
[server]добавляется предохранительdebug— признак отладочного запуска со значением по умолчанию «выключено». Подстановка заголовков работает только при включённом признаке. - Старт получает новые правила отказа. Заполненная имитация при выключенном
предохранителе роняет сервис, а не игнорируется молча; имитация, при которой
узнавание не состоится ни при каком запросе — неизвестное имя заголовка,
отсутствующий или негодный
Remote-User, — роняет его тоже. - Владелец обязан видеть отладочный запуск в журнале сервиса — предупреждением при старте и на каждом подставленном запросе.
- Подставной обратный прокси
go run ./cmd/devtools proxyубирается целиком: всё, ради чего его поднимали, делает сам сервис, и второго способа входить локально не остаётся. Решение владельца на чекпоинте; цена — поломки контура местным инструментом больше не воспроизводятся. - Образец конфига и памятка описывают локальный вход через настройки вместо запуска второго процесса.
Capabilities
New Capabilities
Новых capability изменение не заводит: предмет прежний — кто пришёл в сервис и пускают ли его дальше.
Modified Capabilities
access: узнавание получает второй источник заголовков — настройки сервиса — и правила, при которых этот источник законен. Требования: подстановка идёт только при включённом предохранителе, только при отсутствии пришедшего заголовка, только с адресов, которым сервис и так верит; заполненная имитация без предохранителя роняет старт; отладочный запуск виден в журнале, а значения подставленного заголовка в журнале по-прежнему нет.
Impact
- Настройки:
internal/config— структуры секций[server]и[auth], умолчания, проверки старта. Имя нового ключа конфига необратимо и решается человеком. - Вход:
internal/controller/http— цепочка слоёв корня приложения и узнавание по заголовку. - Точка входа:
cmd/transcriber— порядок проверок при старте и сборка цепочки. - Оснастка:
cmd/devtools— подкомандаproxyудаляется вместе с флагами, шапкой пакета и строкойusage(). - Документы:
config.example.toml,CLAUDE.md,README.md,docs/security.md,docs/conventions/config.md,docs/architecture.md— везде, где локальный вход описан через второй процесс. - Граница домена:
docs/passport.md, «Управление учётными записями». Сегодня он утверждает, что кто пришёл, сервис не решает никогда, и что исключений у этого больше нет. Изменение заводит исключение, и паспорт обязан назвать его одной строкой с границей — предохранитель[server] debug, выключенный по умолчанию, — и ссылкой на спекуaccess. - Периметр: изменение заводит настройку, которой сервис пускает кого угодно.
Машиной боевая поломка не исключена: сервис с включённым предохранителем и
заполненной имитацией поднимется на любом перечне доверенных адресов. Что
стоит между боевой выкладкой и открытым входом — в
design.md, решение 4.