caddy web servr
Table of Contents
Pass IP address when running on a rootless Docker
mkdir -p ~/.config/systemd/user/docker.service.d/cat > ~/.config/systemd/user/docker.service.d/override.conf << EOF[Service]Environment=DOCKERD_ROOTLESS_ROOTLESSKIT_PORT_DRIVER="slirp4netns"EOFsystemctl --user daemon-reloadsystemctl --user restart dockerRate limits
(rate_limit) { rate_limit { zone per_ip { key {remote_ip} events 100 window 10s } zone global { key static events 1000 window 1s } }}followed by: import rate_limit under every domain
Before restarting:
caddy validate --config /etc/caddy/CaddyfileLogs (Apache / Common log)
$ caddy add-package github.com/caddyserver/transform-encoderand format transform "{common_log}"
to preserve on reboot (remote build server on Ubuntu way)
That creates a service that install extension required before the caddy start.
#!/usr/bin/env bashset -euo pipefail
sudo tee /etc/systemd/system/caddy-packages.service > /dev/null <<'EOF'[Unit]Description=Ensure Caddy custom packagesBefore=caddy.service
[Service]Type=oneshotExecStart=/usr/bin/caddy add-package github.com/caddyserver/transform-encoder github.com/mholt/caddy-ratelimitSuccessExitStatus=1
[Install]WantedBy=caddy.serviceEOF
sudo systemctl daemon-reload
sudo systemctl start caddy-packages.servicesudo systemctl status caddy-packages.service --no-pager # VERIFY IT DIDN'T FAIL!
sudo systemctl enable caddy-packages.servicesudo systemctl restart caddyforce to rebuild, if necessary:
sudo /usr/bin/caddy remove-package github.com/caddyserver/transform-encoder github.com/mholt/caddy-ratelimitsudo systemctl start caddy-packages.serviceto preserve on reboot (xcaddy Ubuntu way)
That creates a service that install extension required before the caddy start.
#!/usr/bin/env bashset -euo pipefail
sudo snap install go --classic
# Install xcaddy if neededif ! command -v xcaddy &>/dev/null; then sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl -1sLf 'https://dl.cloudsmith.io/public/caddy/xcaddy/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-xcaddy-archive-keyring.gpg curl -1sLf 'https://dl.cloudsmith.io/public/caddy/xcaddy/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-xcaddy.list sudo apt update && sudo apt install xcaddyfi
sudo tee /etc/systemd/system/caddy-packages.service > /dev/null <<'EOF'[Unit]Description=Ensure Caddy custom packagesBefore=caddy.service
[Service]Type=oneshotUser=rootEnvironment=HOME=/rootEnvironment=GOPATH=/tmp/goEnvironment=PATH=/snap/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binExecStart=xcaddy build --with github.com/caddyserver/transform-encoder --with github.com/mholt/caddy-ratelimit --output /usr/bin/caddy
[Install]WantedBy=caddy.serviceEOF
sudo systemctl daemon-reloadsudo systemctl start caddy-packages.servicesudo systemctl status caddy-packages.service --no-pager # VERIFY IT DIDN'T FAIL!sudo systemctl enable caddy-packages.servicesudo systemctl restart caddyUDP buffer (for QUIC)
https://github.com/quic-go/quic-go/wiki/UDP-Buffer-Sizes
Build for custom extensions - using Docker
https://caddyserver.com/docs/build#docker
Custom SSL certificate
add tls /etc/ssl/xyz.crt /etc/ssl/xyz.key just below domain’s name line.
crt & key files: seems like ‘crt and key files represent both parts of a certificate, key being the private key to the certificate and crt being the signed certificate.’ Or, ‘These are the public (.crt) and private (.key) parts of an SSL certificate.’
So, just upload those files, restart caddy and you are done!
Debug (including L4 level proxy)
As per:
Put the word
debugin your global options: https://caddyserver.com/docs/caddyfile/options#debug
nginx like log
https://github.com/caddyserver/transform-encoder/issues/38#issuecomment-1971081260
install caddy
Docker
wget -O - https://get.docker.com | sudo bash
services: caddy: image: caddy:2-alpine container_name: caddy restart: unless-stopped volumes: - ./Caddyfile:/etc/caddy/Caddyfile - ./caddy_data:/data - ./caddy_config:/config ports: - 80:80 - 443:443apt
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curlcurl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpgcurl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.listsudo apt updatesudo apt install caddyvi /etc/caddy/Caddyfile:
/etc/caddy/Caddyfile
{auto_https disable_redirects}
pre-billy.devneya.com { reverse_proxy localhost:80}
api.pre-billy.devneya.com { reverse_proxy localhost:3000}followed by service caddy restart.
In Docker compose:
mkdir caddy_data caddy_configNative
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curlcurl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpgcurl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.listsudo apt updatesudo apt install caddyvi /etc/caddy/Caddyfilesudo service caddy startjournalctl -f -u caddyXCaddy (custom modules)
sudo snap install go --classicsudo apt install -y debian-keyring debian-archive-keyring apt-transport-httpscurl -1sLf 'https://dl.cloudsmith.io/public/caddy/xcaddy/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-xcaddy-archive-keyring.gpgcurl -1sLf 'https://dl.cloudsmith.io/public/caddy/xcaddy/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-xcaddy.listsudo apt updatesudo apt install xcaddyL4 level proxy
Don’t know how to log - asked here. Interesting configs collection: https://github.com/mholt/caddy-l4/issues/209
Have www.example.com for now.