Install with deploy.yaml
The raw manifest path for the control plane. Use this when you need a plain YAML file under GitOps. Use exo-install for the control plane, operator, and CRDs, with a separate database migration step.
deploy.yaml is a single-file manifest for the Industric control plane: a Namespace, a Secret, a ConfigMap, and a Deployment plus Service for exo-app. Control plane only. To bring agents online you still need the operator and CRD steps from exo-install, or the manifests & Helm chart.
When to use this
- You manage cluster state with Argo CD, Flux, or a kustomize tree and want the raw manifest checked in.
- You need to diff and review every RBAC or Secret change before it lands.
- You only need the control plane and will wire up the operator separately.
Prerequisites
- Kubernetes 1.27+ with cluster-admin access.
- An accessible Postgres 16 instance with a database for Industric.
- A way to expose
ClusterIPservices: ingress controller, service mesh, or port-forward for a demo.
Secrets
The stock file ships the Secret with changeme-* placeholders for all three values. Generate real ones before applying. None are recoverable if lost, so store them in a vault.
openssl rand -hex 16
openssl rand -base64 48
1stringData:2 EXO_JWT_SECRET: "<openssl rand -base64 48>"3 EXO_ENCRYPTION_KEY: "<openssl rand -hex 16>"4 EXO_DATABASE_DSN: "postgres://exo:<password>@<host>:5432/exo?sslmode=require"Required edits
- Replace the
changeme-*secrets. The stock Secret ships placeholder values forEXO_JWT_SECRET,EXO_ENCRYPTION_KEY, andEXO_DATABASE_DSN. Set all three. The backend refuses to boot ifEXO_ENCRYPTION_KEYisn't a real 32-byte key. - Pick your namespace. Every object ships in namespace
exo. Rename it (or leave it) consistently across the Namespace, Secret, ConfigMap, Service, and Deployment.
Apply
- Set the
exo-appDeployment toreplicas: 0indeploy.yaml, then apply it. - Run the target image's database migration with the same configuration. Stop if it fails.
- After success, restore the desired replica count and apply again.
kubectl apply -f deploy.yaml
kubectl -n exo rollout status deploy/exo-app
Reach the app
kubectl port-forward -n exo svc/exo-app 9092:9092
Sign up at localhost:9092. The first account becomes the org admin. From there, invite your team, mint a deployment token, and connect a cluster via the Industric Operator.
Ingress + TLS
The service is plain HTTP on port 9092. Terminate TLS at the ingress and point the upstream at the exo-app ClusterIP.
1apiVersion: networking.k8s.io/v12kind: Ingress3metadata:4 name: exo5 namespace: exo6 annotations:7 cert-manager.io/cluster-issuer: letsencrypt8spec:9 ingressClassName: nginx10 tls:11 - hosts:12 - app.exo.example.com13 secretName: exo-tls14 rules:15 - host: app.exo.example.com16 http:17 paths:18 - path: /19 pathType: Prefix20 backend:21 service:22 name: exo-app23 port:24 number: 9092proxy_read_timeout and ensure HTTP/1.1 upgrades are allowed.