Commit

36afad9

Merged. For every component in the "What runs", let's remove the black box with "Shows up at" and "Needs". Replace with a behavior section.
Like it. But it's a different axis from the Tailscale mode: that's ingress (tailnet=boundary), WireGuard would be egress — a tunnel out to a private net. Needs NET_ADMIN + /dev/net/tun, so same 'host relaxes sandbox' tier as Docker. Use case — reaching internal services?
Ah, so it's ingress after all — a self-hosted tailnet. Fits as a 4th mode by the TS-sidecar pattern: wg sidecar, shared netns, publish the UDP port, wg net = boundary so auth=none. Cost vs Tailscale: no coordinator, you hand-manage keys+peers. Want me to spec it?
Grill Q1 (root): is WireGuard a new deployment MODE — mutually exclusive with local/domain/tailnet, i.e. it IS the boundary — or a component layered on another mode? My rec: a 4th mode. Like the tailnet it sets PUBLIC_URL, port layout, and auth=none default. Agree?
Hmm, not sure if we can modularize them like we did components. Like: + expose + port mappings + Caddy ingress + Tailscale + Wireguard what do you think
Blocker to free checkboxes: the network namespace. Tailscale & WireGuard each work by the app sharing the sidecar's netns — you can share only one. So the VPNs can't stack with each other, nor with host port-mappings. Only Caddy-vs-raw-expose is a cleanly separable layer, and…
Two axes, not N checkboxes. AXIS A — L3 reach (pick ONE; it owns the netns): - loopback: 127.0.0.1 only, bring your own proxy - published: host port mappings on 0.0.0.0 - tailscale: sidecar, tailnet = boundary - wireguard: sidecar, wg net = boundary…
Good catch — yes. Call it 'internal': no host ports, container exposed only on the compose network; Dokploy's Traefik (or any sibling proxy) joins that net and does ingress+TLS. It's distinct from loopback: loopback = a proxy on the HOST, internal = a proxy in a CONTAINER on the…
AXIS A — Title: 'How is it reached?' (pick one) Internal (behind an orchestrator) ✓ No host ports; exposed only on the compose network ✓ Dokploy/Traefik or a sibling proxy routes in and does TLS ⚠ Proxy is usually public — auth required by default → PUBLIC_URL is whatever…
Right now it's ALREADY two Caddys: an inner gateway Caddy (runs as 'gateway', does forward_auth + routing on 8080) and, in domain mode, a sidecar caddy:2-alpine that only TLS-terminates and reverse_proxies to agent-env:8080. I'd collapse to inner-only. The inner Caddy already…
After the collapse, domain mode is just the agent-env container — no sidecar:
services:
  agent-env:
    image: ghcr.io/dtinth/agent-env
    ports:
      - "80:80"      # ACME + http->https redirect
      - "443:443"    # the gateway, over TLS
      - "2222:22"
    volumes:
      - agent-env-state:/var/lib/agent-env   # now also holds certs
The inner Caddyfile just swaps its site address (everything below it is unchanged): domain mode: yourdomain.com { # Caddy auto-provisions the cert <forward_auth + routes> } otherwise: :8080 { # plain, behind your own proxy / VPN <same blocks> } Gone: the whole caddy service, caddy_data/caddy_config, and the reverse_proxy agent-env:8080 hop. Certs persist under the state volume (gateway owns that dir). Binding 443 is fine — the inner Caddy already has cap_net_bind_service.

commit 36afad9