- валидация аргументов через assert вместо пары fail с одинаковым именем
- with_items/with_dict заменены на loop, имена задач без точки на конце
- добавлены meta/main.yml и README с таблицей переменных
- задача ansible-owner-role-cleanup удалена из беклога
- сниппет access_log переименован в common, туда добавлен заголовок
Strict-Transport-Security на год; без includeSubDomains — под
vakhrushev.me есть имена не с этого сервера
- у edge-контейнера убрана capability NET_ADMIN, reverse-proxy её не требует
- убран leftover-листенер :29999 у status.vakhrushev.me
- задача caddy-hardening-nits удалена из беклога
- вместо рестарта всего прокси, через который идёт весь трафик; конфиг
указан явно через --config, иначе caddy молча перезагружает не тот файл
- задача handlers-remaining-apps удалена из беклога
- правка bind-моунтнутого конфига раньше не подхватывалась до пересоздания
контейнера; теперь template/secrets шлют notify на рестарт
- miniflux: убран recreate: always, вместо него точечный рестарт miniflux_app
по изменению файлов секретов, postgres больше не дёргается
- goaccess: рестарт не нужен, build: always пересоздаёт контейнер по новому
id образа — зафиксировано комментарием
- `admin :2019` слушал всю web_proxy_network: любой контейнер мог POST-ом в
/config/ переписать маршрутизацию и снять forward_auth. Теперь
`admin localhost:2019`.
- Метрики для netdata отдаёт отдельный site-блок `http://:2020 { metrics
/metrics }`, netdata скрейпит новый порт.
- Порт для метрик именно 2020, а не 2019, как предлагала задача: сайт на :2019
перехватывает IPv6-петлю (admin висит только на IPv4), из-за чего
`caddy reload` внутри контейнера возвращает 0 и молча ничего не применяет —
проверено на caddy:2.11.4.
- debug-логи содержат детали аутентификации, имена пользователей и внутренности
OIDC-потоков — в обычной эксплуатации не нужны, а через docker logs/dozzle это
лишняя поверхность утечки.
- Задача убрана из беклога.
- METRICS_ALLOWED_NETWORKS не помогает: за прокси Miniflux видит IP Caddy,
а netdata скрейпит по той же web_proxy_network — по IP их не различить
- задача убрана из беклога
- имя отражает единственный источник уведомлений — скрипт бэкапа;
плейбук удаляет с сервера прежний server.cfg, иначе он остался бы
рабочим конфигом со старыми секретами
- канал tgram:// удалён, уведомления идут на почту и в matrix
- все три приложения (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 инвентаря теперь имеют приоритет над общими переменными