Files
transcriber/tasks/items/dev-run-task.md
T
av e4441f3c49 tasks: вход переезжает на заголовки прокси, пять задач про OIDC закрыты
- заведена `trusted-header-login` и поставлена в голову очереди
- пять задач про механику OIDC закрыты как отменённые ею
- `dev-run-task` и `api-tokens` переписаны под новый вход
2026-08-22 17:43:18 +03:00

68 lines
5.9 KiB
Markdown
Raw 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.
# 🧹 Поднимать сервис для локальной работы одной командой
- **Тип:** chore
- **Категория:** Очередь — оснастка локального прогона: без неё каждую проверку начинают с двух терминалов и ручной уборки
- **Зачем:** Локальная проверка требует ручной чистки каталога данных и остановки процесса, а владельца панели заводят по одноразовой ссылке из журнала.
Шаг `task dev CONFIG=<путь> USER=<имя>` поднимает сервис, кладёт данные во
временный каталог, заводит владельца панели и гасит процесс по Ctrl+C.
Работа состоит из двух частей, и они едут одним коммитом: инструмент
`cmd/devadmin` и шаг `dev`, который его зовёт. Порознь они не нужны — шаг без
инструмента не заведёт владельца панели, инструмент без шага останется вызовом,
который никто не делает.
Заглушки провайдера здесь больше нет: вход переезжает на доверенные заголовки
задачей `trusted-header-login`, и обычная учётная запись заводится первым же
запросом с заголовком. Каким способом заголовок попадает в запрос на машине без
прокси, решает та задача; этот шаг её решение только зовёт.
Задуманное устройство:
- конфиг пишет человек и передаёт путём — шаг его не сочиняет;
- шаг подменяет каталог данных: кладёт копию переданного конфига во временный
каталог со своим `data_dir`, чтобы прогон начинался с пустой базы независимо от
того, что написано в конфиге. Временное живёт в `/tmp` — в `data/` писать
запрещено (CLAUDE.md, «Запреты»);
- владельца панели заводит `cmd/devadmin` — отдельный main-пакет рядом с
`cmd/transcriber`, в образ он не едет. Базу открывает тем же `pbrepo.New`, что и
сервис, и потому получает её со схемой целиком; зовётся до подъёма сервиса, на
пустом каталоге. Пароль существующего владельца не переписывает;
- обычная учётная запись заводится первым запросом с заголовком: имя берётся из
`USER`, и заводить её отдельно шагу не нужно;
- `trap` на `INT` и `TERM` гасит процесс, `wait` держит терминал.
## Затрагивает
- `cmd/devadmin` — новый main-пакет: заводит владельца панели в базе;
- `Taskfile.yml` — шаг `dev` с переменными `CONFIG` и `USER`;
- скрипт запуска в `scripts/` — он попадает под шаг `shell` гейта;
- `CLAUDE.md`, раздел «Команды»;
- `README.md`, раздел про локальный запуск;
- `Dockerfile` — строка сборки называет точку входа поимённо, и новый пакет в
образ попасть не должен.
## Критерии приёмки
- Команда поднимает сервис и печатает адрес, по которому открывать приложение,
вместе со способом представиться. Оракул: прогон с тестовым конфигом — сервис
слушает свой порт, названный адрес отвечает.
- Ctrl+C гасит процесс и не оставляет висящих. Оракул: `pgrep` по имени после
остановки — пусто.
- Владелец панели входит своим паролем, а первый запрос с именем из `USER`
заводит учётную запись. Оракул: вход по `auth-with-password` в коллекцию
владельцев и запрос к коллекции пользователей во временной базе.
- Каталог данных лежит во временном месте, а `data/` не тронут. Оракул: путь базы
из журнала подъёма и `git status` после прогона.
- `task gate` остаётся зелёным, скрипт проходит `shellcheck`, а образ не получает
нового пакета. Оракул: прогон гейта целиком и `task image`.
## Рамки
Шаг локальный: наружу не ходит, боевых ключей не требует и в образ не попадает.
Идёт после `trusted-header-login` — до неё локальный вход устроен иначе.
Пароль владельца в конфиг **не заводится** — требование спеки `storage` «Пароль
владельца от панели не лежит в конфигурации» остаётся в силе, и работа его не
трогает. Распознавание при выдуманных ключах не работает — это остаётся как есть,
шаг его не подменяет.