точки входа переехали в cmd/, заведена заглушка OIDC для локального входа

- main.go и journal_route_test.go переехали в cmd/transcriber без правок
  содержимого; образ собирает ./cmd/transcriber поимённо
- cmd/oidcstub отвечает на /authorize, /token и /userinfo, проверок не делает
  и слушает петлевой адрес: войти без Authelia стало чем
- ступень сборки приложения переехала на node:24 с alpine — musl ждёт ответа
  на AAAA, которого нет, и npm ci висел вместо отказа
This commit is contained in:
av
2026-08-15 20:15:57 +03:00
parent 63a13404df
commit 91138dd39a
19 changed files with 335 additions and 25 deletions
+13 -2
View File
@@ -77,8 +77,8 @@
[pipeline](../openspec/specs/pipeline/spec.md), «Брошенная задача возвращается
в работу»; здесь это принцип письма шага, а не описание поведения.
- **Ядро зависит от интерфейсов.** `internal/service` знает только
`internal/contract`; ffmpeg, Yandex и хранилище подставляются в
`main.go`. Правило механизировано тестами-сканерами `internal/archrules`, и
`internal/contract`; ffmpeg, Yandex и хранилище подставляются в точке входа
`cmd/transcriber`. Правило механизировано тестами-сканерами `internal/archrules`, и
они же держат обратные направления: транспорты не знают друг о друге, адаптер
не знает ни ядра, ни транспортов.
*Изъятие:* транспорт **вправе** знать адаптер хранилища — `controller/http`
@@ -219,6 +219,17 @@
не попадает. Финальный слой — alpine с `ca-certificates` и `ffmpeg`, процесс
работает под непривилегированным пользователем `transcriber`.
Ступень бинарника собирает **одну** точку входа — `./cmd/transcriber`, а не весь
пакет: рядом в `cmd/` живёт `oidcstub`, подставной провайдер OIDC для локального
входа, и в образе ему делать нечего.
Ступень приложения стоит на образе с glibc, а не на alpine, и решает это не вес:
у musl запрос имени идёт `A` и `AAAA` разом и ждёт **оба** ответа, поэтому
DNS-сервер, молчащий на `AAAA`, оставляет установщика пакетов без адреса при
живом `A`. Установщик уходит в повторы с нарастающей паузой на каждом пакете, и
сборка не краснеет, а **висит** — исход хуже красного. Слои этой ступени в
рабочий слой не едут, поэтому её вес остаётся ценой одной сборки.
**По весу финальный образ от ступени приложения не растёт вовсе:** она отдаёт
следующей только собранное, а сама в рабочий слой не копируется. Вшитое
приложение прибавляет к бинарнику 86 072 байта. Время сборки образа не