diff --git a/docs/backlog/README.md b/docs/backlog/README.md index 113d03f..6a3a292 100644 --- a/docs/backlog/README.md +++ b/docs/backlog/README.md @@ -29,7 +29,6 @@ _(sec-ревью)_ — три независимых security-ревью на м - [Включить автообновления безопасности](security-autoupdates.md) — патчи openssh/libssl только вручную; окна в недели между CVE и фиксом _(sec-ревью)_ - [Запретить SSH-вход под root](ssh-disable-root-login.md) — `PermitRootLogin yes` пускает root по ключу; наименьшие привилегии + defense-in-depth (пароль уже off) _(sec-ревью)_ - [Gitea runner on-demand в Yandex Cloud](gitea-runner-on-demand.md) — раннер активен только во время сборки; webhook→Cloud Function стартует ВМ, probe/decide гасят по idle; экономия ~95% -- [Синхронизация общих Ansible-ролей между репозиториями](shared-roles-sync.md) — `owner`/`eget`/`secrets` дублируются между репозиториями и дрейфуют; канон в ansible-shared + rsync-таски invoke - [Composable-роль `backup`](ansible-backup-role.md) — бэкап — самый чистый шов для extraction (одинаков у всех, различается только список targets) _(ансибл-ревью)_ - [Вывести из оборота секреты с широкими правами](narrow-secret-scopes.md) — `yc_oauth_token` (весь аккаунт Yandex Cloud) уже выведен; осталось проставить радиус остальным переменным vault и сузить широкие - [outline: секреты из файлов](secrets-file-outline.md) — умеет generic `_FILE` для всех пяти секретов; единственное приложение, где выносится вообще всё, включая пароль БД diff --git a/docs/backlog/shared-roles-sync.md b/docs/backlog/shared-roles-sync.md deleted file mode 100644 index aaf7071..0000000 --- a/docs/backlog/shared-roles-sync.md +++ /dev/null @@ -1,21 +0,0 @@ -# Синхронизация общих Ansible-ролей между репозиториями - -**Приоритет:** средний - -Серверы управляются изолированными репозиториями (pet-project-server, buckland, -далее — торрент-бокс). Кастомные роли (`owner`, `eget`, `secrets`) концептуально -общие, но физически продублированы и дрейфуют (`owner` в buckland стал мёртвым -кодом). Решение под pets-подход: канон ролей в `~/projects/private/ansible-shared/`, -каждый репозиторий держит закоммиченную копию (она же «пин версии») и -синхронизируется через rsync-таски invoke — `roles-pull` / `roles-push` / -`roles-status`. Подписка на роли явная и пер-серверная (`SYNCED_ROLES` в -`tasks.py`). Обновление роли на сервере — осознанный коммит с читаемым диффом, не -скрытый сайд-эффект. Предохранитель от дрейфа — предупреждение в lefthook. -Отвергнуты: общий `roles_path`, симлинки, submodule/subtree, galaxy-из-git, -монорепо (все ломают самодостаточность или вводят лишнюю петлю). - -Подход обсуждён, реализация не начата. Полный дизайн + план внедрения: -[docs/drafts/shared-roles-sync.md](../drafts/shared-roles-sync.md). - -Связано: roles/owner, roles/eget, roles/secrets, tasks.py, lefthook.yml, -project_isolated_repos_shared_roles, project_shared_invoke_command_surface. diff --git a/docs/drafts/shared-roles-sync.md b/docs/drafts/shared-roles-sync.md index 479271c..9a30163 100644 --- a/docs/drafts/shared-roles-sync.md +++ b/docs/drafts/shared-roles-sync.md @@ -2,7 +2,19 @@ ## Статус -Черновик. Подход обсуждён, реализация не начата. +Реализовано. Канон живёт в `~/projects/private/ansible-roles/` (репозиторий +с git-историей), таски `roles-status` / `roles-pull` / `roles-push` есть в +`tasks.py`. Отличия от первоначального дизайна: + +- канон называется `ansible-roles`, а не `ansible-shared`, и сразу заведён + как git-репозиторий; +- подписка pet-project-server — `SYNCED_ROLES = ["eget", "app_image"]`: + `app_image` появился уже после дизайна и писался сразу общим, а `owner` и + `secrets` пока остаются локальными копиями и подписываются по мере надобности; +- предупреждения о дрейфе в lefthook нет — расхождение ловится ручным + `inv roles-status`. + +Ниже — исходный дизайн; текст оставлен как спека подхода. ## Контекст @@ -197,12 +209,12 @@ galaxy-источника: повесить теги, перевести реп ## План внедрения -1. Создать `~/projects/private/ansible-shared/roles/` из актуальных - ролей pet-project-server (`owner`, `eget`, `secrets`). -2. Добавить задачи `roles-pull` / `roles-push` / `roles-status` в - `tasks.py` pet-project-server; объявить подписку на все три роли. -3. То же в buckland; подписка только на `eget` (его копия сначала - выравнивается через `roles-pull` — дифф косметический, стиль - кавычек). Мёртвую `roles/owner` удалить. -4. Предупреждение о дрейфе в lefthook обоих репозиториев. -5. Новый сервер с самого начала строится на подписке. +1. ~~Создать канон из актуальных ролей pet-project-server.~~ Сделано: + `~/projects/private/ansible-roles/roles/` с `eget` и `app_image`. +2. ~~Добавить задачи `roles-pull` / `roles-push` / `roles-status` в + `tasks.py` pet-project-server.~~ Сделано; подписка — `eget`, `app_image`. +3. То же в buckland; мёртвую `roles/owner` удалить. +4. Подписать `owner` и `secrets`, когда их копии реально разойдутся. +5. Предупреждение о дрейфе в lefthook — не сделано, пока хватает + ручного `inv roles-status`. +6. Новый сервер с самого начала строится на подписке.