logo
0
0
WeChat Login
feat: Add systemd service management for CaddyHelper with installation, uninstallation, and testing scripts

Systemd Service Configuration for CaddyHelper

本目录包含用于通过 systemd 管理 Caddy 的服务配置文件。

文件说明

1. caddy.service - 标准配置

标准的 systemd 服务配置,使用固定路径。

2. caddy-secure.service - 安全加固版

包含额外的安全限制和环境变量支持,推荐用于生产环境。

安装步骤

前置要求

  1. 创建 Caddy 用户(如果还没有):
sudo groupadd --system caddy sudo useradd --system \ --gid caddy \ --create-home \ --home-dir /var/lib/caddy \ --shell /usr/sbin/nologin \ --comment "Caddy web server" \ caddy
  1. 创建必要的目录
sudo mkdir -p /etc/caddy sudo mkdir -p /var/lib/caddy sudo mkdir -p /var/log/caddy
  1. 设置权限
sudo chown -R caddy:caddy /var/lib/caddy sudo chown -R caddy:caddy /var/log/caddy sudo chown -R caddy:caddy /etc/caddy

方法一:使用标准配置

# 1. 复制 Caddy 可执行文件 sudo cp ./caddy /usr/local/bin/caddy sudo chmod +x /usr/local/bin/caddy # 2. 为 Caddy 设置网络绑定权限(允许监听 80/443 端口) sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/caddy # 3. 使用 CaddyHelper 生成配置 # (在你的工作目录下运行 CaddyHelper 命令) CaddyHelper site static --domain example.com --root /var/www/html CaddyHelper dns cloudflare --domain example.com --api-token YOUR_TOKEN # 4. 复制生成的 Caddyfile 到系统目录 sudo cp Caddyfile /etc/caddy/Caddyfile sudo chown caddy:caddy /etc/caddy/Caddyfile # 5. 安装 systemd 服务 sudo cp systemd/caddy.service /etc/systemd/system/ sudo systemctl daemon-reload # 6. 启用并启动服务 sudo systemctl enable caddy sudo systemctl start caddy # 7. 查看状态 sudo systemctl status caddy

方法二:使用安全加固配置(推荐)

# 前 4 步与方法一相同 # 5. 自定义配置路径(可选) # 编辑 /etc/systemd/system/caddy.service.d/override.conf sudo mkdir -p /etc/systemd/system/caddy.service.d sudo tee /etc/systemd/system/caddy.service.d/override.conf > /dev/null <<EOF [Service] Environment="CADDY_BIN=/usr/local/bin/caddy" Environment="CADDYFILE=/etc/caddy/Caddyfile" EOF # 6. 安装安全加固服务 sudo cp systemd/caddy-secure.service /etc/systemd/system/caddy.service sudo systemctl daemon-reload # 7. 启用并启动 sudo systemctl enable caddy sudo systemctl start caddy

常用命令

# 启动服务 sudo systemctl start caddy # 停止服务 sudo systemctl stop caddy # 重启服务 sudo systemctl restart caddy # 重载配置(无需中断服务) sudo systemctl reload caddy # 查看状态 sudo systemctl status caddy # 查看日志 sudo journalctl -u caddy -f # 查看最近的错误 sudo journalctl -u caddy -p err # 开机自启 sudo systemctl enable caddy # 禁用开机自启 sudo systemctl disable caddy

配置更新工作流

使用 systemd 管理 Caddy 后,推荐的配置更新流程:

# 1. 在工作目录使用 CaddyHelper 修改配置 cd ~/caddy-config CaddyHelper site proxy --domain api.example.com --upstream 127.0.0.1:8080 # 2. 验证生成的配置 CaddyHelper validate # 3. 复制到系统目录 sudo cp Caddyfile /etc/caddy/Caddyfile # 4. 重载 Caddy(平滑更新,零停机) sudo systemctl reload caddy # 5. 检查状态 sudo systemctl status caddy

与 CaddyHelper daemon 的关系

两种管理方式的区别

