version: '3.8' services: headscale: image: headscale/headscale:latest container_name: headscale restart: unless-stopped command: headscale serve environment: - TZ=Asia/Seoul volumes: - ./config:/etc/headscale - ./data:/var/lib/headscale - ./run:/var/run/headscale ports: - "8080:8080" # Headscale HTTP API - "9090:9090" # Metrics (optional) networks: - headscale-net healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s headplane: image: ghcr.io/tale/headplane:latest container_name: headplane restart: unless-stopped environment: - TZ=Asia/Seoul - HEADSCALE_URL=http://headscale:8080 - HEADSCALE_API_KEY=${HEADSCALE_API_KEY} ports: - "3000:3000" # Headplane Web UI depends_on: headscale: condition: service_healthy networks: - headscale-net networks: headscale-net: driver: bridge volumes: headscale_config: headscale_data: headscale_run: