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.
Prerequisites
- Kubernetes cluster (version 1.19+)
- Helm 3.x installed
kubectl configured to access your cluster
- At least 8GB of available memory and 4 CPU cores
- Persistent storage support (for databases and file storage)
Architecture Overview
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
Installation
Step 1: Clone the Repository
First, clone the OpenOps repository to access the Helm chart:
git clone https://github.com/openops-cloud/openops.git
cd openops
Step 2: Create Values Override File
Create a custom values file to override the default configuration. Start by copying the example:
cp deploy/helm/openops/values.overrides-example.yaml values.overrides.yaml
Edit 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-password
Make sure to generate strong, unique passwords and secrets. Never use the example values in production.
Step 3: Install the Helm Chart
Install OpenOps using Helm:
helm install openops ./deploy/helm/openops \
-n openops \
--create-namespace \
-f values.overrides.yaml
Step 4: Wait for Deployment
Monitor the deployment status:
kubectl get pods -n openops -w
Wait until all pods are in the Running state. This may take several minutes as images are pulled and databases are initialized.
Step 5: Access the Application
Get the external IP address of the nginx service:
kubectl get services/nginx -n openops
If you’re using a LoadBalancer service type, wait for the EXTERNAL-IP to be assigned. You can then access OpenOps at:
If you’re using NodePort or need to access via port-forward:
kubectl port-forward service/nginx 8080:80 -n openops
Then access OpenOps at http://localhost:8080.
Configuration
Storage Configuration
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: 20Gi
Resource Limits
Configure 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: 512Mi
Ingress Configuration
To 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.com
Upgrading
To 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.yaml
Uninstalling
To 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 openops
Deleting persistent volume claims will permanently delete all your data including workflows, connections, and analytics dashboards.
Troubleshooting
Common Issues
Pods 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
Viewing Logs
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 openops
Debugging
Access a pod for debugging:
kubectl exec -it deployment/openops-app -n openops -- /bin/bash
Support
For additional help: