Caddy

HTTPS

运行与守护

交给 systemd,或者用容器跑;把端口和数据目录安排妥当。

Caddy 是服务器,会一直跑着。正式环境里不要靠 SSH 会话里的前台进程来维持它,交给系统的服务管理器。

Linux systemd 服务

Debian 系的官方包会自动启动名为 caddy 的服务。Fedora 系的包带着单元文件但默认未启用,需要手动开启:

终端
sudo systemctl enable --now caddy
sudo systemctl status caddy
sudo systemctl reload caddy

服务的配置文件在 /etc/caddy/Caddyfile,数据在/var/lib/caddy。改完配置用 systemctl reload caddy做零停机重载,不要 restart。

Docker Compose

docker-compose.yml
services:
  caddy:
    image: caddy
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
      - "443:443/udp"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data
      - caddy_config:/config

volumes:
  caddy_data:
  caddy_config:

443/udp 是 HTTP/3 用的,别漏。数据卷必须持久,否则每次重建容器都会重新签证书。

手动装成服务

静态二进制也可以注册成 systemd 服务,单元文件大致如下:

caddy.service
[Unit]
Description=Caddy
After=network.target network-online.target
Requires=network-online.target

[Service]
User=caddy
Group=caddy
ExecStart=/usr/local/bin/caddy run --environ --config /etc/caddy/Caddyfile
ExecReload=/usr/local/bin/caddy reload --config /etc/caddy/Caddyfile --force
TimeoutStopSec=5s
LimitNOFILE=1048576
PrivateTmp=true
ProtectSystem=full

[Install]
WantedBy=multi-user.target

绑定低端口

非 root 用户绑定 80、443 需要额外授权。Linux 上一条命令搞定:

终端
sudo setcap cap_net_bind_service=+ep ./caddy

如果不想每次都输密码,可以用 sudo visudo 允许特定用户免密执行setcap。请谨慎对待这类授权。

目录约定

目录用途
$XDG_DATA_HOME/caddy数据目录:证书、私钥、本地 CA
$XDG_CONFIG_HOME/caddy配置目录:自动保存的配置快照
/etc/caddyDebian 系发行版的主配置位置
/var/lib/caddyDebian 系发行版的数据目录

数据目录必须可写且持久,这是证书自动续期的前提。怀疑环境有问题时,用caddy environ 看 Caddy 实际拿到的环境变量。

防火墙

至少开放这些端口:

端口协议用途
80TCPHTTP 跳转与 HTTP-01 挑战
443TCPHTTPS 与 TLS-ALPN-01 挑战
443UDPHTTP/3
2019仅本机管理端点