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

5.9 KiB
Raw Blame History

🧹 Поднимать сервис для локальной работы одной командой

  • Тип: 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 «Пароль владельца от панели не лежит в конфигурации» остаётся в силе, и работа его не трогает. Распознавание при выдуманных ключах не работает — это остаётся как есть, шаг его не подменяет.