services: pangolin: image: docker.io/fosrl/pangolin:1.25.3 container_name: pangolin restart: unless-stopped volumes: - ./config:/app/config healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3001/api/v1/"] interval: "10s" timeout: "10s" retries: 15 gerbil: image: docker.io/fosrl/gerbil:1.5.2 container_name: gerbil restart: unless-stopped depends_on: pangolin: condition: service_healthy command: - --reachableAt=http://gerbil:3004 - --generateAndSaveKeyTo=/var/config/key - --remoteConfig=http://pangolin:3001/api/v1/ volumes: - ./config/:/var/config cap_add: - NET_ADMIN - SYS_MODULE ports: - "${WG_PORT:-51820}:51820/udp" # WireGuard site tunnels (Newt → Gerbil) - "${WG_CLIENT_PORT:-21820}:21820/udp" # WireGuard client tunnels - "${HTTPS_PORT:-8443}:443" # HTTPS (Traefik, via gerbil network) - "8800:80" # HTTP — Let's Encrypt / redirect (router forwards 80→8800) traefik: image: docker.io/traefik:v3.7.16 container_name: traefik restart: unless-stopped network_mode: service:gerbil # shares gerbil's network namespace depends_on: pangolin: condition: service_healthy command: - --configFile=/etc/traefik/traefik_config.yml volumes: - ./config/traefik:/etc/traefik:ro - ./config/letsencrypt:/letsencrypt - ./config/traefik/logs:/var/log/traefik networks: default: driver: bridge name: pangolin