handlers рестарта для apprise, dashboard, transcriber, miniflux

- правка bind-моунтнутого конфига раньше не подхватывалась до пересоздания
  контейнера; теперь template/secrets шлют notify на рестарт
- miniflux: убран recreate: always, вместо него точечный рестарт miniflux_app
  по изменению файлов секретов, postgres больше не дёргается
- goaccess: рестарт не нужен, build: always пересоздаёт контейнер по новому
  id образа — зафиксировано комментарием
This commit is contained in:
av
2026-08-22 19:08:05 +03:00
parent 7e64d76d02
commit 3bb85b85f6
6 changed files with 59 additions and 31 deletions
-30
View File
@@ -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.
+12
View File
@@ -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
+12
View File
@@ -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
+3
View File
@@ -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 }}"
+19 -1
View File
@@ -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
+13
View File
@@ -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