negiix 更换成 caddy
This commit is contained in:
+57
-13
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user