feat: предупреждение о доменах caddy.conf, которые не указывают на сервер

app_deploy возвращает домены сайтов из caddy.conf (caddy adapt), App после
деплоя сверяет их A/AAAA с адресом сервера, бот предупреждает: сайт не
откроется, сертификат не выпустится. Со своим CA сверки нет.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
protokeyandClaude Opus 5.5 committed 2026-10-01 09:22:05 +04:00
1 parent 803a6bf9f2
commit adcfb48750
7 files changed
+118 -8

No files matched your search

+19
View File
@@ -2,6 +2,7 @@
#
# 1. Файлы распаковываются во временную папку, compose-файл, его порты (app_ports.py: не заняты ли на сервере)
# и caddy.conf (caddy validate на копии конфигурации с новым блоком) проверяются там: ошибка - приложение не тронуто.
# Домены сайтов из caddy.conf (caddy adapt) возвращаются в результате.
# 2. Папка приложения приводится к присланной копии по месту (app_sync.py), лишние файлы удаляются.
# 3. docker compose up -d --remove-orphans: compose сам пересоздает сервисы с изменившейся конфигурацией.
# Упал (например, образ не скачался) - файлы уже новые, отката нет.
@@ -75,6 +76,17 @@
changed_when: false
when: new_caddy_conf.stat.exists
# домены сайтов из блока: вызывающий проверит, что они указывают на сервер, иначе сертификат не выпустится
- name: Read caddy.conf domains
ansible.builtin.command: >-
docker compose exec -T caddy caddy adapt --adapter caddyfile
--config /etc/caddy/.check/sites/{{ (app + '.caddy') | quote }}
args:
chdir: "{{ apps_dir }}/caddy"
register: caddy_adapt
changed_when: false
when: new_caddy_conf.stat.exists
- name: Sync files
ansible.builtin.command: python3 {{ apps_dir }}/.serverus/app_sync.py {{ stage | quote }} {{ app_dir | quote }}
register: sync_out
@@ -102,6 +114,12 @@
ansible.builtin.set_fact:
sync: "{{ sync_out.stdout | from_json }}"
services: "{{ services_out.stdout_lines }}"
domains: >-
{{ [] if caddy_adapt is skipped else
((caddy_adapt.stdout | from_json).get('apps', {}).get('http', {}).get('servers', {}) | dict2items
| map(attribute='value') | selectattr('routes', 'defined') | map(attribute='routes') | flatten(levels=1)
| selectattr('match', 'defined') | map(attribute='match') | flatten(levels=1)
| selectattr('host', 'defined') | map(attribute='host') | flatten(levels=1) | unique | list) }}
# новое приложение: up только что создал все контейнеры с присланными настройками
recreate: >-
{{ [] if (sync_out.stdout | from_json).created else
@@ -181,3 +199,4 @@
removed: "{{ sync.removed }}"
recreated: "{{ recreate }}"
services: "{{ services }}"
domains: "{{ domains }}"