#!/usr/bin/env bash # caddy-reverse-proxy.sh # 自动安装&配置Caddy反代(支持SSL、DNS验证、IPv6、WS、自动续期免输入) set -e ENV_FILE="/etc/caddy/dns.env" SYSTEMD_SERVICE="/etc/systemd/system/caddy.service" # ===== 用户输入 ===== read -rp "请输入反向代理目标地址 (例如 127.0.0.1): " backend_host read -rp "请输入反向代理目标端口 [默认6366]: " backend_port backend_port=${backend_port:-6366} read -rp "请输入监听端口 [默认443]: " listen_port listen_port=${listen_port:-443} read -rp "请输入反代访问域名 (必须已解析到本机): " domain if [[ -z "$domain" ]]; then echo "❌ 域名必填!" exit 1 fi read -rp "请输入邮箱(可选,留空则不设置): " ssl_email read -rp "是否使用 DNS 验证申请证书?[y/N]: " use_dns use_dns=${use_dns:-N} dns_provider="" declare -A env_vars if [[ "$use_dns" =~ ^[Yy]$ ]]; then echo "请选择 DNS 服务商:" echo "1) Cloudflare" echo "2) Dnspod (国内站)" echo "3) Dnspod (国际站)" echo "4) Aliyun (国内)" echo "5) Aliyun (国际)" read -rp "输入编号: " dns_choice case $dns_choice in 1) dns_provider="cloudflare" read -rp "Cloudflare API Token: " CF_API_TOKEN env_vars["CF_API_TOKEN"]=$CF_API_TOKEN ;; 2) dns_provider="dnspod" read -rp "Dnspod 国内站 API ID: " DP_ID read -rp "Dnspod 国内站 API Key: " DP_KEY env_vars["DP_ID"]=$DP_ID env_vars["DP_KEY"]=$DP_KEY ;; 3) dns_provider="dnspod" read -rp "Dnspod 国际站 API Token: " DP_TOKEN env_vars["DP_TOKEN"]=$DP_TOKEN ;; 4|5) dns_provider="alidns" read -rp "Aliyun AccessKey ID: " ALICLOUD_ACCESS_KEY read -rp "Aliyun AccessKey Secret: " ALICLOUD_SECRET_KEY env_vars["ALICLOUD_ACCESS_KEY"]=$ALICLOUD_ACCESS_KEY env_vars["ALICLOUD_SECRET_KEY"]=$ALICLOUD_SECRET_KEY ;; *) echo "❌ 无效选项" exit 1 ;; esac fi # ===== 检查IPv6支持 ===== if ping6 -c1 google.com &>/dev/null; then listen_address="[::]" echo "✅ 检测到IPv6支持,将使用IPv6监听" else listen_address="0.0.0.0" echo "⚠️ 未检测到IPv6支持,将使用IPv4监听" fi # ===== 安装Caddy ===== if ! command -v caddy &>/dev/null; then echo "🔧 安装Caddy..." apt update && apt install -y curl unzip # 使用官方安装脚本 curl -sSfL https://caddyserver.com/static/install.sh | bash -s # 或者使用包管理器安装(取消注释以下行) # curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg # curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list # apt update # apt install caddy # 确保caddy在正确位置 if [[ -f "/usr/bin/caddy" ]]; then mv /usr/bin/caddy /usr/local/bin/caddy fi fi mkdir -p /etc/caddy # ===== 保存环境变量到dns.env ===== echo "# Caddy DNS Provider API Keys" >"$ENV_FILE" for key in "${!env_vars[@]}"; do echo "$key=${env_vars[$key]}" >>"$ENV_FILE" done chmod 600 "$ENV_FILE" # ===== 配置systemd服务加载环境变量 ===== cat >"$SYSTEMD_SERVICE" </etc/caddy/Caddyfile </etc/caddy/Caddyfile <