- все три приложения (homepage, transcriber, remembos) собирают образы
локально ролью app_image, реестр и yc_*-переменные выведены из оборота
- ссылавшиеся задачи обновлены: narrow-secret-scopes и
no-secrets-in-playbook-output больше не ждут эту работу
- AGENTS.md: homepage/transcriber собираются ролью app_image, registry-плейбуков
и vars/transcriber.images.yml больше нет
- local-image-build: закрыты шаги по homepage и transcriber, остался вынос
yc_*-переменных из vault; добавлены замеры архивов
- container-hardening-nits: снят пункт про плавающий `:latest` у homepage
- плейбук зовёт роль app_image, docker_login в cr.yandex удалён
- compose тянет `{{ app_name }}:{{ app_image_tag }}` с pull_policy: never
вместо зашитого тега из реестра
- docs/conventions/ с индексом: чем конвенция отличается от ADR и drafts,
статусы (рекомендуемая / обязательная), когда заводить
- app-directories.md: конфигурация / данные / кеш по принципу создания и
ценности; из категорий выводится backup-targets
- раздел «Конвенции» в AGENTS.md со ссылкой на склад
- Первый шаг задачи закрыт коммитом b7b1f49; остались вынос секретов
в файлы и проверка от дрейфа.
- Записано исключение: compose miniflux оставлен без no_log, из vault он
тянет только имя пользователя и имя базы.
- Шесть задач `secrets-file-*` вместо одной: outline, wakapi, authelia,
gramps (средний), gitea, tududi (низкий, выигрыш частичный). Wanderer
отпал — файловых секретов не умеет ни meilisearch, ни pocketbase.
- Матрица механизмов со ссылками на код уехала в
docs/drafts/secrets-file-support.md, родитель — на кладбище.
- Проверено по исходникам закреплённых версий: outline, wakapi, gitea,
gramps и authelia умеют брать секреты из файла, tududi и wanderer — нет.
- Отмечено, что `secrets-env-to-file` переросла в эпик: разбивать по
приложениям отдельным заходом.
- `inv pl` идёт с `--diff`, и 14 задач в 12 плейбуках печатают отрендеренные
секреты в терминал; `no_log` есть только в `roles/secrets`. Инвентарь,
рычаги (`no_log`, `diff: false`, вынос в отдельный файл) и порядок — в задаче.
- Актуализирована `secrets-env-to-file`: список приложений сверен с шаблонами
(tuwunel чистый, у gitea только SMTP), добавлен мотив с диффом.
- Уход от Yandex Container Registry на роль `app_image`: homepage,
transcriber, remembos собираются локально и едут через docker save/load.
- Сужение прав секретов: `yc_oauth_token` открывает весь аккаунт ради
одного `docker login` — вторая задача зависит от первой.
- Пароль лежит открытым текстом рядом с репозиторием, а `ansible.cfg`
подставляет его в любую ansible-команду — отсюда дамп секретов
через `ansible-inventory --list`.
- Заведена идеей, а не задачей: компромисс «удобство против доступности
автоматизации агенту» не разрешён, варианты с KeePassXC записаны с ценой.
- backup-targets собирается одной copy вместо lineinfile в цикле: теперь
удаление цели из списка реально убирает строку из файла (7 плейбуков)
- netdata: getent вместо grep по /etc/group, ушёл бессмысленный changed_when
и мёртвый фолбэк PGID
- исправлены копипастные имена play в wanderer и remove-user-and-app
- production.yml переписан на живой Timeweb-хост, timeweb.yml удалён,
HOSTS_FILE в tasks.py и примеры в README поправлены
- host-vars application_dir и mount_external_storage не перенесены: это
наследие YC-диска, а после переезда в group_vars инвентарь их перебивает
- ansible.cfg: inventory по умолчанию, чтобы забытый -i не уводил в никуда
- caddyproxy, netdata, authelia, bifrost, remembos: конфиг-задачи нотифаят
handler "Restart application" вместо безусловного или условного рестарта
- ansible.cfg: force_handlers, иначе упавший прогон теряет notify и рестарт,
применяющий правку конфига, не случится уже никогда
- authelia рестартит только authelia_app, чтобы не сбрасывать сессии в redis
- vars/vars.yml → group_vars/all/main.yml, vars/secrets.yml →
group_vars/all/secrets.yml; boilerplate vars_files убран из всех плейбуков
- имя secrets.yml сохранено намеренно: pre-commit-хук и .crushignore ищут
слово secret(s) в имени файла
- host_vars инвентаря теперь имеют приоритет над общими переменными