Caddy

Reverse proxy for *.ops.eblu.me services with automatic TLS via ACME DNS-01.

Quick Reference

PropertyValue
Domain*.ops.eblu.me
HTTPS Port443
Configansible/roles/caddy/templates/Caddyfile.j2
BinaryCustom build with Gandi DNS plugin

Why Caddy?

Caddy provides a single TLS termination point for all BlumeOps services:

  • Wildcard certificate for *.ops.eblu.me via Let’s Encrypt
  • DNS-01 challenge using Gandi API (no port 80 needed)
  • Unified access from k8s pods, containers, and tailnet clients

See routing for when to use *.ops.eblu.me vs *.tail8d86e.ts.net.

Proxied Services

Indri-Local Services

SubdomainBackendService
forge.ops.eblu.melocalhost:3001forgejo
registry.ops.eblu.melocalhost:5050zot
jellyfin.ops.eblu.melocalhost:8096jellyfin

Kubernetes Services

K8s services are proxied via their Tailscale Ingress endpoints:

SubdomainBackendService
grafana.ops.eblu.megrafana.tail8d86e.ts.netgrafana
argocd.ops.eblu.meargocd.tail8d86e.ts.netargocd
docs.ops.eblu.medocs.tail8d86e.ts.netdocs (now publicly available at docs.eblu.me via flyio-proxy)
feed.ops.eblu.mefeed.tail8d86e.ts.netminiflux
(see defaults/main.yml for full list)

TCP Services (Layer 4)

PortBackendService
2222localhost:2200Forgejo SSH
5432pg.tail8d86e.ts.net:5432postgresql

Configuration

Caddy is managed via the caddy Ansible role:

# Deploy caddy changes
mise run provision-indri -- --tags caddy

Key files:

  • ansible/roles/caddy/defaults/main.yml - Service definitions
  • ansible/roles/caddy/templates/Caddyfile.j2 - Caddy config template

Secrets

SecretSourceDescription
GANDI_BEARER_TOKEN1PasswordAPI token for DNS-01 challenges

The token is written to ~/.config/caddy/gandi-token (chmod 0600) and sourced by the Caddy wrapper script.

Custom Build

Caddy is built from source with the Gandi DNS plugin:

# Build location
~/code/3rd/caddy/bin/caddy

The build includes the github.com/caddy-dns/gandi plugin for ACME DNS-01 challenges.

  • gandi - DNS hosting and ACME DNS-01 provider
  • routing - Service routing architecture
  • forgejo - Git forge (proxied by Caddy)
  • zot - Container registry (proxied by Caddy)
  • tailscale-operator - K8s services use Tailscale Ingress, then Caddy