caddy快速添加静态网站的sh脚本(由z.ai提供)

#!/bin/bash

# ==========================================
# Caddy 多站点自动添加脚本 (含时间戳备份)
# 适用于 OpenCloudOS 9 / CentOS / RHEL
# ==========================================

# --- 配置区域 (请根据实际情况修改) ---
CADDY_USER="caddy"           # Caddy 运行用户,通常是 caddy 或 www-data
WEB_ROOT="/var/www"          # 网站根目录
CADDYFILE="/etc/caddy/Caddyfile" # Caddy 配置文件路径
# -----------------------------------

# 检查是否为 root 用户
if [ "$EUID" -ne 0 ]; then
  echo "错误:请使用 sudo 或以 root 权限运行此脚本。"
  exit 1
fi

# --- 生成带时间戳的备份文件名 ---
# 格式示例: Caddyfile.backup_20231027_153045
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="${CADDYFILE}.backup_${TIMESTAMP}"

# 颜色输出辅助
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

echo "========================================="
echo "   Caddy 静态网站自动添加向导"
echo "========================================="
echo ""

# 备份现有配置
if [ -f "$CADDYFILE" ]; then
    cp "$CADDYFILE" "$BACKUP_FILE"
    echo -e "${GREEN}[INFO]${NC} 已备份当前配置。"
    echo -e "${GREEN}[INFO]${NC} 备份文件路径: $BACKUP_FILE"
else
    echo -e "${RED}[ERROR]${NC} 找不到 Caddyfile: $CADDYFILE"
    exit 1
fi

# 循环添加 2 个网站
for i in {1..2}
do
    echo ""
    echo ">>> 正在配置第 $i 个网站 <<<"
    
    # 提示输入域名
    while true; do
        read -p "请输入第 $i 个域名 (例如 example.com): " DOMAIN
        # 去除首尾空格
        DOMAIN=$(echo "$DOMAIN" | xargs)
        
        if [ -z "$DOMAIN" ]; then
            echo -e "${RED}[ERROR]${NC} 域名不能为空,请重新输入。"
        else
            break
        fi
    done

    SITE_DIR="${WEB_ROOT}/${DOMAIN}"

    # 1. 创建目录
    if [ -d "$SITE_DIR" ]; then
        echo -e "${YELLOW}[WARNING]${NC} 目录 ${SITE_DIR} 已存在。"
    else
        mkdir -p "$SITE_DIR"
        echo -e "${GREEN}[OK]${NC} 创建目录: $SITE_DIR"
    fi

    # 2. 创建测试用的 index.html
    cat > "${SITE_DIR}/index.html" <<EOF
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Welcome to ${DOMAIN}</title>
</head>
<body>
    <h1>恭喜!${DOMAIN} 配置成功。</h1>
    <p>这是一个由 Caddy 托管的静态网站。</p>
    <p>Server: OpenCloudOS 9</p>
    <p>Time: $(date)</p>
