#!/usr/bin/env bash set -Eeuo pipefail APP_DIR=/opt/xinghen PROXY_CONTAINER=meishi_ccdw_life-proxy-1 NGINX_CONFIG=/opt/meishi_ccdw_life/nginx.conf PRIMARY_DOMAIN=xinghen.lessncosmos.com FUTURE_DOMAIN=xinghen.work ACME_ROOT=/etc/letsencrypt/acme-challenge MARKER_BEGIN='# BEGIN XINGHEN MANAGED BLOCK' MARKER_END='# END XINGHEN MANAGED BLOCK' cd "$APP_DIR" if [[ -f .deploy/app-image.tar.gz ]]; then gzip -dc .deploy/app-image.tar.gz | docker load rm -f .deploy/app-image.tar.gz fi if [[ ! -f .env ]]; then umask 077 cat >.env < 0 && lines[last] ~ /^[[:space:]]*$/) last-- if (lines[last] !~ /^}$/) exit 2 for (i=1; i"$staged" printf '\n%s\n' "$MARKER_BEGIN" >>"$staged" cat "$block_file" >>"$staged" printf '%s\n\n}\n' "$MARKER_END" >>"$staged" docker run --rm --network meishi_ccdw_life_default \ -v "$staged:/etc/nginx/nginx.conf:ro" \ -v /etc/letsencrypt:/etc/letsencrypt:ro \ docker.m.daocloud.io/library/nginx:alpine nginx -t cp "$staged" "$NGINX_CONFIG" docker exec "$PROXY_CONTAINER" nginx -t docker exec "$PROXY_CONTAINER" nginx -s reload rm -f "$staged" } http_block=$(mktemp) cat >"$http_block" <&2 exit 1 fi certbot certonly --webroot -w "$ACME_ROOT" \ --cert-name "$PRIMARY_DOMAIN" -d "$PRIMARY_DOMAIN" -d "$FUTURE_DOMAIN" \ --non-interactive --agree-tos --register-unsafely-without-email --expand server_names="$PRIMARY_DOMAIN $FUTURE_DOMAIN" fi tls_block=$(mktemp) cat >"$tls_block" </etc/letsencrypt/renewal-hooks/deploy/reload-xinghen-nginx.sh </dev/null; then healthy=1 break fi sleep 1 done if [[ "$healthy" != 1 ]]; then echo "HTTPS 健康检查失败:$PRIMARY_DOMAIN" >&2 exit 1 fi docker compose -p xinghen -f docker-compose.prod.yml ps