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

61
acme/issue.sh Normal file
View File

@@ -0,0 +1,61 @@
#!/usr/bin/env bash
#
# 首次申请证书并启用 HTTPS完整引导
#
# 1. 准备宿主机目录acme.sh 写挑战文件nginx 容器 bind mount 只读
# 2. 启动 nginx —— 此时 ssl.d/ 为空,只加载 80 端口配置,不依赖证书
# 3. 申请 SAN 证书webroot 验证,挑战文件由 nginx 直接对外提供)
# 4. 把证书安装到 /etc/letsencrypt/live/<CERT_NAME>/
# --reloadcmd 会被 acme.sh 记住,之后每次自动续签都执行
# 5. 启用 HTTPS server 块并重载 nginx
#
# 需要 root 权限(要写 /etc/letsencrypt 与 /var/wwwsudo bash issue.sh
#
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
NGINX_DIR="$SCRIPT_DIR/../nginx"
EMAIL="${EMAIL:-admin@stonelan.cn}"
CERT_NAME="${CERT_NAME:-stonelan.cn}"
WEBROOT="${WEBROOT:-/var/www/certbot}"
CERT_HOME="${CERT_HOME:-/etc/letsencrypt/live/$CERT_NAME}"
DOMAINS="${DOMAINS:-fastgpt.stonelan.cn gitea.stonelan.cn image.stonelan.cn registry.stonelan.cn www.stonelan.cn}"
ACME="${ACME:-$HOME/.acme.sh/acme.sh}"
# acme.sh 的 Main_Domain 就是 -d 列表的第一个,--install-cert 要用它
PRIMARY="${DOMAINS%% *}"
if [ ! -s "$ACME" ]; then
echo "未找到 acme.sh请先执行$SCRIPT_DIR/install.sh" >&2
exit 1
fi
# 1. 目录
mkdir -p "$WEBROOT/.well-known/acme-challenge" "$CERT_HOME"
chmod 755 "$WEBROOT" "$WEBROOT/.well-known" "$WEBROOT/.well-known/acme-challenge"
# 2. nginx无证书也能起来
echo "==> 启动 nginx"
docker compose -f "$NGINX_DIR/docker-compose.yml" up -d
# 3. 申请
args=()
for d in $DOMAINS; do
args+=(-d "$d")
done
echo "==> 申请证书(主域 $PRIMARY,共 $(echo $DOMAINS | wc -w) 个域名):$DOMAINS"
"$ACME" --issue --webroot "$WEBROOT" --server letsencrypt "${args[@]}"
# 4. 安装证书
echo "==> 安装证书到 $CERT_HOME"
"$ACME" --install-cert -d "$PRIMARY" \
--cert-file "$CERT_HOME/cert.pem" \
--key-file "$CERT_HOME/privkey.pem" \
--fullchain-file "$CERT_HOME/fullchain.pem" \
--reloadcmd "docker kill -s HUP nginx-proxy"
# 5. 启用 HTTPS
echo "==> 启用 HTTPS 配置"
exec bash "$NGINX_DIR/enable-ssl.sh"