</body>
</html>
EOF
    echo -e "${GREEN}[OK]${NC} 创建测试页面: ${SITE_DIR}/index.html"

    # 3. 设置文件权限 (重要)
    chown -R ${CADDY_USER}:${CADDY_USER} "${SITE_DIR}"
    chmod -R 755 "${SITE_DIR}"
    # 确保文件是 644
    find "${SITE_DIR}" -type f -exec chmod 644 {} \;
    echo -e "${GREEN}[OK]${NC} 权限设置完成 (Owner: ${CADDY_USER})"

    # 4. 处理 SELinux 上下文 (OpenCloudOS 9 默认开启 SELinux,这步很关键)
    if command -v restorecon &> /dev/null; then
        restorecon -Rv "${SITE_DIR}" > /dev/null 2>&1
        echo -e "${GREEN}[OK]${NC} SELinux 上下文已更新"
    fi

    # 5. 追加配置到 Caddyfile
    # 检查是否已经存在该域名的配置 (防止重复)
    if grep -q "^${DOMAIN} " "$CADDYFILE" || grep -q "^www.${DOMAIN} " "$CADDYFILE"; then
         echo -e "${YELLOW}[WARNING]${NC} 检测到 ${DOMAIN} 的配置可能已存在于 Caddyfile 中,跳过写入配置。"
    else
        echo "" >> "$CADDYFILE"
        echo "# --- Site: ${DOMAIN} (Added by script at ${TIMESTAMP}) ---" >> "$CADDYFILE"
        echo "${DOMAIN}, www.${DOMAIN} {" >> "$CADDYFILE"
        echo "    root * ${SITE_DIR}" >> "$CADDYFILE"
        echo "    file_server" >> "$CADDYFILE"
        echo "    encode gzip" >> "$CADDYFILE"
        echo "     header {" >> "$CADDYFILE"
        echo "     X-Content-Type-Options "nosniff""  >> "$CADDYFILE"
        echo "     X-Frame-Options "DENY"  }" >> "$CADDYFILE"
        echo "}" >> "$CADDYFILE"
        echo -e "${GREEN}[OK]${NC} 配置已追加到 Caddyfile"
    fi
done
# ==========================================
# 验证与重载
# ==========================================
echo ""
echo "========================================="
echo "正在验证 Caddy 配置..."
echo "========================================="

if caddy validate --config "$CADDYFILE" --adapter caddyfile; then
    echo -e "${GREEN}[SUCCESS]${NC} 配置文件语法正确!"
    echo "正在重载 Caddy 服务..."
    
    # 尝试重载服务
    if systemctl reload caddy; then
        echo -e "${GREEN}[SUCCESS]${NC} Caddy 服务重载成功!"
    else
        # 如果 reload 失败(有时候配置变动太大需要 restart),尝试 restart
        echo -e "${YELLOW}[WARNING]${NC} Reload 失败,尝试 Restart..."
        systemctl restart caddy
        echo -e "${GREEN}[SUCCESS]${NC} Caddy 服务重启成功!"
    fi
else
    echo -e "${RED}[ERROR]${NC} 配置验证失败!正在恢复备份..."
    cp "$BACKUP_FILE" "$CADDYFILE"
    echo -e "${RED}[FATAL]${NC} 已回滚配置。请检查手动输入的域名是否正确。"
    exit 1
fi

echo ""
echo "========================================="
echo -e "${GREEN}全部完成!${NC}"
echo "========================================="
echo "请确保您的域名 A 记录已解析到此服务器 IP。"

使用说明
    创建脚本文件:
    在服务器上创建一个文件,例如 add_sites.sh,并将上面的代码粘贴进去。
    赋予执行权限:
    chmod +x add_sites.sh
    运行脚本:
    sudo ./add_sites.sh
 脚本特色与注意事项
    交互式输入:脚本会依次提示您输入两个域名,并检查是否为空。
    自动备份:每次运行前,都会自动备份当前的 /etc/caddy/Caddyfile,如果配置出错会自动回滚。
    权限处理:自动设置目录所有者为 caddy(脚本顶部可修改),并设置 755 / 644 权限。
    SELinux 兼容:由于 OpenCloudOS 9 默认开启 SELinux,脚本加入了 restorecon 命令,确保新创建的目录拥有正确的 Web 文件上下文(httpd_sys_content_t),防止出现 403 Forbidden 错误。
    防重复检查:在追加配置前,脚本会简单检查域名是否已存在,避免重复添加导致 Caddy 报错。
    WWW 支持:默认配置会同时处理 domain.com 和 www.domain.com。
如果您之前的 Caddy 用户不是 caddy,请记得修改脚本头部的 CADDY_USER 变量。您可以使用 ps aux | grep caddy 查看运行用户。

posted @ 2026-08-02 20:31  POTUS88  阅读(3)  评论(0)    收藏  举报