handle /trade-in/* НЕ матчил /trade-in (без слеша) — request попадал в универсальный handle и проксировался на основной gendesign frontend, который для unknown path отдавал 200 OK с пустым body. Заменил на named matcher `@tradein path /trade-in /trade-in/*` — ловит оба случая. Также убрал redirect-handle /trade-in → /trade-in/ т.к. trailingSlash=false у Next.js и сам редиректит обратно.
117 lines
3.7 KiB
Caddyfile
117 lines
3.7 KiB
Caddyfile
# Caddy config.
|
||
#
|
||
# - gendsgn.ru — main production site, auto-TLS via Let's Encrypt.
|
||
# - www.gendsgn.ru — 301 redirect to apex (canonical URL).
|
||
# - :80 — fallback for raw IP access. Will be removed once everyone uses the domain.
|
||
#
|
||
# `handle /api/*` (NOT `handle_path`) — we keep the /api prefix because
|
||
# the FastAPI router is mounted at /api/v1/*.
|
||
|
||
gendsgn.ru {
|
||
encode zstd gzip
|
||
|
||
handle /api/* {
|
||
reverse_proxy backend:8000
|
||
}
|
||
|
||
handle /health {
|
||
reverse_proxy backend:8000
|
||
}
|
||
|
||
# Static HTML mockups для review (audit alternatives).
|
||
# Public access — без auth (по запросу 2026-05-17).
|
||
handle_path /preview/* {
|
||
root * /srv/preview
|
||
file_server browse
|
||
}
|
||
|
||
# Trade-In MVP subproject (tradein-mvp/) — gendesign-tradein docker stack,
|
||
# подключен через gendesign_shared network. Routes ДО универсального handle
|
||
# потому что Caddy матчит handle-блоки сверху вниз.
|
||
handle_path /trade-in/api/* {
|
||
# handle_path вырезает префикс /trade-in перед прокси →
|
||
# FastAPI получает /api/v1/...
|
||
reverse_proxy tradein-backend:8000
|
||
}
|
||
|
||
# Matcher `path /trade-in /trade-in/*` ловит И /trade-in (без слеша),
|
||
# И /trade-in/ + /trade-in/анisching. Без обоих случаев `handle /trade-in/*`
|
||
# пропускал /trade-in без слеша → попадал в общий frontend → пустой ответ.
|
||
@tradein path /trade-in /trade-in/*
|
||
handle @tradein {
|
||
# Next.js basePath=/trade-in — фронт сам ждёт префикса в URL
|
||
reverse_proxy tradein-frontend:3000
|
||
}
|
||
|
||
handle {
|
||
reverse_proxy frontend:3000
|
||
}
|
||
}
|
||
|
||
www.gendsgn.ru {
|
||
redir https://gendsgn.ru{uri} permanent
|
||
}
|
||
|
||
# Obsidian Self-hosted LiveSync (CouchDB backend).
|
||
# Auto-TLS Let's Encrypt. CORS уже включён на стороне CouchDB через bootstrap
|
||
# (см. scripts/setup-couchdb.sh). Basic-auth — на стороне CouchDB (admin user).
|
||
#
|
||
# DNS: A-record obsidian.gendsgn.ru → IP VPS.
|
||
# Клиенты Obsidian + Self-hosted LiveSync plugin указывают на этот URL.
|
||
obsidian.gendsgn.ru {
|
||
encode zstd gzip
|
||
|
||
reverse_proxy couchdb:5984 {
|
||
# Большие документы (vault attachments / images) — увеличиваем timeout
|
||
transport http {
|
||
response_header_timeout 120s
|
||
}
|
||
}
|
||
}
|
||
|
||
# GlitchTip — self-hosted error tracking (Sentry-compatible).
|
||
# DNS: A-record errors.gendsgn.ru → IP VPS.
|
||
errors.gendsgn.ru {
|
||
encode zstd gzip
|
||
|
||
reverse_proxy glitchtip-web:8080
|
||
|
||
log {
|
||
output file /var/log/caddy/errors.gendsgn.ru.log
|
||
}
|
||
}
|
||
|
||
# Forgejo — self-hosted git (migration 2026-05-16).
|
||
# DNS: A-record git.gendsgn.ru → IP VPS.
|
||
# Forgejo container из forgejo-migration/docker-compose.yml на shared
|
||
# gendesign_default network. HTTP port 3000 (default Forgejo).
|
||
# Был добавлен вручную при migration, потерян при первом auto-deploy после
|
||
# изменения Caddyfile (deploy.yml делает git reset --hard). См. fix issue.
|
||
git.gendsgn.ru {
|
||
encode zstd gzip
|
||
|
||
reverse_proxy forgejo:3000
|
||
|
||
log {
|
||
output file /var/log/caddy/git.gendsgn.ru.log
|
||
}
|
||
}
|
||
|
||
# Plain HTTP by IP — kept for ssh-tunnel / debugging.
|
||
# Caddy issues no TLS here (no hostname).
|
||
:80 {
|
||
encode zstd gzip
|
||
|
||
handle /api/* {
|
||
reverse_proxy backend:8000
|
||
}
|
||
|
||
handle /health {
|
||
reverse_proxy backend:8000
|
||
}
|
||
|
||
handle {
|
||
reverse_proxy frontend:3000
|
||
}
|
||
}
|
||
# Test deploy flow 2026-05-15T21:43:32Z
|