Skip to content

caddy

Install Caddy on Ubuntu/Linux#

sudo apt update && sudo apt upgrade -y
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo tee /usr/share/keyrings/caddy-stable-archive-keyring.gpg >/dev/null
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy -y
caddy version

Start Caddy#

sudo systemctl start caddy

Stop Caddy#

sudo systemctl stop caddy

Restart Caddy#

sudo systemctl restart caddy

Check Caddy Status#

sudo systemctl status caddy

View Caddy Logs#

journalctl -u caddy -f

Validate Caddyfile#

caddy validate --config /etc/caddy/Caddyfile

Reload Caddy Without Downtime#

sudo caddy reload --config /etc/caddy/Caddyfile

Caddyfile Location#

/etc/caddy/Caddyfile

Edit Caddyfile#

sudo nano /etc/caddy/Caddyfile

Fix Caddyfile Permissions#

sudo chown -R caddy:caddy /etc/caddy

Mount Caddyfile in Docker#

volumes:
  - ./Caddyfile:/etc/caddy/Caddyfile

Docker Compose for Caddy#

services:
  caddy:
    image: caddy:2
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - caddy_data:/data
      - caddy_config:/config
    networks:
      - proxy

networks:
  proxy:
    driver: bridge

volumes:
  caddy_data:
  caddy_config:

Caddyfile Example#

:8080 {
    handle_path /api/* {
        reverse_proxy backend:8000
    }
    handle_path /ws/* {
        reverse_proxy backend:9000 {
            transport http {
                versions 1.1
            }
        }
    }
    handle {
        respond "Server Alive" 200
    }
}
api.a.com {
    reverse_proxy api:8000
}
api.b.com {
    reverse_proxy api2:8000
}

Reload Caddy in Docker#

docker exec -it caddy caddy reload --config /etc/caddy/Caddyfile

View Caddy Logs in Docker#

docker logs caddy -f

Important Naming Rule#

reverse_proxy service_name:port