特性CaddyHelper (start/stop)systemd
适用场景开发、测试生产环境
进程管理手动自动(守护进程)
开机自启不支持支持
日志管理文件journald
监控重启不支持支持
权限管理当前用户专用用户

选择建议

开发环境:使用 CaddyHelper start/stop

# 快速启动测试 CaddyHelper site static --domain localhost --root ./public CaddyHelper start # 修改配置后重启 CaddyHelper stop CaddyHelper start

生产环境:使用 systemd

# 配置生成 CaddyHelper site proxy --domain api.example.com --upstream 10.0.1.10:8080 sudo cp Caddyfile /etc/caddy/Caddyfile # 服务管理 sudo systemctl start caddy sudo systemctl enable caddy

故障排查

服务无法启动

# 查看详细错误信息 sudo systemctl status caddy -l # 查看完整日志 sudo journalctl -u caddy -xe # 手动测试 Caddy sudo -u caddy /usr/local/bin/caddy run --config /etc/caddy/Caddyfile

权限问题

# 检查文件权限 ls -la /etc/caddy/Caddyfile ls -la /var/lib/caddy ls -la /var/log/caddy # 修复权限 sudo chown -R caddy:caddy /var/lib/caddy sudo chown -R caddy:caddy /var/log/caddy sudo chown caddy:caddy /etc/caddy/Caddyfile # 检查 capabilities getcap /usr/local/bin/caddy # 应该显示:cap_net_bind_service=ep

端口冲突

# 检查端口占用 sudo ss -tlnp | grep :80 sudo ss -tlnp | grep :443 # 如果有其他服务占用,需要停止 sudo systemctl stop apache2 # 或 nginx

配置语法错误

# 使用 CaddyHelper 验证 CaddyHelper validate --config /etc/caddy/Caddyfile # 或直接使用 Caddy sudo -u caddy /usr/local/bin/caddy validate --config /etc/caddy/Caddyfile

安全建议

  1. 最小权限原则

    • 使用专用的 caddy 用户运行服务
    • 不要用 root 用户运行(除非绝对必要)
  2. 文件权限

    sudo chmod 640 /etc/caddy/Caddyfile sudo chmod 750 /var/lib/caddy
  3. 敏感信息

    • 不要在 Caddyfile 中硬编码 API token
    • 使用环境变量或 systemd 的 EnvironmentFile
  4. 日志轮转(可选):

    sudo tee /etc/logrotate.d/caddy > /dev/null <<EOF /var/log/caddy/*.log { daily rotate 14 compress delaycompress notifempty missingok postrotate systemctl reload caddy > /dev/null 2>&1 || true endscript } EOF

高级配置

环境变量配置

创建环境文件 /etc/caddy/caddy.env

# Cloudflare API Token CF_API_TOKEN=your_cloudflare_token # AliDNS credentials ALIYUN_ACCESS_KEY_ID=your_access_key ALIYUN_ACCESS_KEY_SECRET=your_secret

修改服务配置使用环境文件:

sudo tee /etc/systemd/system/caddy.service.d/env.conf > /dev/null <<EOF [Service] EnvironmentFile=/etc/caddy/caddy.env EOF sudo chmod 600 /etc/caddy/caddy.env sudo chown root:root /etc/caddy/caddy.env sudo systemctl daemon-reload

多实例运行

如果需要运行多个 Caddy 实例:

# 复制并重命名服务文件 sudo cp /etc/systemd/system/caddy.service /etc/systemd/system/caddy@.service # 编辑配置,使用实例名 sudo nano /etc/systemd/system/caddy@.service # 修改: # Environment="CADDYFILE=/etc/caddy/Caddyfile.%i" # 创建不同的配置文件 sudo cp /etc/caddy/Caddyfile /etc/caddy/Caddyfile.instance1 sudo cp /etc/caddy/Caddyfile /etc/caddy/Caddyfile.instance2 # 启动不同实例 sudo systemctl start caddy@instance1 sudo systemctl start caddy@instance2

参考资源