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 查看运行用户。
浙公网安备 33010602011771号