host: vps 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 control-plane: role: management-and-orchestration deployment_model: docker-compose exposure: tailscale-internal offline_required: false depends_on: local: - node-agent external: - piha:redis ports: - name: http container_port: 18180 protocol: tcp runtime: config_path: /opt/homelab/config/control-plane data_path: /opt/homelab/data/control-plane logs_path: /opt/homelab/logs/control-plane node_exporter: role: metrics-exporter deployment_model: docker-compose exposure: local-only offline_required: true depends_on: local: [] external: [] npm: role: reverse-proxy-ingress deployment_model: docker-compose exposure: public offline_required: false depends_on: local: [] external: [] ports: - name: http container_port: 80 protocol: tcp - name: https container_port: 443 protocol: tcp - name: admin container_port: 81 protocol: tcp runtime: data_path: /home/dockeruser/docker/npm/data config_path: /opt/homelab/config/npm outline: role: team-wiki deployment_model: docker-compose exposure: public offline_required: false depends_on: local: - npm external: [] ports: - name: http container_port: 3000 protocol: tcp runtime: config_path: /opt/homelab/config/outline joplin: role: note-sync-server deployment_model: docker-compose exposure: tailscale-internal offline_required: false depends_on: local: - npm external: [] ports: - name: http container_port: 22300 bind: 127.0.0.1 protocol: tcp runtime: config_path: /opt/homelab/config/joplin ai-cluster: role: ai-worker-cluster deployment_model: docker-compose exposure: tailscale-internal offline_required: false depends_on: local: [] external: - piha:gateway ports: - name: openclaw-api container_port: 8000 protocol: tcp - name: mqtt container_port: 1883 protocol: tcp bind: tailscale runtime: config_path: /opt/homelab/config/ai-cluster notes: - "Local images must be built on VPS — not pulled from registry" - "Compute workloads belong on SOLARIA; migrate when possible"