Files
pet-project-server/docs/backlog/local-image-build.md
T
av 5dc199f3ce remembos: деплой через локальную сборку образа вместо Yandex Registry
- плейбук зовёт роль app_image, docker_login в cr.yandex удалён
- compose тянет `{{ app_name }}:{{ app_image_tag }}` с pull_policy: never
  вместо зашитого тега из реестра
2026-07-25 14:06:30 +03:00

58 lines
4.3 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`~~ — **сделано**: подписка в `SYNCED_ROLES`,
копия в `roles/app_image`; механика переноса — [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~~ — **сделано**: в репозитории 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)
Готово, когда ни один плейбук не делает `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.