#!/usr/bin/env bash # # 首次申请证书并启用 HTTPS(完整引导)。 # # 1. 准备宿主机目录:acme.sh 写挑战文件,nginx 容器 bind mount 只读 # 2. 启动 nginx —— 此时 ssl.d/ 为空,只加载 80 端口配置,不依赖证书 # 3. 申请 SAN 证书(webroot 验证,挑战文件由 nginx 直接对外提供) # 4. 把证书安装到 /etc/letsencrypt/live// # --reloadcmd 会被 acme.sh 记住,之后每次自动续签都执行 # 5. 启用 HTTPS server 块并重载 nginx # # 需要 root 权限(要写 /etc/letsencrypt 与 /var/www):sudo 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"