version: "3.9" services: headscale: image: headscale/headscale:latest container_name: headscale restart: unless-stopped ports: - "3478:3478/udp" - "8080:8080" volumes: - ./config:/etc/headscale - ./data:/var/lib/headscale command: headscale serve environment: - HEADSCALE_CONFIG=/etc/headscale/config.yaml labels: - "traefik.enable=true" - "traefik.http.routers.headscale.rule=Host(`headscale.example.com`)" - "traefik.http.routers.headscale.entrypoints=websecure" - "traefik.http.routers.headscale.tls.certresolver=letsencrypt" traefik: image: traefik:v3.0 container_name: traefik restart: unless-stopped command: - "--providers.docker=true" - "--entrypoints.web.address=:80" - "--entrypoints.websecure.address=:443" - "--certificatesresolvers.letsencrypt.acme.tlschallenge=true" - "--certificatesresolvers.letsencrypt.acme.email=admin@example.com" - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json" ports: - "80:80" - "443:443" volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - ./letsencrypt:/letsencrypt