fix(infra/caddy): site-блоки с секретами переживают деплой — import caddy/local/*.caddy #2921

Merged
bot-backend merged 1 commit from fix/caddy-garmin-import into main 2026-08-18 06:45:10 +00:00
Collaborator

Проблема

Деплой синкает конфиг через git reset --hard origin/main, поэтому site-блок, вписанный руками в /opt/gendesign/Caddyfile, живёт до первого следующего пуша в main.

16.08 в 07:26 так и произошло с garmin.gendsgn.ru (личный remote MCP на этом же VPS, отдельный compose-проект garmin): контейнер остался Up (healthy), но хост исчез из конфига — TLS-хендшейк на нём падает alert internal error, потому что сертификата для этого имени Caddy больше не держит.

Почему блок нельзя просто закоммитить

Его единственный рубеж аутентификации — секрет в пути URL: апстрим-MCP аутентификации не имеет вообще, а claude.ai custom connector ходит на голый URL и кастомных заголовков не шлёт. Секрет в git — не вариант.

Решение

  • Caddyfile: import caddy/local/*.caddy в конце.
  • caddy/local/.gitignore: каталог существует в git, содержимое — нет.
  • docker-compose.prod.yml: каталог смонтирован в контейнер (:ro). Раньше монтировался только один файл users.caddy.snippet, поэтому новый файл контейнер бы не увидел.

Файлы с секретами лежат на VPS untracked — reset --hard их не трогает. Пустой glob для Caddy не ошибка, caddy validate проходит: на машинах без локальных блоков import — no-op.

Проверка

caddy validate 2.11.4 на VPS, оба случая — Valid configuration:

  • пустой caddy/local/ — валидно;
  • реальный блок garmin.caddy с секретом — валидно.

Caddy пересоздаётся деплоем (--force-recreate), новое монтирование подхватится там же.

## Проблема Деплой синкает конфиг через `git reset --hard origin/main`, поэтому site-блок, вписанный руками в `/opt/gendesign/Caddyfile`, живёт до первого следующего пуша в `main`. 16.08 в 07:26 так и произошло с `garmin.gendsgn.ru` (личный remote MCP на этом же VPS, отдельный compose-проект `garmin`): контейнер остался `Up (healthy)`, но хост исчез из конфига — TLS-хендшейк на нём падает `alert internal error`, потому что сертификата для этого имени Caddy больше не держит. ## Почему блок нельзя просто закоммитить Его единственный рубеж аутентификации — секрет в пути URL: апстрим-MCP аутентификации не имеет вообще, а claude.ai custom connector ходит на голый URL и кастомных заголовков не шлёт. Секрет в git — не вариант. ## Решение - `Caddyfile`: `import caddy/local/*.caddy` в конце. - `caddy/local/.gitignore`: каталог существует в git, содержимое — нет. - `docker-compose.prod.yml`: каталог смонтирован в контейнер (`:ro`). Раньше монтировался только один файл `users.caddy.snippet`, поэтому новый файл контейнер бы не увидел. Файлы с секретами лежат на VPS untracked — `reset --hard` их не трогает. Пустой glob для Caddy не ошибка, `caddy validate` проходит: на машинах без локальных блоков import — no-op. ## Проверка `caddy validate` 2.11.4 на VPS, оба случая — `Valid configuration`: - пустой `caddy/local/` — валидно; - реальный блок `garmin.caddy` с секретом — валидно. Caddy пересоздаётся деплоем (`--force-recreate`), новое монтирование подхватится там же.
bot-backend added 1 commit 2026-08-18 06:43:23 +00:00
fix(infra/caddy): site-блоки с секретами переживают деплой — import caddy/local/*.caddy
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 11s
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
CI Trade-In / frontend-checks (pull_request) Successful in 59s
f30820bb9a
Деплой делает `git reset --hard origin/main`, поэтому любой site-блок,
вписанный руками в /opt/gendesign/Caddyfile, живёт до первого пуша в main.
16.08 так и вышло с garmin.gendsgn.ru: контейнер остался healthy, а хост
исчез из конфига — TLS-хендшейк стал падать `alert internal error`,
потому что сертификат для него Caddy больше не держит.

Класть такой блок в git нельзя: у него единственный рубеж аутентификации —
секрет в пути URL (апстрим-MCP аутентификации не имеет, а claude.ai
connector кастомные заголовки не шлёт).

Развязка: в репозитории только `import caddy/local/*.caddy` и сам каталог
(держится .gitignore'ом), файлы с секретами лежат на VPS untracked —
reset --hard их не трогает. Пустой glob для Caddy не ошибка,
`caddy validate` проходит, на машинах без локальных блоков import — no-op.

Проверено `caddy validate` 2.11.4 на VPS: и с пустым каталогом, и с
реальным блоком garmin — Valid configuration.
bot-backend merged commit b1106916a9 into main 2026-08-18 06:45:10 +00:00
bot-backend deleted branch fix/caddy-garmin-import 2026-08-18 06:45:10 +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#2921
No description provided.