Hanzo runs all production services on DOKS (DigitalOcean Kubernetes Service) clusters.
Category: Hanzo Ecosystem Related Skills: hanzo/hanzo-deploy.md, hanzo/hanzo-ingress.md, hanzo/hanzo-kms.md
Hanzo runs all production services on DOKS (DigitalOcean Kubernetes Service) clusters. Two primary clusters: hanzo-k8s for all Hanzo services and lux-k8s for Lux blockchain. All manifests live in the universe repo. Kustomize for manifest management, KMSSecret CRDs for secret sync, Hanzo Ingress (Traefik) for routing.
kubectl kustomize . | kubectl apply -f -postgres.hanzo.svc, no managed DB servicesingressClassName: hanzo on all Ingress resourcesghcr.io/hanzoai/<service>:<tag>, always --platform linux/amd64| Item | Value | |------|-------| | Provider | DigitalOcean Kubernetes (DOKS) | | Location | SFO3 | | Context | do-sfo3-hanzo-k8s | | Nodes | 22 (15 workers + 7 runners) | | LB IP | 165.232.146.176 | | Namespace | hanzo (primary) | | IngressClass | hanzo (Traefik) | | PostgreSQL | postgres.hanzo.svc:5432 | | Redis/Valkey | redis.hanzo.svc:6379 | | MongoDB | mongodb.hanzo.svc:27017 | | Hanzo S3 | s3.hanzo.svc:9000 |
| Item | Value | |------|-------| | Provider | DigitalOcean Kubernetes (DOKS) | | Location | SFO3 | | Context | do-sfo3-lux-k8s | | LB IP | 24.144.69.101 | | Services | 15 validators, gateway, markets, lux-cloud-web | | PostgreSQL | postgres.hanzo.svc:5432 |
| Domain | Backend Service | Port | |--------|-----------------|------| | hanzo.ai | hanzo-app | 3000 | | api.hanzo.ai | hanzo-gateway (KrakenD) | 8000 | | llm.hanzo.ai | hanzo-gateway | 8000 | | hanzo.id, lux.id, zoo.id, pars.id | IAM (Hanzo IAM) | 8000 | | kms.hanzo.ai | KMS (Hanzo KMS) | 8080 | | platform.hanzo.ai | Platform (Dokploy) | 3000 | | console.hanzo.ai | Console (Langfuse) | 3000 | | cloud.hanzo.ai | Cloud (Casibase) | 8000 | | chat.hanzo.ai | Chat (LibreChat) | 3080 | | hanzo.team | Team (Huly fork) | 8087 | | billing.hanzo.ai | Billing portal | 80 | | o11y.hanzo.ai | Hanzo o11y | 3301 |
| Domain | Backend Service | |--------|-----------------| | api.lux.network | KrakenD Gateway | | cloud.lux.network | Lux Cloud | | markets.lux.network | Markets |
postgres.hanzo.svc:5432
|- iam (Hanzo IAM)
|- cloud (Casibase)
|- console (Langfuse)
|- hanzo_cloud (Cloud API)
|- kms (Hanzo KMS)
|- platform (Dokploy)
postgres.hanzo.svc:5432
|- cloud
|- commerce
|- console
|- gateway
|- hanzo
|- kms
# List all pods
kubectl --context do-sfo3-hanzo-k8s -n hanzo get pods
# Check specific service
kubectl --context do-sfo3-hanzo-k8s -n hanzo get pods -l app=<service>
# View logs
kubectl --context do-sfo3-hanzo-k8s -n hanzo logs -l app=<service> --tail=100 -f
# Describe pod (for events/errors)
kubectl --context do-sfo3-hanzo-k8s -n hanzo describe pod <pod-name>
cd ~/work/hanzo/universe/infra/k8s/<service>
kubectl --context do-sfo3-hanzo-k8s kustomize . | kubectl apply -f -
# Access a service locally
kubectl --context do-sfo3-hanzo-k8s -n hanzo port-forward svc/<service> 8080:8080
# Access PostgreSQL
kubectl --context do-sfo3-hanzo-k8s -n hanzo port-forward svc/postgres 5432:5432
kubectl --context do-sfo3-hanzo-k8s -n hanzo scale deployment/<service> --replicas=3
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-service
namespace: hanzo
spec:
replicas: 2
selector:
matchLabels:
app: my-service
template:
metadata:
labels:
app: my-service
spec:
containers:
- name: my-service
image: ghcr.io/hanzoai/my-service:latest
ports:
- containerPort: 8080
envFrom:
- secretRef:
name: my-service-secrets # Synced from KMS
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 512Mi
livenessProbe:
httpGet:
path: /health
port: 8080
readinessProbe:
httpGet:
path: /ready
port: 8080
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-service
namespace: hanzo
annotations:
cert-manager.io/cluster-issuer: letsencrypt
spec:
ingressClassName: hanzo
tls:
- hosts:
- my-service.hanzo.ai
secretName: my-service-tls
rules:
- host: my-service.hanzo.ai
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service
port:
number: 8080
apiVersion: kms.hanzo.ai/v1
kind: KMSSecret
metadata:
name: my-service-secrets
namespace: hanzo
spec:
project: my-service
environment: production
syncInterval: 5m
secretRef:
name: my-service-secrets
secrets:
- DATABASE_URL
- API_KEY
| Pool | Count | Size | Purpose | |------|-------|------|---------| | worker-pool | 15 | 8vCPU/32GB | Application workloads | | runner-pool | 7 | 8vCPU/32GB | CI/CD self-hosted runners |
Runner pool is oversized (17-26% utilization). Plan to scale to 2 nodes.
| Issue | Cause | Solution | |-------|-------|----------| | Pod CrashLoopBackOff | Missing secrets | Check KMSSecret CRD is synced: kubectl get kmssecrets | | Ingress 404 | Wrong IngressClass | Ensure ingressClassName: hanzo | | DNS not resolving | Missing Cloudflare record | Add A record pointing to 165.232.146.176 | | Can't pull image | GHCR auth expired | Check imagePullSecrets on service account | | DB connection refused | Wrong host | Use postgres.hanzo.svc (in-cluster) not external URL | | Network policy blocking | Missing ingress rule | Add NetworkPolicy allowing ingress from Ingress controller |
hanzo/hanzo-deploy.md -- Deployment workflowhanzo/hanzo-ingress.md -- Ingress controllerhanzo/hanzo-kms.md -- Secret managementhanzo/hanzo-o11y.md -- ObservabilityLast Updated: 2026-03-23 Category: Hanzo Ecosystem Related: kubernetes, doks, infrastructure, cluster, k8s Prerequisites: kubectl, K8s cluster access, Cloudflare DNS