v0.7.1 · updated · GitHub

Troubleshooting

permission denied reading /var/log/caddy/access.log

Caddy writes as caddy:caddy 0600.

sudo caddy-analyze /var/log/caddy/access.log
# or persistently
sudo usermod -aG caddy $USER
# re-login, then
caddy-analyze /var/log/caddy/access.log

Cannot connect to the Docker daemon / docker.sock: permission denied

sudo usermod -aG docker $USER  # re-login
# or
sudo caddy-analyze docker://caddy
# if guard must block host traffic too:
sudo caddy-analyze guard --firewall-backend hybrid docker://caddy

k8s:// — no such pod / cannot list resource

kubectl config current-context
kubectl get pods -n production | grep caddy
kubectl auth can-i get pods/log -n production
# fix namespace
caddy-analyze k8s://caddy-xxx -n production
caddy-analyze config k8s://caddy-xxx -n production  # remember

journalctl:// — No journal files

systemctl status caddy  # is it caddy.service?
journalctl -u caddy.service --no-pager | head
sudo usermod -aG systemd-journal $USER  # re-login
# or
sudo caddy-analyze journalctl://caddy.service

GeoIP — country/asn empty or download fails

Auto-download from P3TERX mirror to ~/.config/caddy-analyzer/GeoLite2-*.mmdb on first use.

ls ~/.config/caddy-analyzer/*.mmdb
# behind proxy
https_proxy=http://proxy:8080 caddy-analyze top country testdata/sample.log
# custom path
caddy-analyze --geoip-db /usr/share/GeoIP/GeoLite2-Country.mmdb top country testdata/sample.log
# tuning (see Configuration)
caddy-analyze --geo-cache-ttl 48h --geo-cache-size 100000 top country testdata/sample.log

guard — iptables: permission denied / No chain/target

Guard modifies firewall — must run as root.

sudo caddy-analyze guard /var/log/caddy/access.log
# timeout on huge ruleset
sudo caddy-analyze guard --iptables-timeout 30s /var/log/caddy/access.log
# Docker host needs DOCKER-USER
sudo caddy-analyze guard --firewall-backend hybrid docker://caddy

blocklist refresh slow / fails

caddy-analyze blocklist list
# behind proxy
https_proxy=http://proxy:8080 caddy-analyze blocklist refresh
# custom cache
caddy-analyze blocklist refresh --cache-dir /tmp/bl
# skip defaults
caddy-analyze blocklist refresh --no-default-blocklists --blocklist-config my.json

No output / empty report

Check filters: --from in the future, --ip CIDR mismatch, --country without GeoIP. Remove filters progressively.

caddy-analyze testdata/sample.log            # no filter → must show 68 lines
caddy-analyze --from 1h testdata/sample.log  # if 0, log is older than 1h
caddy-analyze --country IT testdata/sample.log  # if 0, GeoIP missing

Still stuck?

Open an issue with: caddy-analyze --version, full command, and the first 5 lines of the log (redact IPs). GitHub Issues