62 lines
2.1 KiB
Bash
62 lines
2.1 KiB
Bash
#!/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/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"
|