tasks: вход переезжает на заголовки прокси, пять задач про OIDC закрыты

- заведена `trusted-header-login` и поставлена в голову очереди
- пять задач про механику OIDC закрыты как отменённые ею
- `dev-run-task` и `api-tokens` переписаны под новый вход
This commit is contained in:
av
2026-08-22 17:43:18 +03:00
parent 2bb252e018
commit e4441f3c49
10 changed files with 113 additions and 261 deletions
+22 -18
View File
@@ -1,18 +1,22 @@
# 🧹 Поднимать сервис и заглушку одной командой
# 🧹 Поднимать сервис для локальной работы одной командой
- **Тип:** chore
- **Категория:** Очередь — оснастка локального прогона: без неё каждую проверку начинают с двух терминалов и ручной уборки
- **Зачем:** Локальная проверка требует двух терминалов, ручной остановки обоих процессов и чистки каталога данных; учётную запись заводят проходом по браузеру, а владельца панели по одноразовой ссылке из журнала.
- **Зачем:** Локальная проверка требует ручной чистки каталога данных и остановки процесса, а владельца панели заводят по одноразовой ссылке из журнала.
Шаг `task dev CONFIG=<путь> USER=<почта>` поднимает сервис и подставной
провайдер OIDC разом, кладёт данные во временный каталог, заводит учётные записи
и гасит оба процесса по Ctrl+C.
Шаг `task dev CONFIG=<путь> USER=<имя>` поднимает сервис, кладёт данные во
временный каталог, заводит владельца панели и гасит процесс по Ctrl+C.
Работа состоит из двух частей, и они едут одним коммитом: инструмент
`cmd/devadmin` и шаг `dev`, который его зовёт. Порознь они не нужны — шаг без
инструмента не заведёт владельца панели, инструмент без шага останется вызовом,
который никто не делает.
Заглушки провайдера здесь больше нет: вход переезжает на доверенные заголовки
задачей `trusted-header-login`, и обычная учётная запись заводится первым же
запросом с заголовком. Каким способом заголовок попадает в запрос на машине без
прокси, решает та задача; этот шаг её решение только зовёт.
Задуманное устройство:
- конфиг пишет человек и передаёт путём — шаг его не сочиняет;
@@ -21,13 +25,12 @@
того, что написано в конфиге. Временное живёт в `/tmp` — в `data/` писать
запрещено (CLAUDE.md, «Запреты»);
- владельца панели заводит `cmd/devadmin` — отдельный main-пакет рядом с
`cmd/oidcstub`, в образ он не едет. Базу открывает тем же `pbrepo.New`, что и
`cmd/transcriber`, в образ он не едет. Базу открывает тем же `pbrepo.New`, что и
сервис, и потому получает её со схемой целиком; зовётся до подъёма сервиса, на
пустом каталоге. Пароль существующего владельца не переписывает;
- шаг заводит обычную учётную запись входом: поднимает `cmd/oidcstub` с
`-email` из `USER`, сам проходит цепочку входа и тем создаёт запись;
- оба процесса идут одной группой, `trap` на `INT` и `TERM` гасит их разом,
`wait` держит терминал.
- обычная учётная запись заводится первым запросом с заголовком: имя берётся из
`USER`, и заводить её отдельно шагу не нужно;
- `trap` на `INT` и `TERM` гасит процесс, `wait` держит терминал.
## Затрагивает
@@ -41,14 +44,14 @@
## Критерии приёмки
- Команда поднимает оба процесса и печатает адрес, по которому открывать
приложение. Оракул: прогон с тестовым конфигом — сервис и заглушка слушают свои
порты.
- Ctrl+C гасит обоих и не оставляет висящих процессов. Оракул: `pgrep` по обоим
именам после остановки — пусто.
- После запуска в базе есть учётная запись с переданной почтой, а владелец панели
входит своим паролем. Оракул: запрос к коллекции пользователей во временной базе
и вход по `auth-with-password` в коллекцию владельцев.
- Команда поднимает сервис и печатает адрес, по которому открывать приложение,
вместе со способом представиться. Оракул: прогон с тестовым конфигом — сервис
слушает свой порт, названный адрес отвечает.
- Ctrl+C гасит процесс и не оставляет висящих. Оракул: `pgrep` по имени после
остановки — пусто.
- Владелец панели входит своим паролем, а первый запрос с именем из `USER`
заводит учётную запись. Оракул: вход по `auth-with-password` в коллекцию
владельцев и запрос к коллекции пользователей во временной базе.
- Каталог данных лежит во временном месте, а `data/` не тронут. Оракул: путь базы
из журнала подъёма и `git status` после прогона.
- `task gate` остаётся зелёным, скрипт проходит `shellcheck`, а образ не получает
@@ -57,6 +60,7 @@
## Рамки
Шаг локальный: наружу не ходит, боевых ключей не требует и в образ не попадает.
Идёт после `trusted-header-login` — до неё локальный вход устроен иначе.
Пароль владельца в конфиг **не заводится** — требование спеки `storage` «Пароль
владельца от панели не лежит в конфигурации» остаётся в силе, и работа его не
трогает. Распознавание при выдуманных ключах не работает — это остаётся как есть,