fix(caddy): разделение сайтов по хостам доходит до контейнера #3088
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
ИРД
вторичка
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#3088
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/3059-caddy-sites-env"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
caddyвdocker-compose.prod.ymlне пробрасывалась переменнаяCADDY_SITES, поэтому разделение доменов по хостам из #3059 не работало вообще.import caddy/sites/{$CADDY_SITES:*}.caddyраскрывает сам Caddy из окружения своего контейнера — значение с хоста до него не доходило, всегда действовал дефолт*.obsidian/errors/git, чей DNS остаётся на другой машине. HTTP-01 падает, Let's Encrypt считает неудачи — 5 на домен в час.Test plan
caddy adaptна живомcaddy:2с реальным конфигом, проверка по host-матчерам в готовом JSON:CADDY_SITES=apps→gendsgn.ru,www,merahome,meraocenka,meraotsenkaCADDY_SITES=infra→errors,git,obsidiancaddy reloadRefs #3059, #3057
Смержил. Это дыра в моём #3062, и стоит зафиксировать, почему мои проверки её не поймали — ошибка методическая, а не случайная.
Что я проверял и что из этого следовало
В #3062 я гонял
caddy adaptтак:Три режима, честные цифры: без переменной 8 доменов,
apps→ 5,infra→ 3. Всё это верно — и всё это про Caddyfile, а не про то, как переменная попадает в контейнер на проде.Я передавал
-e CADDY_SITESпрямо вdocker run, то есть сам подставлял то звено, которого в compose не существовало. Проверка подтверждала логику конфига и обходила единственное место, где была ошибка.Классический случай: тест доказывал, что механизм работает, если ему дать вход, — но не то, что вход дойдёт.
Почему это не поймалось и дальше
Я проверял #3062 на проде после мержа: caddy пересоздан,
caddy/sites/смонтирован, все 8 доменов отвечают. Всё сходилось — потому что 8 доменов и есть поведение по умолчанию. Отсутствие переменной выглядит ровно как корректная работа без переменной. Отличить одно от другого можно было только задавCADDY_SITES=appsна проде и увидев, что ничего не изменилось, а этого я не делал.То есть моя пост-деплойная проверка была не бесполезной, но слепой ровно к этому классу отказа.
Что теперь верно
CADDY_SITES: ${CADDY_SITES:-*}вenvironment:сервиса — дефолт*сохраняет сегодняшнее поведение бит в бит, а в окне значение задаётся на каждом хосте.Правильная проверка на будущее: не «отвечают ли домены», а
docker exec gendesign-caddy-1 env | grep CADDY_SITESплюс список доменов из лога Caddy после reload. Первое доказывает, что вход дошёл; второе — что он подействовал.Допишу это в раннбук как шаг проверки после установки переменной, чтобы в окне никто не повторил мою ошибку — не увидел восемь доменов там, где ожидал пять, и не счёл это успехом.
Refs #3059, #3062, #3057