fix(caddy): смонтировать сниппеты метрик — без них Caddy валит ВЕСЬ прод #3103

Merged
lekss361 merged 1 commit from fix/caddy-metrics-snippet-mounts into main 2026-08-26 09:04:07 +00:00
Owner

Инцидент

Прод лежит с ~11:26 MSK 2026-08-26. Caddy в restart-loop:

Error: adapting config using caddyfile: File to import not found:
../metrics-ingest.caddy.snippet, at /etc/caddy/caddy/sites/infra.caddy:87
import chain ['/etc/caddy/Caddyfile:51 (import)']

Снаружи это выглядит как Empty reply from server на :80 и провал TLS-handshake на :443 для всех хостов машины — gendsgn.ru, merahome.ru, meraocenka.ru, meraotsenka.ru — а не только metrics.gendsgn.ru.

Причина

PR #3102 добавил caddy/metrics-ingest.caddy.snippet + caddy/metrics-ui.caddy.snippet и импорты в caddy/sites/infra.caddy, но не добавил bind-монты в docker-compose.prod.yml.

Каталог caddy/ внутрь контейнера целиком не пробрасывается — только пофайлово (users.caddy.snippet) плюс каталоги caddy/local и caddy/sites. Файлы приехали на хост в /opt/gendesign/caddy/, но внутри контейнера их нет → импорт не резолвится → конфиг не адаптируется → Caddy падает и перезапускается по кругу.

Радиус поражения непропорционален: один нерезолвящийся импорт роняет весь конфиг, а значит все сайты хоста.

Фикс

Явные монты обоих сниппетов рядом с users.caddy.snippet, с комментарием почему это легко забыть.

Хотфикс тем же диффом уже применялся на бою вручную и поднимал Caddy — но его снесло очередным git reset --hard origin/main в деплое, поэтому фикс обязан приехать через main.

Проверка

После мёрджа — дождаться деплоя и проверить, что gendesign-caddy-1 в Up, а не Restarting.

Follow-up (отдельным PR)

CI-гард scripts/check-caddy-snippet-mounts.py: сверять import-пути в Caddyfile/caddy/sites/* с volume-монтами секции caddy: — чтобы такой пропуск ловился на CI, а не на проде.

Отдельно, не в этом PR: metrics.gendsgn.ru в DNS всё ещё указывает на старый хост 46.173.16.127, из-за чего ACME-челлендж для него не проходит.

## Инцидент Прод лежит с ~11:26 MSK 2026-08-26. Caddy в restart-loop: ``` Error: adapting config using caddyfile: File to import not found: ../metrics-ingest.caddy.snippet, at /etc/caddy/caddy/sites/infra.caddy:87 import chain ['/etc/caddy/Caddyfile:51 (import)'] ``` Снаружи это выглядит как `Empty reply from server` на :80 и провал TLS-handshake на :443 для **всех** хостов машины — gendsgn.ru, merahome.ru, meraocenka.ru, meraotsenka.ru — а не только metrics.gendsgn.ru. ## Причина PR #3102 добавил `caddy/metrics-ingest.caddy.snippet` + `caddy/metrics-ui.caddy.snippet` и импорты в `caddy/sites/infra.caddy`, но не добавил bind-монты в `docker-compose.prod.yml`. Каталог `caddy/` внутрь контейнера **целиком не пробрасывается** — только пофайлово (`users.caddy.snippet`) плюс каталоги `caddy/local` и `caddy/sites`. Файлы приехали на хост в `/opt/gendesign/caddy/`, но внутри контейнера их нет → импорт не резолвится → конфиг не адаптируется → Caddy падает и перезапускается по кругу. Радиус поражения непропорционален: один нерезолвящийся импорт роняет весь конфиг, а значит все сайты хоста. ## Фикс Явные монты обоих сниппетов рядом с `users.caddy.snippet`, с комментарием почему это легко забыть. Хотфикс тем же диффом уже применялся на бою вручную и поднимал Caddy — но его снесло очередным `git reset --hard origin/main` в деплое, поэтому фикс обязан приехать через main. ## Проверка После мёрджа — дождаться деплоя и проверить, что `gendesign-caddy-1` в `Up`, а не `Restarting`. ## Follow-up (отдельным PR) CI-гард `scripts/check-caddy-snippet-mounts.py`: сверять `import`-пути в Caddyfile/`caddy/sites/*` с volume-монтами секции `caddy:` — чтобы такой пропуск ловился на CI, а не на проде. Отдельно, не в этом PR: `metrics.gendsgn.ru` в DNS всё ещё указывает на старый хост `46.173.16.127`, из-за чего ACME-челлендж для него не проходит.
lekss361 added 1 commit 2026-08-26 09:03:54 +00:00
fix(caddy): смонтировать сниппеты метрик — без них Caddy валит ВЕСЬ прод
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI / changes (pull_request) Successful in 9s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
6f9a77f6db
PR #3102 добавил caddy/metrics-ingest.caddy.snippet и metrics-ui.caddy.snippet
плюс `import ../metrics-*.caddy.snippet` в caddy/sites/infra.caddy, но не
добавил bind-монты в docker-compose.prod.yml. Каталог caddy/ внутрь контейнера
целиком не пробрасывается — только пофайлово (как users.caddy.snippet) плюс
каталоги caddy/local и caddy/sites. Файлы лежали на хосте, но внутри
контейнера их не было.

Итог на проде 2026-08-26 ~11:26 MSK: Caddy не смог адаптировать конфиг
(`File to import not found: ../metrics-ingest.caddy.snippet, at
/etc/caddy/caddy/sites/infra.caddy:87`) и ушёл в restart-loop. Легли ВСЕ
сайты хоста — gendsgn.ru, merahome.ru, обе mera-витрины, а не только
metrics.gendsgn.ru, ради которого сниппет и добавляли.

Монтируем оба файла явно, рядом с users.caddy.snippet.
lekss361 merged commit 41f5be2136 into main 2026-08-26 09:04:07 +00:00
lekss361 deleted branch fix/caddy-metrics-snippet-mounts 2026-08-26 09:04:07 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#3103
No description provided.