# Caddy

Reverse proxy, která vyřídí HTTPS sama a bez konfigurace. Pro homelab je to nejrozumnější volba a stránka o ní je krátká, protože není o čem psát.

## Minimální konfigurace

`Caddyfile`:

```
nas.example.cz {
    reverse_proxy 127.0.0.1:5000
}
```

To je celé. Caddy si při startu vyžádá certifikát od Let's Encrypt, nastaví přesměrování z HTTP na HTTPS, poskládá správný řetěz certifikátů, nastaví hlavičky `X-Forwarded-*` a zapne WebSockety.

Srovnej to s ekvivalentem v [nginxu](Nginx). To je ten důvod.

## Víc služeb

```
nas.example.cz {
    reverse_proxy 127.0.0.1:5000
}

foto.example.cz {
    reverse_proxy 127.0.0.1:2283
    request_body {
        max_size 50GB
    }
}

home.example.cz {
    reverse_proxy 127.0.0.1:8123
}

git.example.cz {
    reverse_proxy 127.0.0.1:3000
}
```

## Docker Compose

```yaml
services:
  caddy:
    image: caddy:2
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
      - "443:443/udp"     # HTTP/3
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data
      - caddy_config:/config
    networks: [web]

volumes:
  caddy_data:
  caddy_config:
```

**Svazek `caddy_data` musí být trvalý.** Jsou v něm certifikáty. Když ho ztratíš při každém restartu, budeš si o certifikáty žádat pořád dokola a Let's Encrypt tě po pár dnech omezí. Viz [certifikáty](Certifikaty-a-Lets-Encrypt).

V Compose se na ostatní služby odkazuješ jménem kontejneru:

```
foto.example.cz {
    reverse_proxy immich:2283
}
```

Souvislosti v [sítích v Dockeru](Site-v-Dockeru).

## Užitečné věci

**Přesměrování:**

```
example.cz {
    redir https://www.example.cz{uri} permanent
}
```

**Statické soubory:**

```
example.cz {
    root * /var/www/example
    file_server
    encode gzip zstd
}
```

**Bezpečnostní hlavičky:**

```
nas.example.cz {
    reverse_proxy 127.0.0.1:5000
    header {
        Strict-Transport-Security "max-age=31536000"
        X-Content-Type-Options nosniff
        X-Frame-Options SAMEORIGIN
        -Server
    }
}
```

To `-Server` hlavičku odstraní.

**Omezení podle IP:**

```
proxmox.example.cz {
    @nepovolene not remote_ip 192.168.1.0/24 10.10.0.0/24
    respond @nepovolene "Nope" 403
    reverse_proxy 127.0.0.1:8006
}
```

**Základní přihlášení:**

```
tajne.example.cz {
    basic_auth {
        martin $2a$14$hashhashhash
    }
    reverse_proxy 127.0.0.1:9000
}
```

Hash vygeneruješ přes `caddy hash-password`.

**Vnitřní služba s vlastním certifikátem:**

```
router.doma {
    tls internal
    reverse_proxy 192.168.1.1
}
```

`tls internal` vytvoří vlastní certifikační autoritu. Pro vnitřní služby, kde nemáš veřejnou doménu.

Kořenový certifikát musíš rozvézt na zařízení, jinak budou hlásit varování dál — na místním stroji stačí `caddy trust`, jinde je to ruční práce. Souvislosti a omezení ve [vlastní certifikační autoritě](Vlastni-certifikacni-autorita).

## Wildcard certifikát

Pro `*.example.cz` potřebuješ DNS-01 ověření, které vyžaduje sestavení Caddy s pluginem pro tvého DNS poskytovatele:

```dockerfile
FROM caddy:2-builder AS builder
RUN xcaddy build --with github.com/caddy-dns/cloudflare

FROM caddy:2
COPY --from=builder /usr/bin/caddy /usr/bin/caddy
```

```
*.example.cz {
    tls {
        dns cloudflare {env.CF_API_TOKEN}
    }
    @nas host nas.example.cz
    handle @nas {
        reverse_proxy 127.0.0.1:5000
    }
    @foto host foto.example.cz
    handle @foto {
        reverse_proxy 127.0.0.1:2283
    }
}
```

Podrobněji o rozdílu mezi HTTP-01 a DNS-01 v [certifikátech](Certifikaty-a-Lets-Encrypt).

## Diagnostika

```bash
caddy validate --config /etc/caddy/Caddyfile
caddy fmt --overwrite /etc/caddy/Caddyfile
systemctl reload caddy
journalctl -u caddy -f
docker compose logs -f caddy
```

| Problém | Příčina |
|---|---|
| Certifikát se nevydá | port 80 není dostupný zvenku, nebo DNS nesměřuje sem |
| `502` | služba za proxy neběží, nebo špatné jméno kontejneru |
| Po restartu nový certifikát | svazek `/data` není trvalý |
| Wildcard nefunguje | chybí DNS plugin, HTTP-01 wildcard neumí |

## Kdy Caddy nestačí

Když potřebuješ jemné ladění výkonu, exotické moduly, nebo když už máš nginx konfiguraci, kterou nechceš přepisovat. Pro všechno ostatní v homelabu je Caddy méně práce a méně chyb.
