From 3bb85b85f687b1cc026c9249962f24b1fe0a7b19 Mon Sep 17 00:00:00 2001 From: Anton Vakhrushev Date: Sat, 22 Aug 2026 19:08:05 +0300 Subject: [PATCH] =?UTF-8?q?handlers=20=D1=80=D0=B5=D1=81=D1=82=D0=B0=D1=80?= =?UTF-8?q?=D1=82=D0=B0=20=D0=B4=D0=BB=D1=8F=20apprise,=20dashboard,=20tra?= =?UTF-8?q?nscriber,=20miniflux?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - правка bind-моунтнутого конфига раньше не подхватывалась до пересоздания контейнера; теперь template/secrets шлют notify на рестарт - miniflux: убран recreate: always, вместо него точечный рестарт miniflux_app по изменению файлов секретов, postgres больше не дёргается - goaccess: рестарт не нужен, build: always пересоздаёт контейнер по новому id образа — зафиксировано комментарием --- docs/backlog/handlers-remaining-apps.md | 30 ------------------------- playbook-apprise.yml | 12 ++++++++++ playbook-dashboard.yml | 12 ++++++++++ playbook-goaccess.yml | 3 +++ playbook-miniflux.yml | 20 ++++++++++++++++- playbook-transcriber.yml | 13 +++++++++++ 6 files changed, 59 insertions(+), 31 deletions(-) delete mode 100644 docs/backlog/handlers-remaining-apps.md diff --git a/docs/backlog/handlers-remaining-apps.md b/docs/backlog/handlers-remaining-apps.md deleted file mode 100644 index 8cc8507..0000000 --- a/docs/backlog/handlers-remaining-apps.md +++ /dev/null @@ -1,30 +0,0 @@ -# Handlers рестарта для оставшихся приложений - -**Приоритет:** средний - -Паттерн `handlers` + `notify` внедрён в caddyproxy, netdata, authelia, bifrost, -remembos (см. задачу `ansible-handlers-restart`, закрыта). Остались плейбуки, где -конфиг bind-моунтится в контейнер, но рестарта нет **вообще** — правка конфига без -изменения docker-compose.yml не подхватывается до следующего пересоздания -контейнера: - -- `playbook-apprise.yml` — `backups.cfg` → `config_dir:/config`. -- `playbook-dashboard.yml` — `config/*.yaml` → `config_dir:/app/config`. -- `playbook-transcriber.yml` — `config.toml` bind-моунтится **отдельным файлом** - (`{{ config_file }}:/config/config.toml:ro`). Худший случай: `template` - перезаписывает файл с новым inode, и контейнер продолжает видеть старый до - рестарта. -- `playbook-miniflux.yml` — файлы секретов роли `secrets` → `secrets_dir:/secrets:ro`, - читаются через `*_FILE` при старте. - -Заодно проверить `playbook-goaccess.yml`: конфиг там не монтируется, но -`Dockerfile`/`entrypoint.sh` меняются без изменения compose-файла — надо -убедиться, что `build: always` действительно пересоздаёт контейнер. - -Отдельный кандидат: caddy сейчас перезапускается целиком, хотя умеет -`caddy reload` — применение Caddyfile без разрыва соединений на реверс-прокси, -через который идёт весь трафик. В `playbook-caddyproxy.yml` для этого уже лежит -закомментированный блок с `docker_compose_v2_exec`. - -Связано: playbook-apprise.yml, playbook-dashboard.yml, playbook-transcriber.yml, -playbook-miniflux.yml, playbook-goaccess.yml, playbook-caddyproxy.yml. diff --git a/playbook-apprise.yml b/playbook-apprise.yml index c560d3c..ad4ab48 100644 --- a/playbook-apprise.yml +++ b/playbook-apprise.yml @@ -56,6 +56,7 @@ mode: "0640" # Файл содержит секреты из vault — без no_log их печатает --diff. no_log: true + notify: "Restart application" - name: "Copy docker compose file" ansible.builtin.template: @@ -72,3 +73,14 @@ remove_orphans: true tags: - run-app + + handlers: + # Приложение читает конфиги только при старте, а `state: present` не + # пересоздаёт контейнер, если docker-compose.yml не изменился, — поэтому + # правку конфига применяет только явный рестарт. + - name: "Restart application" + community.docker.docker_compose_v2: + project_src: "{{ base_dir }}" + state: "restarted" + tags: + - run-app diff --git a/playbook-dashboard.yml b/playbook-dashboard.yml index 3994b69..896917a 100644 --- a/playbook-dashboard.yml +++ b/playbook-dashboard.yml @@ -51,6 +51,7 @@ group: "{{ app_user }}" mode: "0640" loop: "{{ config_files }}" + notify: "Restart application" - name: "Copy docker compose file" ansible.builtin.template: @@ -68,3 +69,14 @@ pull: "always" tags: - run-app + + handlers: + # Приложение читает конфиги только при старте, а `state: present` не + # пересоздаёт контейнер, если docker-compose.yml не изменился, — поэтому + # правку конфига применяет только явный рестарт. + - name: "Restart application" + community.docker.docker_compose_v2: + project_src: "{{ base_dir }}" + state: "restarted" + tags: + - run-app diff --git a/playbook-goaccess.yml b/playbook-goaccess.yml index d3876aa..28a1cd8 100644 --- a/playbook-goaccess.yml +++ b/playbook-goaccess.yml @@ -83,6 +83,9 @@ - { name: "Dockerfile", mode: "0640" } - { name: "entrypoint.sh", mode: "0750" } + # Handler рестарта здесь не нужен: конфиг в контейнер не монтируется, а + # правку Dockerfile/entrypoint.sh применяет `build: always` — пересобранный + # образ получает новый id, и compose пересоздаёт по нему контейнер (проверено). - name: "Run application with docker compose" community.docker.docker_compose_v2: project_src: "{{ base_dir }}" diff --git a/playbook-miniflux.yml b/playbook-miniflux.yml index 0bb42f1..2997b2e 100644 --- a/playbook-miniflux.yml +++ b/playbook-miniflux.yml @@ -37,9 +37,13 @@ - "{{ postgres_data_dir }}" - "{{ postgres_backups_dir }}" + # notify на import_role наследуется всеми задачами роли: рестарт нужен, + # если изменился любой файл секретов — miniflux читает их через *_FILE + # только при старте. - name: "Copy secrets" ansible.builtin.import_role: name: secrets + notify: "Restart application" vars: secrets_dest: "{{ secrets_dir }}" secrets_user: "{{ app_user }}" @@ -72,7 +76,21 @@ community.docker.docker_compose_v2: project_src: "{{ base_dir }}" state: "present" - recreate: "always" remove_orphans: true tags: - run-app + + handlers: + # Приложение читает секреты только при старте, а `state: present` не + # пересоздаёт контейнер, если docker-compose.yml не изменился, — поэтому + # правку применяет только явный рестарт. + - name: "Restart application" + community.docker.docker_compose_v2: + project_src: "{{ base_dir }}" + # Только сам miniflux: базу дёргать незачем, пароль postgres читается + # из тех же секретов лишь при инициализации кластера. + services: + - "miniflux_app" + state: "restarted" + tags: + - run-app diff --git a/playbook-transcriber.yml b/playbook-transcriber.yml index 9e75c1b..3b45376 100644 --- a/playbook-transcriber.yml +++ b/playbook-transcriber.yml @@ -48,6 +48,7 @@ # Vault-файл: ansible расшифровывает его при копировании, и без no_log # --diff покажет содержимое открытым текстом. no_log: true + notify: "Restart application" - name: "Copy docker compose file" ansible.builtin.template: @@ -64,3 +65,15 @@ remove_orphans: true tags: - run-app + + handlers: + # Конфиг монтируется отдельным файлом, а `copy` подменяет его новым inode: + # запущенный контейнер продолжает видеть старый файл по старому inode. + # Bind-моунт переустанавливается при старте контейнера, поэтому применяет + # правку только явный рестарт. + - name: "Restart application" + community.docker.docker_compose_v2: + project_src: "{{ base_dir }}" + state: "restarted" + tags: + - run-app