pip install ragleap-ops package. For the hosted business platform (AI Office, WhatsApp/Voice bots, billing), see docs.ragleap.com instead.
ragleap-ops
Kubernetes Deployment and Service manifests, plus a Helm chart wrapping them, for RagLeap Core — translated field-by-field from the real docker-compose.yml and proven against a live cluster.
Install
The Python package itself ships no functional code — it exists so this content can be versioned and released through the same PyPI pipeline as the other RagLeap packages. The real deliverable is the k8s/ directory.
pip install ragleap-ops # or, with uv uv add ragleap-ops
What's inside
Deployment + Service manifests for all four docker-compose.yml services, plus the Secrets/PVCs/ConfigMap they depend on.
db-deployment.yamlpgvector/pgvector:pg16. PVC-backed, schema loaded via a ConfigMap generated from the real db/schema.sql.app-deployment.yamlghcr.io/antonyrag/ragleap-app:latest, built from the repo-root Dockerfile. Waits on db via an init container polling pg_isready.voice-deployment.yamlapp, command overridden to python3 -m channels.voice.server, listens on 8765.neo4j-deployment.yamlneo4j:5-community, ports 7474/7687, PVC-backed, readiness via HTTP check against 7474.Apply order
Dependency order matters — app/voice won't start cleanly without db already healthy.
kubectl apply -f db-secret.yaml -f neo4j-secret.yaml -f db-schema-configmap.yaml kubectl apply -f db-pvc.yaml -f neo4j-pvc.yaml kubectl apply -f db-deployment.yaml -f db-service.yaml kubectl rollout status deployment/ragleap-db kubectl apply -f app-deployment.yaml -f voice-deployment.yaml -f neo4j-deployment.yaml kubectl apply -f app-service.yaml -f voice-service.yaml -f neo4j-service.yaml
Two files are intentionally not shipped in the package (see .gitignore) since they'd otherwise bake real secret values into git history — generate them locally:
kubectl create secret generic ragleap-app-env \ --from-env-file=.env --dry-run=client -o yaml > app-env-secret.yaml
Known limitations
Drawn from a real deploy against a local kind cluster this session — including a bug that only surfaced under live testing, not from writing the manifests correctly the first time.
- No Helm chart yet. Raw manifests were proven first via live cluster testing; Helm wrapping is planned next.
- PVC storage sizes (5Gi) are placeholder defaults.
docker-compose.yml's named volumes are unbounded, so there was no real size to translate from — size for your own capacity needs. - A liveness-probe timing bug was found and fixed via live testing. The original
dbprobe'sinitialDelaySeconds: 10was too short for first-boot image pull + PVC attach, causing kubelet to kill a container that was still legitimately starting. Fixed toinitialDelaySeconds: 45,failureThreshold: 6, then re-verified with zero restarts. - GHCR image visibility. The private-to-public toggle wasn't reachable via the GitHub API in this environment, so
app/voiceauthenticate via animagePullSecretrather than relying on a public image.