04 · Post-install validation
Prove the install is healthy before handing off to app teams.
Pod smoke test
kubectl get pods -n openbox
# Expect all Running/Ready. Count varies by variant:
# - Temporal Cloud variant: ~8-10 pods
# - Self-hosted Temporal variant: ~15-20 pods (adds temporal server ×4, ES ×3, admintools)
Investigate any pod in CrashLoopBackOff, Pending, or ImagePullBackOff:
kubectl describe pod <name> -n openbox
kubectl logs <name> -n openbox --previous
Backend health probe
kubectl port-forward -n openbox svc/openbox-backend 3000:3000 &
curl -sf http://localhost:3000/health
# Expect: {"status":"ok"}
curl -sf http://localhost:3000/readyz
# Expect: {"ready":true}
Keycloak first login
Get the bootstrap admin credentials Openbox chart creates on first install:
BOOTSTRAP_USER=$(kubectl get secret -n openbox identity-service-bootstrap \
-o jsonpath='{.data.username}' | base64 -d)
BOOTSTRAP_PASS=$(kubectl get secret -n openbox identity-service-bootstrap \
-o jsonpath='{.data.password}' | base64 -d)
echo "Admin user: $BOOTSTRAP_USER"
echo "Password: $BOOTSTRAP_PASS"
kubectl port-forward -n openbox svc/identity-service 8080:8080 &
# Open http://localhost:8080/admin/master/console/
# Log in with bootstrap creds; realms should include: master, openbox
Rotate the bootstrap password immediately — this account is only for initial setup.
OPA policy check
kubectl port-forward -n openbox svc/opa-app 8181:8181 &
curl -sf http://localhost:8181/health?bundle=true
# Expect: {} (200 OK)
curl -sf http://localhost:8181/v1/data
# Expect: JSON with your policy bundles from S3
If bundles are empty, verify opa-app env vars point to your S3 bundle bucket and IRSA is attached.
Guardrails end-to-end
kubectl port-forward -n openbox svc/guardrails-api 8000:8000 &
curl -sS http://localhost:8000/v1/scan \
-H 'Content-Type: application/json' \
-d '{"text":"My email is test@example.com"}' | jq .
# Expect: response includes detected PII entities
Ingress + TLS
# If using ALB Ingress Controller:
kubectl get ingress -n openbox
# Look for ADDRESS column populated with an ALB DNS name
DNS=$(kubectl get ingress openbox -n openbox -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
curl -sfI "https://${DNS}/"
# Expect: HTTP/2 200 (or 302 redirect to login)
Point your CNAME / ALIAS record to ${DNS} when ready to serve real users.
Backup verification
Run the first backup manually to prove the mechanism works before relying on the schedule:
# RDS: trigger manual snapshot
aws rds create-db-snapshot \
--db-instance-identifier openbox-prod \
--db-snapshot-identifier openbox-first-backup-$(date +%Y%m%d)
# Verify snapshot completes:
aws rds describe-db-snapshots \
--db-snapshot-identifier openbox-first-backup-$(date +%Y%m%d) \
--query 'DBSnapshots[0].Status'
# Expect: "available" (may take 5-15 min)
Sign-off checklist
- All pods Running/Ready
- Backend
/healthreturns 200 - Keycloak admin login works, bootstrap password rotated
- OPA
/v1/datareturns bundles from S3 - Guardrails PII detection returns expected entities
- Ingress serves 200 over TLS via public DNS
- RDS manual snapshot completed
-
helm history openbox -n openboxshows revision 1 deployed - Rollback dry-run:
helm rollback openbox 0 --dry-runsucceeds
If all check: install is production-ready. Hand off to app teams.
Ongoing operations
Openbox does not prescribe ops tooling. Choose your own for:
- Metrics/logs (Prometheus/Grafana, Datadog, ELK, etc.)
- Alerting rules
- On-call rota + escalation
- DR drill cadence
See System requirements — Network for what OpenBox exposes on /metrics.