- json-api-for-spa: адреса приложения уехали в своё пространство /app/, приём стал POST /app/audiorecords, опрос /api/status/:id убран, заведены список, карточка, текст, /app/me и /app/config; имя файла отправителя легло своей колонкой рядом с заголовком - три действия над записью — правка заголовка, возврат в работу и журнал событий — собраны задачей audiorecord-actions - голова очереди: контракт, каркас, экран загрузки, список, действия - в прежних задачах поправлены адреса, рубежи конвейера и остатки Telegram
4.8 KiB
✨ Собрать каркас приложения и раздать его из бинарника
- Тип: feature
- Категория: Очередь — Каркас идёт сразу за контрактом: на нём стоят все экраны, а сам он ждёт готовой формы ответов
- Зачем: Экранов нет и собирать их нечем: ни сборки фронтенда, ни раздачи статики в проекте не существует.
Каркас готовит экраны — загрузку, рубеж записи, чтение текста и список, — но сам по себе пользователю ничего не даёт. Видимое от него одно: приложение открывается и достаёт данные с живого сервера, а не отдаёт пустую страницу.
Фреймворк выбран 2026-08-11 — Vue 3 с роутером пятой версии и сборкой Vite (ADR); правила кода приложения лежат в conventions/web-ui.md.
Затрагивает
- новый каталог фронтенда: исходники, зависимости, конфигурация сборки;
- роут, отдающий
index.htmlна неизвестный путь вне корней сервиса —/api/у хранилища,/app/у приложения,/auth/у входа,/_/у панели, плюс/healthи/metrics: адреса маршрутов обычные, а не после решётки; Taskfile.yml— шаг сборки статики и его место вtask gateиtask image;Dockerfile— сборка статики внутри образа, чтобы выкладка не зависела от машины разработчика;- раздача статики из бинарника через
go:embedи роут под неё; .gitignore— каталог зависимостей и собранная статика;docs/conventions/web-ui.md— переписывается под выбранный фреймворк;docs/architecture.md— новый компонент и новая внешняя зависимость сборки.
Критерии приёмки
- Статика собирается одной командой и вшивается в бинарник: запущенный бинарник отдаёт приложение без каталога рядом. Оракул — сборка, запуск бинарника из пустого каталога, запрос корня возвращает разметку приложения.
- Образ собирается на чистой машине без предустановленного окружения фронтенда.
Оракул —
task imageбез локально установленных зависимостей фронтенда. - Приложение показывает, кто вошёл, и обращается к API живого сервера. Оракул — тест либо ручная проверка на запущенном сервере с сессией.
- Шаг сборки статики входит в
task gateи краснеет при ошибке сборки. Оракул — намеренно сломанный исходник роняетtask gate. - Обновление страницы на любом маршруте приложения открывает тот же экран, а
адрес внутри корня сервиса в приложение не проваливается. Оракул — тест на три
запроса: неизвестный путь вне корней отдаёт разметку, неизвестный путь внутри
/api/и внутри/app/отдаёт ошибку контракта.
Рамки
Экранов, кроме заглушки с именем вошедшего, не делаем — это upload-and-status-screen
и records-list-screen. Установку на телефон не делаем — это installable-pwa.
Готовый набор компонентов не берём: он не выбран, а способен удвоить собранный
файл.
Шаг сборки входит в гейт и в образ решением ADR 2026-08-11 — заново это решение не принимается. Во что слой Node обходится образу по времени и по весу, не замерялось: замер делает эта задача.