Files
pet-project-server/docs/backlog/local-image-build.md
T
av 0e7300ed0e backlog: добавлены задачи про локальную сборку образов и права секретов
- Уход от Yandex Container Registry на роль `app_image`: homepage,
  transcriber, remembos собираются локально и едут через docker save/load.
- Сужение прав секретов: `yc_oauth_token` открывает весь аккаунт ради
  одного `docker login` — вторая задача зависит от первой.
2026-07-25 11:54:31 +03:00

55 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Локальная сборка образов вместо Yandex Container Registry
**Приоритет:** Средний
Три приложения деплоятся через Yandex Container Registry: homepage, transcriber,
remembos. Схема одинаковая — образ собирается локально и пушится в
`cr.yandex/...` (`playbook-homepage-registry.yml`,
`playbook-transcriber-registry.yml`), плейбук деплоя делает `docker_login` с
`yc_oauth_token`, compose тянет образ по registry-пути с зашитым в git тегом
(`transcriber:2fc5a56-1761210134`, `remembos:v0.2.0`, `homepage-nginx:latest`).
У remembos registry-плейбука нет вовсе — образ пушится руками.
Роль `app_image` (канон в `~/projects/private/ansible-roles`) делает то же самое
без registry: собирает образ на control-хосте командой самого приложения
(контракт — `task image`, получает `BUILD_ID` через окружение), везёт его на
сервер через `docker save`/`load` и отдаёт факт `app_image_tag` для compose.
Обкатана в umbar на jellybit и trackers.
Что станет иначе: из деплоя уходят внешний реестр и OAuth-токен, тег образа
перестаёт быть константой в git, а `inv pl -- homepage` становится полным
деплоем — сейчас сборка живёт в `task deploy` репозитория homepage, который сам
зовёт `ansible-playbook`.
Шаги:
- завендорить роль `app_image` — в `roles/` сейчас только `owner`, `eget`,
`secrets`; механика переноса — [shared-roles-sync](shared-roles-sync.md)
- homepage: завести в Taskfile таск `image` с тегом из `$BUILD_ID`, перевести
плейбук на роль, удалить `playbook-homepage-registry.yml` и registry-переменные
из `vars/homepage.yml`
- remembos: контракта сборки нет (есть Dockerfile, нет Taskfile) — завести таск
`image`, убрать зашитый тег из compose
- transcriber: исходников на этой машине нет — до начала решить, живой ли сервис
и откуда его собирать; иначе он останется единственным держателем registry и
токен из оборота не выйдет
- убрать `docker_login`-таски и registry-переменные из vault — дальше по
[narrow-secret-scopes](narrow-secret-scopes.md)
Готово, когда ни один плейбук не делает `docker_login`, `cr.yandex` не
встречается в репозитории, а все три приложения деплоятся одним
`inv pl -- <app>`.
Цена размена: дедупликации по слоям больше нет — каждый деплой везёт полный
образ, и для сборки нужен локальный docker с тулчейном. Для ручного нечастого
деплоя это осознанный выбор (так решено в самой роли), но у transcriber образ
может оказаться крупным — это стоит проверить до перевода.
Пересекается с [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,
files/{homepage,transcriber,remembos}/docker-compose.template.yml.