Files
hfb_sys/deploy/caddy/Caddyfile
T
yml2213 3465475756 feat(caddy): 支持分销站点独立域名 On-Demand TLS 自动签发 SSL 证书
- 后端新增 GET /api/distribution/check-domain 作为 Caddy on_demand_tls ask 白名单端点
- 补充 CheckDomain 相关场景自动化测试
- Caddyfile 启用 on_demand_tls 并配置动态分销前台入口
2026-09-16 14:20:44 +08:00

129 lines
3.1 KiB
Caddyfile

{
email {$CADDY_EMAIL}
on_demand_tls {
ask http://backend:8080/api/distribution/check-domain
}
}
# 反代到后端时,用 Caddy 实测到的对端地址覆盖 X-Real-IP,
# 防止客户端伪造 X-Forwarded-For 影响限流、审计和支付下单的 client_ip。
(backend_proxy) {
header_up X-Real-IP {remote_host}
}
# 公开 API 反代片段:主站与选号网共用。
(public_api) {
@api_sse {
path /api/chats/events /api/admin/chats/events
}
handle @api_sse {
reverse_proxy backend:8080 {
flush_interval -1
import backend_proxy
}
}
handle /api/* {
request_body {
max_size 11MB
}
reverse_proxy backend:8080 {
import backend_proxy
}
}
handle /r/* {
reverse_proxy backend:8080 {
import backend_proxy
}
}
@health path /health /health/ready
handle @health {
reverse_proxy backend:8080 {
import backend_proxy
}
}
}
# 前台商城静态资源与安全头配置(主站与所有分销站点共享):
# 前端通过 window.location.hostname 自动向 /api/distribution/site-info 请求分销配置。
(storefront) {
encode zstd gzip
header {
Strict-Transport-Security "max-age=31536000"
X-Content-Type-Options "nosniff"
X-Frame-Options "DENY"
Referrer-Policy "strict-origin-when-cross-origin"
Permissions-Policy "camera=(), microphone=(), geolocation=()"
Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' https: data: blob:; font-src 'self' data:; connect-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'none'; form-action 'self'"
}
import public_api
# 生产后台页面使用构建时配置的隐藏入口,旧 /admin 入口直接返回 404。
@legacy_admin path /admin /admin/*
handle @legacy_admin {
respond 404
}
# 其余流量返回主站/分销前台前端静态资源。
handle {
root * /srv/dist
try_files {path} /index.html
file_server
}
}
# 主站与过渡子域名共享同一套配置:域名迁移期间新旧域名同时可访问,
# 避免 DNS 缓存未生效导致部分用户打不开。迁移完成后可移除 h5.{$CADDY_DOMAIN}。
{$CADDY_DOMAIN}, h5.{$CADDY_DOMAIN} {
import storefront
}
# 分销管理后台使用独立 React + Ant Design 静态资源,API 与主站复用 backend。
distribution.{$CADDY_DOMAIN} {
encode zstd gzip
import public_api
handle {
root * /srv/distribution-admin
try_files {path} /index.html
file_server
}
}
# 选号网(hfb_show):仅当 CADDY_SHOW_DOMAIN 有值时由部署脚本启用 conf.d/show.caddy。
# 未配置时 conf.d 为空,不影响主站。
import /etc/caddy/conf.d/*.caddy
# Beszel 自带登录与权限控制;单独子域避免与业务站点的 CSP、路由相互影响。
monitor.{$CADDY_DOMAIN} {
encode zstd gzip
request_body {
max_size 10MB
}
reverse_proxy beszel:8090 {
transport http {
read_timeout 360s
}
}
}
# gitea 自托管代码库
gitea.hao858.com {
reverse_proxy gitea:3000
}
# 分销站点动态域名入口:
# 支持任意二级域名及分销商独立域名,首次访问时通过 on_demand_tls 触发后端白名单校验并自动签发 SSL 证书。
https:// {
tls {
on_demand
}
import storefront
}