docs: реестр убран из описаний, беклог отмечен по локальной сборке

- AGENTS.md: homepage/transcriber собираются ролью app_image, registry-плейбуков
  и vars/transcriber.images.yml больше нет
- local-image-build: закрыты шаги по homepage и transcriber, остался вынос
  yc_*-переменных из vault; добавлены замеры архивов
- container-hardening-nits: снят пункт про плавающий `:latest` у homepage
This commit is contained in:
av
2026-07-25 14:37:08 +03:00
parent fad0d78718
commit 1b2bc61cff
4 changed files with 23 additions and 22 deletions
+1 -1
View File
@@ -36,7 +36,7 @@ _(sec-ревью)_ — три независимых security-ревью на м
- [Уведомления о размере приложений и заполнении диска](disk-usage-alerts.md) — алерты на заполнение диска и аномальный рост data-томов; сервер ресурсно ограничен _(tududi)_
- [Handlers рестарта для оставшихся приложений](handlers-remaining-apps.md) — apprise/dashboard/transcriber/miniflux монтируют конфиг в контейнер, но рестарта нет вовсе; правка конфига не подхватывается
- [Composable-роль `backup`](ansible-backup-role.md) — бэкап — самый чистый шов для extraction (одинаков у всех, различается только список targets) _(ансибл-ревью)_
- [Локальная сборка образов вместо Yandex Container Registry](local-image-build.md) — homepage/transcriber/remembos тянут образы из cr.yandex, ради `docker login` в vault лежит OAuth-токен всего аккаунта; роль `app_image` уже обкатана в umbar
- [Локальная сборка образов вместо Yandex Container Registry](local-image-build.md) — все три приложения переведены на роль `app_image`; осталось вычистить `yc_*`-переменные из vault и прогнать деплой
- [Вывести из оборота секреты с широкими правами](narrow-secret-scopes.md) — один `yc_oauth_token` открывает весь аккаунт Yandex Cloud; после инцидента 24 июля цена утечки одной переменной должна быть ограничена одним сервисом
- [outline: секреты из файлов](secrets-file-outline.md) — умеет generic `<NAME>_FILE` для всех пяти секретов; единственное приложение, где выносится вообще всё, включая пароль БД
- [wakapi: секреты из файлов](secrets-file-wakapi.md) — salt, SMTP и OIDC выносятся либо через generic `_FILE`, либо через `config.yml`; для OIDC второй путь надёжнее из-за бага с `=` в значении
+3 -4
View File
@@ -9,10 +9,9 @@
`/root/.gramps`), rssbridge, dozzle, homepage и valkey/postgres-сайдкары gramps.
Дотянуть там, где образ позволяет (rssbridge, valkey) — продолжение уже принятой
в проекте практики.
- **homepage на `:latest`** (`vars/homepage.yml`) — плавающий тег + ночной `docker
image prune` может подтянуть другое содержимое без отката. Перевести на
иммутабельный `<sha>-<timestamp>` по образцу transcriber
(`vars/transcriber.images.yml`).
- ~~**homepage на `:latest`**~~ — **снято**: переход на роль `app_image`
([local-image-build](local-image-build.md)) дал каждому деплою уникальный тег
из `BUILD_ID`, плавающего `latest` больше нет ни у homepage, ни у остальных.
- **Соглашение о портах**: зафиксировать в AGENTS.md, что новые `ports:` — только
с `127.0.0.1:`. Docker публикует порты мимо UFW, поэтому дисциплина
localhost-биндинга — единственный контроль (сейчас соблюдается: apprise, wanderer).
+15 -12
View File
@@ -25,33 +25,36 @@ remembos. Схема одинаковая — образ собирается л
- ~~завендорить роль `app_image`~~ — **сделано**: подписка в `SYNCED_ROLES`,
копия в `roles/app_image`; механика переноса — [shared-roles-sync](shared-roles-sync.md)
- homepage: завести в Taskfile таск `image` с тегом из `$BUILD_ID`, перевести
- ~~homepage: завести в Taskfile таск `image` с тегом из `$BUILD_ID`, перевести
плейбук на роль, удалить `playbook-homepage-registry.yml` и registry-переменные
из `vars/homepage.yml`
из `vars/homepage.yml`~~ — **сделано**: таск `image` собирает node-образ, сайт
и nginx-образ одной командой; `task deploy`/`deploy-with-ansible` удалены,
деплой целиком — `inv pl -- homepage`
- ~~remembos: контракта сборки нет (есть Dockerfile, нет Taskfile) — завести таск
`image`, убрать зашитый тег из compose~~ — **сделано**: в репозитории remembos
появился `Taskfile.yml` с таском `image`, плейбук зовёт роль, compose тянет
`remembos:{{ app_image_tag }}` с `pull_policy: never`; `docker_login` из
плейбука убран
- transcriber: исходников на этой машине нет — до начала решить, живой ли сервис
и откуда его собирать; иначе он останется единственным держателем registry и
токен из оборота не выйдет
- убрать `docker_login`-таски и registry-переменные из vault — дальше по
[narrow-secret-scopes](narrow-secret-scopes.md)
- ~~transcriber: исходников на этой машине нет~~**сделано**: репозиторий
нашёлся (`~/projects/private/transcriber`), Taskfile сведён к таску `image`,
плейбук переведён на роль; `vars/transcriber.images.yml` с зашитым тегом
удалён вместе с ритуалом «yq + коммит тега» из старого `task deploy`
- осталось: убрать `yc_oauth_token` и `yc_container_registry` из vault — на них
больше никто не ссылается; дальше по [narrow-secret-scopes](narrow-secret-scopes.md)
Готово, когда ни один плейбук не делает `docker_login`, `cr.yandex` не
встречается в репозитории, а все три приложения деплоятся одним
`inv pl -- <app>`.
`inv pl -- <app>`. Осталось только вычистить vault и прогнать деплой каждого
приложения.
Цена размена: дедупликации по слоям больше нет — каждый деплой везёт полный
образ, и для сборки нужен локальный docker с тулчейном. Для ручного нечастого
деплоя это осознанный выбор (так решено в самой роли), но у transcriber образ
может оказаться крупным — это стоит проверить до перевода.
деплоя это осознанный выбор (так решено в самой роли). Замеры архивов
(`docker save`): homepage — 61 МБ, transcriber — 73 МБ, remembos — 21 МБ.
Пересекается с [gitea-runner-on-demand](gitea-runner-on-demand.md): если сборки
уедут в CI, доставка образа на сервер снова становится отдельным вопросом.
Связано: playbook-homepage.yml, playbook-transcriber.yml, playbook-remembos.yml,
playbook-homepage-registry.yml, playbook-transcriber-registry.yml,
vars/homepage.yml, vars/transcriber.yml, vars/transcriber.images.yml,
vars/homepage.yml, vars/transcriber.yml, roles/app_image,
files/{homepage,transcriber,remembos}/docker-compose.template.yml.