| title | Kubernetes with Helm |
|---|---|
| description | Deploy OpenOps on Kubernetes using Helm charts |
| icon | dharmachakra |
import UpdateCredentials from '/snippets/env-update-credentials.mdx';
This guide explains how to deploy OpenOps on a Kubernetes cluster using the official Helm chart. The Helm chart provides a complete OpenOps stack with all necessary components.
Before following the instructions, make sure that your Kubernetes cluster meets the system requirements for OpenOps.
The Helm chart is currently a work in progress and may not be production-ready. Use with caution in production environments.- Kubernetes cluster (version 1.19+)
- Helm 3.x installed
kubectlconfigured to access your cluster- At least 8GB of available memory and 4 CPU cores
- Persistent storage support (for databases and file storage)
The Helm chart deploys the following components:
- nginx: Reverse proxy and load balancer (exposed via LoadBalancer)
- openops-app: Main application server
- openops-engine: Task execution engine
- openops-tables: Data tables service (Baserow)
- openops-analytics: Analytics dashboard (Superset)
- postgres: PostgreSQL database
- redis: Redis cache
First, clone the OpenOps repository to access the Helm chart:
git clone https://github.com/openops-cloud/openops.git
cd openopsCreate a custom values file to override the default configuration. Start by copying the example:
cp deploy/helm/openops/values.overrides-example.yaml values.overrides.yamlEdit values.overrides.yaml and customize the following required values:
openopsEnv:
# Replace with your actual domain or IP
OPS_PUBLIC_URL: "http://your-domain.com"
# Admin credentials - change these!
OPS_OPENOPS_ADMIN_EMAIL: admin@your-domain.com
OPS_OPENOPS_ADMIN_PASSWORD: your-secure-password
# Security keys - generate new ones!
OPS_ENCRYPTION_KEY: your-32-character-encryption-key
OPS_JWT_SECRET: your-jwt-secret
OPS_POSTGRES_PASSWORD: your-postgres-password
OPS_ANALYTICS_ADMIN_PASSWORD: your-analytics-password
ANALYTICS_POWERUSER_PASSWORD: your-poweruser-passwordInstall OpenOps using Helm:
helm install openops ./deploy/helm/openops \
-n openops \
--create-namespace \
-f values.overrides.yamlMonitor the deployment status:
kubectl get pods -n openops -wWait until all pods are in the Running state. This may take several minutes as images are pulled and databases are initialized.
Get the external IP address of the nginx service:
kubectl get services/nginx -n openopsIf you're using a LoadBalancer service type, wait for the EXTERNAL-IP to be assigned. You can then access OpenOps at:
http://<EXTERNAL-IP>
If you're using NodePort or need to access via port-forward:
kubectl port-forward service/nginx 8080:80 -n openopsThen access OpenOps at http://localhost:8080.
The chart creates PersistentVolumeClaims for:
- PostgreSQL data (20Gi)
- Redis data (5Gi)
- Tables data (10Gi)
To use a specific storage class, update your values file:
postgres:
storage:
storageClass: "your-storage-class"
size: 50Gi
redis:
storage:
storageClass: "your-storage-class"
size: 10Gi
tables:
storage:
storageClass: "your-storage-class"
size: 20GiConfigure resource limits for better resource management:
app:
resources:
limits:
cpu: 2000m
memory: 4Gi
requests:
cpu: 500m
memory: 1Gi
engine:
resources:
limits:
cpu: 2000m
memory: 2Gi
requests:
cpu: 500m
memory: 512MiTo use an Ingress controller instead of LoadBalancer:
nginx:
service:
type: ClusterIP
ingress:
enabled: true
className: "nginx"
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-prod"
hosts:
- host: openops.your-domain.com
paths:
- path: /
pathType: Prefix
tls:
- secretName: openops-tls
hosts:
- openops.your-domain.comTo upgrade your OpenOps installation:
# Update the repository
git pull origin main
# Upgrade the release
helm upgrade openops ./deploy/helm/openops \
-n openops \
-f values.overrides.yamlTo completely remove OpenOps:
# Delete the Helm release
helm uninstall openops -n openops
# Delete persistent volumes (optional - this will delete all data)
kubectl delete pvc -n openops --all
# Delete the namespace
kubectl delete namespace openopsPods stuck in Pending state:
- Check if your cluster has sufficient resources
- Verify storage classes are available
- Check node selectors and taints
Database connection errors:
- Ensure PostgreSQL pod is running and ready
- Check database credentials in your values file
- Verify network policies allow communication
External access issues:
- Confirm LoadBalancer service has an external IP
- Check firewall rules and security groups
- Verify DNS configuration if using custom domains
Check application logs:
# Main application logs
kubectl logs -f deployment/openops-app -n openops
# Engine logs
kubectl logs -f deployment/openops-engine -n openops
# Database logs
kubectl logs -f deployment/postgres -n openopsAccess a pod for debugging:
kubectl exec -it deployment/openops-app -n openops -- /bin/bashFor additional help:
- Join our Slack community
- Check the GitHub repository for issues
- Review Kubernetes and Helm documentation for cluster-specific issues