diff --git a/Caddyfile b/Caddyfile index 7f99e71a..684a331a 100644 --- a/Caddyfile +++ b/Caddyfile @@ -50,30 +50,27 @@ # ничего не меняется. В окне: на Selectel CADDY_SITES=apps, на Beget=infra. import caddy/sites/{$CADDY_SITES:*}.caddy -# Plain HTTP by IP — closed by same auth gate (prevent bypass via direct IP / SSH tunnel). -# Caddy issues no TLS here (no hostname). /health remains public. +# Plain HTTP by IP. /health остаётся публичным (liveness). Всё остальное — +# РЕДИРЕКТ на канонический HTTPS, а не проксирование под basic_auth. +# +# ЗДЕСЬ СТОЯЛ auth-гейт с проксированием приложения — «закрыть обход через +# голый IP тем же гейтом». Замысел верный, исполнение — дыра: Basic-challenge +# на plain HTTP означает, что браузер отправит пароль пилота ОТКРЫТЫМ ТЕКСТОМ +# любому, кто слушает канал (аудит 02.09.2026: curl http:///api/v1/me → +# 401 + Www-Authenticate: Basic realm="GenDesign Pilot"). Редирект строже +# гейта: по HTTP не отдаётся ни контент, ни сам запрос пароля, обход через +# IP закрыт тем, что отвечать нечему. Потребителей у IP:80 нет: все +# deploy-смоки ходят docker exec → localhost внутри контейнеров (проверено +# grep-ом по .forgejo/workflows и ops/ 02.09.2026). :80 { - encode zstd gzip - route { - # /health — public, без auth (GHA deploy smoke check, liveness probe). + # /health — public, без auth (liveness probe). handle /health { reverse_proxy backend:8000 } - # Auth gate (same snippet as gendsgn.ru). - import caddy/users.caddy.snippet - - handle /api/* { - reverse_proxy backend:8000 { - header_up X-Authenticated-User {http.auth.user.id} - } - } - handle { - reverse_proxy frontend:3000 { - header_up X-Authenticated-User {http.auth.user.id} - } + redir https://gendsgn.ru{uri} permanent } } }