services: headscale: image: headscale/headscale:latest container_name: headscale restart: unless-stopped environment: - TZ=Asia/Riyadh # CHANGE ME volumes: - ./conf:/etc/headscale - headscale-data:/var/lib/headscale entrypoint: headscale serve networks: - proxy labels: traefik.enable: "true" traefik.docker.network: proxy # Configure service and router traefik.http.services.headscale.loadbalancer.server.port: 8080 traefik.http.services.headscale.loadbalancer.server.scheme: http traefik.http.routers.headscale.rule: Host(`tailscale.YOURDOMAIN.com`) # CHANGE ME traefik.http.routers.headscale.entrypoints: https traefik.http.routers.headscale.tls.certresolver: cloudflare traefik.http.routers.headscale.service: headscale # Configure CORS middleware if needed traefik.http.middlewares.headscale-cors.headers.accesscontrolallowmethods: GET,POST,PUT,PATCH,DELETE,OPTIONS traefik.http.middlewares.headscale-cors.headers.accesscontrolallowheaders: "*" traefik.http.middlewares.headscale-cors.headers.accesscontrolalloworiginlist: https://tailscale.YOURDOMAIN.com # CHANGE ME AND Add other origins if needed traefik.http.middlewares.headscale-cors.headers.accesscontrolmaxage: 100 traefik.http.middlewares.headscale-cors.headers.addvaryheader: true traefik.http.routers.headscale.middlewares: headscale-cors # UDP ports for DERP, etc traefik.udp.services.headscale-udp-41641.loadbalancer.server.port: 41641 traefik.udp.services.headscale-udp-3478.loadbalancer.server.port: 3478 headscale-admin: image: goodieshq/headscale-admin:latest container_name: headscale-admin restart: unless-stopped networks: - proxy labels: traefik.enable: "true" traefik.docker.network: proxy traefik.http.services.headscale-admin.loadbalancer.server.port: 80 traefik.http.services.headscale-admin.loadbalancer.server.scheme: http traefik.http.routers.headscale-admin.rule: Host(`tailscale.YOURDOMAIN.com`) && PathPrefix(`/admin`) # CHANGE ME traefik.http.routers.headscale-admin.entrypoints: https traefik.http.routers.headscale-admin.tls.certresolver: cloudflare networks: proxy: external: true volumes: headscale-data: null