negiix 更换成 caddy

This commit is contained in:
yml2213
2026-06-11 04:17:36 +08:00
parent 4b9ac0598f
commit c0403fc1ea
10 changed files with 194 additions and 82 deletions
+57 -13
View File
@@ -5,8 +5,8 @@ ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
COMPOSE_FILE="${ROOT_DIR}/deploy/docker-compose.prod.yml"
BACKEND_ENV="${ROOT_DIR}/backend/.env"
BACKEND_LOG_DIR="${ROOT_DIR}/backend/logs"
HEALTH_URL="${PROD_HEALTH_URL:-http://127.0.0.1:7890/api/health}"
PUBLIC_URL="${PROD_PUBLIC_URL:-http://hfb.221329.cc.cd:7890}"
HEALTH_URL="${PROD_HEALTH_URL:-}"
PUBLIC_URL="${PROD_PUBLIC_URL:-}"
READY_TIMEOUT="${PROD_READY_TIMEOUT:-120}"
RED='\033[0;31m'
@@ -66,9 +66,9 @@ show_help() {
-h, --help 显示帮助信息
环境变量:
PROD_HEALTH_URL=http://127.0.0.1:7890/api/health
部署后健康检查地址
PROD_PUBLIC_URL=http://hfb.221329.cc.cd:7890
PROD_HEALTH_URL=https://你的域名/api/health
部署后健康检查地址,默认使用 CADDY_DOMAIN
PROD_PUBLIC_URL=https://你的域名
输出给用户看的访问地址
PROD_READY_TIMEOUT=120
等待服务就绪秒数
@@ -127,8 +127,10 @@ validate_env() {
exit 1
fi
local app_env mysql_dsn redis_addr storage_endpoint
local app_env caddy_domain caddy_email mysql_dsn redis_addr storage_endpoint
app_env="$(require_env APP_ENV)"
caddy_domain="$(require_env CADDY_DOMAIN)"
caddy_email="$(require_env CADDY_EMAIL)"
mysql_dsn="$(require_env MYSQL_DSN)"
redis_addr="$(require_env REDIS_ADDR)"
storage_endpoint="$(require_env STORAGE_ENDPOINT)"
@@ -146,6 +148,19 @@ validate_env() {
log_warn "APP_ENV 当前是 ${app_env},生产部署建议改为 production"
fi
if [[ "${caddy_domain}" == http://* || "${caddy_domain}" == https://* || "${caddy_domain}" == */* ]]; then
log_error "CADDY_DOMAIN 只填写域名本身,不要包含 http(s):// 或路径,当前值:${caddy_domain}"
exit 1
fi
if [[ "${caddy_domain}" == *"127.0.0.1"* || "${caddy_domain}" == *"localhost"* || "${caddy_domain}" != *"."* ]]; then
log_error "CADDY_DOMAIN 必须填写可公网解析到本机的正式域名,当前值:${caddy_domain}"
exit 1
fi
if [[ "${caddy_email}" == "admin@example.com" || "${caddy_email}" != *"@"* ]]; then
log_error "CADDY_EMAIL 需要填写真实邮箱,用于 ACME 证书通知"
exit 1
fi
if [[ "${mysql_dsn}" == *"127.0.0.1"* || "${mysql_dsn}" == *"localhost"* ]]; then
log_error "MYSQL_DSN 仍指向本机,请改为 tcp(mysql:3306)"
exit 1
@@ -168,6 +183,29 @@ compose() {
docker compose -f "${COMPOSE_FILE}" "$@"
}
export_caddy_env() {
export CADDY_DOMAIN
export CADDY_EMAIL
CADDY_DOMAIN="$(require_env CADDY_DOMAIN)"
CADDY_EMAIL="$(require_env CADDY_EMAIL)"
}
public_url() {
if [[ -n "${PUBLIC_URL}" ]]; then
printf "%s" "${PUBLIC_URL}"
return
fi
printf "https://%s" "$(require_env CADDY_DOMAIN)"
}
health_url() {
if [[ -n "${HEALTH_URL}" ]]; then
printf "%s" "${HEALTH_URL}"
return
fi
printf "%s/api/health" "$(public_url)"
}
prepare_log_dir() {
mkdir -p "${BACKEND_LOG_DIR}"
}
@@ -246,16 +284,18 @@ run_migrations() {
wait_http_ready() {
local attempt
local url
url="$(health_url)"
log "等待接口健康检查通过..."
for ((attempt = 1; attempt <= READY_TIMEOUT; attempt++)); do
if curl -fsS --max-time 3 "${HEALTH_URL}" >/dev/null 2>&1; then
log_success "健康检查通过:${HEALTH_URL}"
if curl -fsS --max-time 5 "${url}" >/dev/null 2>&1; then
log_success "健康检查通过:${url}"
return 0
fi
sleep 1
done
log_error "健康检查超时:${HEALTH_URL}"
log_error "健康检查超时:${url}"
exit 1
}
@@ -264,6 +304,7 @@ main() {
need_cmd docker
need_cmd curl
validate_env
export_caddy_env
prepare_log_dir
log "检查 Docker Compose 配置..."
@@ -276,8 +317,8 @@ main() {
log "构建后端镜像..."
compose build backend
log "构建前端镜像..."
compose build frontend
log "构建 Caddy 镜像(含前端静态资源)..."
compose build caddy
log "启动生产服务..."
compose up -d --no-build
@@ -286,16 +327,19 @@ main() {
wait_service_healthy mysql "MySQL"
wait_service_healthy redis "Redis"
wait_service_healthy minio "MinIO"
wait_service_healthy caddy "Caddy"
reset_database
run_migrations
log "重启后端以加载最新数据库状态..."
compose up -d --no-deps --force-recreate backend
wait_service_healthy backend "后端"
compose up -d --no-deps --force-recreate caddy
wait_service_healthy caddy "Caddy"
wait_http_ready
log_success "部署完成:${PUBLIC_URL}"
log "常用命令:docker compose -f deploy/docker-compose.prod.yml logs -f backend"
log_success "部署完成:$(public_url)"
log "常用命令:docker compose -f deploy/docker-compose.prod.yml logs -f caddy backend"
if [[ "${FOLLOW_LOGS}" == "1" ]]; then
compose logs -f backend