# DigitalOcean Droplet one-shot deploy This deploy flow is for a single Ubuntu Droplet running: - k3s (single-node Kubernetes) - AntiAtropos sample workloads (`prod-sre`) - Prometheus + Grafana (`monitoring`) - lightweight control-plane API (`antiatropos-control` on port `8010`) The OpenEnv runtime (`server.app`) is intentionally **not** run on the droplet. The only supported split is: - local machine: OpenEnv server + inference loop - droplet: Kubernetes executor API + observability stack ## Run From repository root on the Droplet: ```bash sudo bash deploy/do/deploy-droplet-one-shot.sh ``` Optional overrides: ```bash sudo REPO_DIR=/opt/AntiAtropos CONTROL_PORT=8010 MAX_REPLICAS=200 bash deploy/do/deploy-droplet-one-shot.sh ``` ## What the script configures - k3s kubelet with `max-pods=250` - Prometheus service exposed on NodePort `30090` - Prometheus scrape job for annotated pods in namespace `prod-sre` - Env file at `.env.droplet` with: - `KUBECONFIG=/etc/rancher/k3s/k3s.yaml` - `ANTIATROPOS_WORKLOAD_MAP` for `node-0`..`node-4` - Systemd service: - Name: `antiatropos-control` - Exec: `uvicorn server.local_laptop_control:app --host 0.0.0.0 --port 8010` - Legacy cleanup: - `antiatropos-fastapi` (VM OpenEnv service) is disabled/removed by default deploy path ## Verify ```bash systemctl status antiatropos-control --no-pager curl http://127.0.0.1:8010/health kubectl get deploy -n prod-sre kubectl get pods -n monitoring curl http://127.0.0.1:30090/api/v1/targets kubectl -n monitoring port-forward svc/grafana 3000:80 ``` Set local `.env` to use this consolidated path: ```env ENV_URL=http://localhost:8000 ANTIATROPOS_CONTROL_PLANE_URL=http://:8010 PROMETHEUS_URL=http://:30090 ``` ## Deterministic remote-scaling proof On droplet, watch desired replicas: ```bash watch -n 1 'kubectl -n prod-sre get deploy -o custom-columns=NAME:.metadata.name,DESIRED:.spec.replicas,READY:.status.readyReplicas,AVAILABLE:.status.availableReplicas' ``` From local machine, send one control action: ```bash curl -X POST http://:8010/step \ -H "Content-Type: application/json" \ -d '{"action_type":"SCALE_UP","target_node_id":"node-0","parameter":1.0}' ``` If `payments` desired replicas increase, scaling is happening on droplet. ## Troubleshooting - **Pods do not move during inference** - Verify local env points to droplet control API: - `ANTIATROPOS_CONTROL_PLANE_URL=http://:8010` - Check droplet control health: - `curl http://127.0.0.1:8010/health` - Check service status: - `systemctl status antiatropos-control --no-pager` - **Connection refused from local to droplet:8010** - Service not running or firewall closed. - Start service and open firewall if needed. - **Need to remove legacy VM OpenEnv service** - `sudo bash deploy/do/uninstall-legacy-openenv.sh`