This commit is contained in:
张威33321
2026-09-09 15:04:54 +08:00
parent fb87be680d
commit a9ec40a289
22 changed files with 303 additions and 352 deletions

View File

@@ -1,23 +1,29 @@
#!/usr/bin/env bash
#
# 启用 HTTPS 配置:只把"已经拿到证书"的域名对应的 server 块
# 从 ssl.d.available/ 复制 ssl.d/nginx 挂载并 include 的目录),
# 然后校验配置并优雅重载 nginx。
# 启用 HTTPS 配置:证书就绪后,把 ssl.d.available/ 下的 server 块
# 复制 ssl.d/nginx 容器 bind mount 并 include 的目录),校验后优雅重载 nginx。
#
# 冷启动时 ssl.d/ 为空nginx 只加载 conf.d/00-http.conf不引用证书
# 因此可以在没有证书的情况下正常启动并提供 80 端口 —— 这是打破
# 因此可以在没有证书的情况下启动并提供 80 端口 —— 这是打破
# "先有证书还是先有 nginx" 死锁的关键。
#
set -euo pipefail
# cron / 非登录 shell 下 PATH 极简,显式补齐
export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin${PATH:+:$PATH}"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
AVAILABLE="$SCRIPT_DIR/ssl.d.available"
ENABLED="$SCRIPT_DIR/ssl.d"
CERT_NAME="${CERT_NAME:-stonelan.cn}"
CERT_FULL="/etc/letsencrypt/live/$CERT_NAME/fullchain.pem"
DOMAINS="${DOMAINS:-fastgpt.stonelan.cn gitea.stonelan.cn image.stonelan.cn registry.stonelan.cn www.stonelan.cn}"
# 证书在宿主机上,直接判断即可(不再需要进容器)
if [ ! -f "$CERT_FULL" ]; then
echo "证书尚未生成:$CERT_FULL"
echo "请先执行 acme/issue.sh成功后再运行本脚本"
exit 0
fi
mkdir -p "$ENABLED"
cd "$SCRIPT_DIR"
@@ -29,12 +35,6 @@ for d in $DOMAINS; do
continue
fi
# nginx 容器以只读方式挂载了 certbot-certs 卷,用它判断证书是否就绪
if ! docker compose exec -T nginx-proxy test -f "/etc/letsencrypt/live/$d/fullchain.pem" 2>/dev/null; then
echo "跳过 $d:证书不存在(/etc/letsencrypt/live/$d/fullchain.pem"
continue
fi
if ! cmp -s "$conf" "$ENABLED/$d.conf" 2>/dev/null; then
cp "$conf" "$ENABLED/$d.conf"
copied+=("$ENABLED/$d.conf")
@@ -43,7 +43,7 @@ for d in $DOMAINS; do
done
if [ "${#copied[@]}" -eq 0 ]; then
echo "没有需要变更的 HTTPS 配置"
echo "HTTPS 配置已是最新,无需变更"
exit 0
fi