host: solaria services: node-agent: role: node-stability-monitor deployment_model: docker-compose exposure: local-only offline_required: true depends_on: local: [] external: [] runtime: config_path: /opt/homelab/config/node-agent data_path: /opt/homelab/state logs_path: /opt/homelab/events ai-cluster: role: ai-worker-cluster # openclaw API + codex/planner/service-ops workers + redis + mosquitto deployment_model: docker-compose exposure: tailscale-internal offline_required: false depends_on: local: [] external: - piha:llm-gateway # GATEWAY_BASE_URL — by IP, MagicDNS is off on SOLARIA ports: - name: openclaw-api container_port: 8000 bind: 100.100.231.104 protocol: tcp - name: mqtt container_port: 1883 bind: 100.100.231.104 protocol: tcp runtime: config_path: /opt/homelab/config/ai-cluster notes: - "AUTHORED, NOT DEPLOYED — the stack still runs on the VPS outside GitOps. See services/ai-cluster/CUTOVER.md." - "Images are built on-node from services/ai-cluster/src/ — nothing is pulled." - "Public access via NPM@VPS proxying to 100.100.231.104:8000 over Tailscale." ollama: role: llm-inference # GPU-backed inference (RTX 4070 Ti SUPER, driver restored 2026-07-16): embeddings (bge-m3) + coder models deployment_model: docker-compose exposure: private # Tailscale-only bind (TAILSCALE_BIND_IP) + loopback; consumed by llm-gateway@PIHA over mesh offline_required: false depends_on: local: [] external: [] ports: - name: http container_port: 11434 protocol: tcp runtime: # .env (TAILSCALE_BIND_IP) lives alongside the compose file, matching llm-gateway config_path: services/ollama data_path: /opt/homelab/data/ollama