- admin-owner-from-config закрыта: решение владельца 2026-08-15, ключ конфига не заводится, требование спеки storage остаётся в силе - dev-run-task вобрала cmd/devadmin и стоит первой строкой: инструмент и шаг порознь не нужны, поэтому едут одной задачей
5.4 KiB
🧹 Поднимать сервис и заглушку одной командой
- Тип: chore
- Категория: Очередь — оснастка локального прогона: без неё каждую проверку начинают с двух терминалов и ручной уборки
- Зачем: Локальная проверка требует двух терминалов, ручной остановки обоих процессов и чистки каталога данных; учётную запись заводят проходом по браузеру, а владельца панели — по одноразовой ссылке из журнала.
Шаг task dev CONFIG=<путь> USER=<почта> поднимает сервис и подставной
провайдер OIDC разом, кладёт данные во временный каталог, заводит учётные записи
и гасит оба процесса по Ctrl+C.
Работа состоит из двух частей, и они едут одним коммитом: инструмент
cmd/devadmin и шаг dev, который его зовёт. Порознь они не нужны — шаг без
инструмента не заведёт владельца панели, инструмент без шага останется вызовом,
который никто не делает.
Задуманное устройство:
- конфиг пишет человек и передаёт путём — шаг его не сочиняет;
- шаг подменяет каталог данных: кладёт копию переданного конфига во временный
каталог со своим
data_dir, чтобы прогон начинался с пустой базы независимо от того, что написано в конфиге. Временное живёт в/tmp— вdata/писать запрещено (CLAUDE.md, «Запреты»); - владельца панели заводит
cmd/devadmin— отдельный main-пакет рядом сcmd/oidcstub, в образ он не едет. Базу открывает тем жеpbrepo.New, что и сервис, и потому получает её со схемой целиком; зовётся до подъёма сервиса, на пустом каталоге. Пароль существующего владельца не переписывает; - шаг заводит обычную учётную запись входом: поднимает
cmd/oidcstubс-emailизUSER, сам проходит цепочку входа и тем создаёт запись; - оба процесса идут одной группой,
trapнаINTиTERMгасит их разом,waitдержит терминал.
Затрагивает
cmd/devadmin— новый main-пакет: заводит владельца панели в базе;Taskfile.yml— шагdevс переменнымиCONFIGиUSER;- скрипт запуска в
scripts/— он попадает под шагshellгейта; CLAUDE.md, раздел «Команды»;README.md, раздел про локальный запуск;Dockerfile— строка сборки называет точку входа поимённо, и новый пакет в образ попасть не должен.
Критерии приёмки
- Команда поднимает оба процесса и печатает адрес, по которому открывать приложение. Оракул: прогон с тестовым конфигом — сервис и заглушка слушают свои порты.
- Ctrl+C гасит обоих и не оставляет висящих процессов. Оракул:
pgrepпо обоим именам после остановки — пусто. - После запуска в базе есть учётная запись с переданной почтой, а владелец панели
входит своим паролем. Оракул: запрос к коллекции пользователей во временной базе
и вход по
auth-with-passwordв коллекцию владельцев. - Каталог данных лежит во временном месте, а
data/не тронут. Оракул: путь базы из журнала подъёма иgit statusпосле прогона. task gateостаётся зелёным, скрипт проходитshellcheck, а образ не получает нового пакета. Оракул: прогон гейта целиком иtask image.
Рамки
Шаг локальный: наружу не ходит, боевых ключей не требует и в образ не попадает.
Пароль владельца в конфиг не заводится — требование спеки storage «Пароль
владельца от панели не лежит в конфигурации» остаётся в силе, и работа его не
трогает. Распознавание при выдуманных ключах не работает — это остаётся как есть,
шаг его не подменяет.