- две записи, ссылавшиеся на убранный oidc-login, переписаны - dev-run-task переведена с отдельного cmd/devadmin на подкоманду cmd/devtools
6.2 KiB
🧹 Поднимать сервис для локальной работы одной командой
- Тип: chore
- Категория: Очередь — оснастка локального прогона: без неё каждую проверку начинают с двух терминалов и ручной уборки
- Зачем: Локальная проверка требует ручной чистки каталога данных и остановки процесса, а владельца панели заводят по одноразовой ссылке из журнала.
Шаг task dev CONFIG=<путь> USER=<имя> поднимает сервис, кладёт данные во
временный каталог, заводит владельца панели и гасит процесс по Ctrl+C.
Работа состоит из двух частей, и они едут одним коммитом: инструмент
подкоманда cmd/devtools admin и шаг dev, который её зовёт. Порознь они не
нужны — шаг без
инструмента не заведёт владельца панели, инструмент без шага останется вызовом,
который никто не делает.
Заглушки провайдера здесь больше нет: вход переезжает на доверенные заголовки
задачей trusted-header-login, и обычная учётная запись заводится первым же
запросом с заголовком. Каким способом заголовок попадает в запрос на машине без
прокси, решает та задача; этот шаг её решение только зовёт.
Задуманное устройство:
- конфиг пишет человек и передаёт путём — шаг его не сочиняет;
- шаг подменяет каталог данных: кладёт копию переданного конфига во временный
каталог со своим
data_dir, чтобы прогон начинался с пустой базы независимо от того, что написано в конфиге. Временное живёт в/tmp— вdata/писать запрещено (CLAUDE.md, «Запреты»); - владельца панели заводит подкоманда
cmd/devtools admin. Пакет оснастки уже заведён задачейtrusted-header-loginи в образ не едет; своего пакета заводить не надо — решение владельца 2026-08-22: инструмент оснастки стоит четырёх мест, и платить их надо однажды. Базу подкоманда открывает тем жеpbrepo.New, что и сервис, и потому получает её со схемой целиком; зовётся до подъёма сервиса, на пустом каталоге. Пароль существующего владельца не переписывает; - обычная учётная запись заводится первым запросом с заголовком: имя берётся из
USER, и заводить её отдельно шагу не нужно; trapнаINTиTERMгасит процесс,waitдержит терминал.
Затрагивает
cmd/devtools— подкомандаadminрядом с готовойproxy: заводит владельца панели в базе;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 «Пароль
владельца от панели не лежит в конфигурации» остаётся в силе, и работа его не
трогает. Распознавание при выдуманных ключах не работает — это остаётся как есть,
шаг его не подменяет.