You can find an example systemd service here, but here’s mine:
/etc/systemd/systemd/caddy.service
[Unit]
Description=Caddy HTTP/2 web server
Documentation=https://caddyserver.com/docs
After=network-online.target
Wants=network-online.target systemd-networkd-wait-online.service
[Service]
Restart=on-abnormal
LimitNOFILE=16384
EnvironmentFile=/etc/default/caddy
ExecStart=/usr/local/bin/caddy -log stdout -ca=${TLS_CA} -agree=true -conf=${CONFIG_FILE} -root=${ROOT_DIR} -email ${TLS_EMAIL} -port ${DEFAULT_PORT}
ExecReload=/bin/kill -USR1 $MAINPID
; Use graceful shutdown with a reasonable timeout
KillMode=mixed
KillSignal=SIGQUIT
TimeoutStopSec=5s
[Install]
WantedBy=multi-user.target
/etc/default/caddy
# Caddy Defaults
CONFIG_FILE="/mnt/web-balancer/caddy.cf"
DEFAULT_PORT="80"
## CloudFlare
CF_API_EMAIL="<email>"
CF_API_KEY="<API>"
## TLS Options
TLS_EMAIL="pki@domain.com"
# Staging
#TLS_CA="https://acme-staging-v02.api.letsencrypt.org/directory"
# Production
#TLS_CA="https://acme-v02.api.letsencrypt.org/directory"
# Caddy uses this for it's home directory
# https://caddyserver.com/docs/automatic-https
CADDYPATH="/mnt/web-balancer/"
ROOT_DIR="/mnt/web-balancer"