name: headscale services: headscale: image: headscale/headscale:v0.29.2 container_name: headscale restart: unless-stopped command: ["serve", "-c", "/etc/headscale/config.yaml"] volumes: - ./headscale/config:/etc/headscale:ro - ./headscale/data:/var/lib/headscale - ./headscale/run:/var/run/headscale expose: - "8080" ports: - "3478:3478/udp" labels: - me.tale.headplane.target=headscale networks: - headscale-net headplane: image: ghcr.io/tale/headplane:0.7.0 container_name: headplane restart: unless-stopped depends_on: - headscale volumes: - ./headplane/config/config.yaml:/etc/headplane/config.yaml:ro - ./headplane/data:/var/lib/headplane - ./headscale/config:/etc/headscale:ro - /var/run/docker.sock:/var/run/docker.sock:ro expose: - "3000" networks: - headscale-net traefik: image: traefik:v3.7.9 container_name: traefik restart: unless-stopped command: - --configFile=/etc/traefik/traefik.yml healthcheck: test: ["CMD", "traefik", "healthcheck", "--ping"] interval: 5s timeout: 2s retries: 10 ports: - "80:80" - "443:443" volumes: - ./traefik/traefik.yml:/etc/traefik/traefik.yml:ro - ./traefik/dynamic:/etc/traefik/dynamic:ro - ./traefik/letsencrypt:/letsencrypt networks: - headscale-net networks: headscale-net: driver: bridge