支持同机双域名部署选号网hfb_show

Caddy按CADDY_SHOW_DOMAIN托管选号网静态并反代API;一键脚本可构建hfb_show并写入配置。
This commit is contained in:
yml2213
2026-07-16 22:24:40 +08:00
parent a4189db4ca
commit a0fc23647b
12 changed files with 267 additions and 38 deletions
+104 -1
View File
@@ -75,6 +75,12 @@ show_help() {
PROD_READY_TIMEOUT=120
等待服务就绪秒数
选号网(hfb_show,可选,写在 backend/.env:
CADDY_SHOW_DOMAIN=show.example.com
选号网独立域名,A 记录指向本机;留空则不启用
HFB_SHOW_DIR=../hfb_show
选号网源码目录(相对 hfb_sys 根目录或绝对路径)
示例:
./scripts/deploy-prod.sh
./scripts/deploy-prod.sh --no-build
@@ -209,8 +215,100 @@ compose_user_cmd() {
export_caddy_env() {
export CADDY_DOMAIN
export CADDY_EMAIL
export CADDY_SHOW_DOMAIN
CADDY_DOMAIN="$(require_env CADDY_DOMAIN)"
CADDY_EMAIL="$(require_env CADDY_EMAIL)"
CADDY_SHOW_DOMAIN="$(env_value CADDY_SHOW_DOMAIN || true)"
export CADDY_SHOW_DOMAIN
}
# 准备选号网静态资源与 Caddy 站点配置(可选)
prepare_show_site() {
local conf_dir="${ROOT_DIR}/deploy/caddy/conf.d"
local show_dist="${ROOT_DIR}/deploy/caddy/show-dist"
local show_tmpl="${ROOT_DIR}/deploy/caddy/show.caddy.tmpl"
local show_conf="${conf_dir}/show.caddy"
local show_dir show_domain
mkdir -p "${conf_dir}"
rm -f "${show_conf}"
show_domain="$(env_value CADDY_SHOW_DOMAIN || true)"
if [[ -z "${show_domain}" ]]; then
log "未配置 CADDY_SHOW_DOMAIN,跳过选号网站点"
# 保留占位页,避免 Caddy 镜像 COPY 目录为空时异常
if [[ ! -f "${show_dist}/index.html" ]]; then
mkdir -p "${show_dist}"
printf '%s\n' '<!doctype html><title>show disabled</title>' >"${show_dist}/index.html"
fi
return 0
fi
if [[ "${show_domain}" == http://* || "${show_domain}" == https://* || "${show_domain}" == */* ]]; then
log_error "CADDY_SHOW_DOMAIN 只填写域名本身,不要包含 http(s):// 或路径,当前值:${show_domain}"
exit 1
fi
if [[ "${show_domain}" == "${CADDY_DOMAIN}" ]]; then
log_error "CADDY_SHOW_DOMAIN 不能与 CADDY_DOMAIN 相同"
exit 1
fi
show_dir="$(env_value HFB_SHOW_DIR || true)"
if [[ -z "${show_dir}" ]]; then
show_dir="${ROOT_DIR}/../hfb_show"
elif [[ "${show_dir}" != /* ]]; then
show_dir="${ROOT_DIR}/${show_dir}"
fi
if [[ ! -d "${show_dir}" ]]; then
log_error "已配置 CADDY_SHOW_DOMAIN,但找不到选号网目录:${show_dir}"
log_error "请设置 HFB_SHOW_DIR,或把仓库放在与 hfb_sys 同级的 hfb_show"
exit 1
fi
if [[ ! -f "${show_dir}/package.json" ]]; then
log_error "选号网目录无效(缺少 package.json):${show_dir}"
exit 1
fi
if [[ "${NO_BUILD}" == "1" ]]; then
if [[ ! -f "${show_dist}/index.html" ]] || grep -q '选号网静态资源尚未构建' "${show_dist}/index.html" 2>/dev/null; then
log_error "--no-build 时需要已有 deploy/caddy/show-dist 构建产物,请先完整部署一次"
exit 1
fi
log_warn "使用已有 show-dist--no-build"
else
need_cmd npm
log "构建选号网静态资源:${show_dir}"
(
cd "${show_dir}"
if [[ -f package-lock.json ]]; then
npm ci
else
npm install
fi
npm run build
)
if [[ ! -d "${show_dir}/dist" ]]; then
log_error "选号网构建失败:未生成 dist/"
exit 1
fi
rm -rf "${show_dist}"
mkdir -p "${show_dist}"
cp -a "${show_dir}/dist/." "${show_dist}/"
log_success "选号网 dist 已同步到 deploy/caddy/show-dist"
fi
if [[ ! -f "${show_tmpl}" ]]; then
log_error "缺少 ${show_tmpl}"
exit 1
fi
# 域名仅允许主机名字符,避免注入 Caddyfile
if [[ ! "${show_domain}" =~ ^[A-Za-z0-9.-]+$ ]]; then
log_error "CADDY_SHOW_DOMAIN 含非法字符:${show_domain}"
exit 1
fi
sed "s/__CADDY_SHOW_DOMAIN__/${show_domain}/g" "${show_tmpl}" >"${show_conf}"
log_success "已启用选号网站点:https://${show_domain}"
}
public_url() {
@@ -351,6 +449,8 @@ main() {
validate_env
export_caddy_env
prepare_log_dir
# 选号网需在 build caddy 之前准备 show-dist 与 conf.d
prepare_show_site
log "检查 Docker Compose 配置..."
compose config >/dev/null
@@ -379,7 +479,7 @@ main() {
log "构建后端镜像..."
compose build backend
log "构建 Caddy 镜像(含前端静态资源)..."
log "构建 Caddy 镜像(含主站 + 选号网静态资源)..."
compose build caddy
log "启动生产服务..."
@@ -405,6 +505,9 @@ main() {
fi
log_success "部署完成:$(public_url)"
if [[ -n "$(env_value CADDY_SHOW_DOMAIN || true)" ]]; then
log_success "选号网:https://$(env_value CADDY_SHOW_DOMAIN)"
fi
log "常用命令:$(compose_user_cmd) logs -f caddy backend"
if [[ "${FOLLOW_LOGS}" == "1" ]]; then