Self-hosting
Interactive walkthrough for installing the Dibbla platform on your own Kubernetes cluster.
This is the guided path. Make a few choices and we’ll walk you through logging into your server, bootstrapping the cluster, gathering secrets, installing the platform, wiring TLS, and the first sign-in — and generate a tailored values.yaml you can copy. For the full per-component reference, see the Self-host section.
Hover the ? next to each row if you’re unsure which option to pick.
Pick your install method
Two paths from here. They produce the same result.
Option A — Interactive installer $ recommended
Copy-paste this into a terminal that has kubectl pointed at your target cluster. The installer is a Bash script that pre-flights your tools, asks the same questions as this page, generates dibbla-values.yaml, and runs helm install for you. It also auto-detects your ingress IP, validates DNS with dig, and waits for cert-manager to issue your TLS cert.
curl -sfL https://dibbla-docs-b4687da9.dibbla.app/installer.sh | bashIf you’d rather read the script first, download it and look:
curl -O https://dibbla-docs-b4687da9.dibbla.app/installer.sh
less installer.sh
bash installer.shThe script never modifies your shell, never installs anything system-wide, and writes a single file (dibbla-values.yaml) to your current directory. Re-running it upgrades an existing release rather than reinstalling.
Option B — Step-by-step $ manual
Continue scrolling. Each step below is what the installer does, but you run the commands yourself. Pick this path if you want to read the chart’s values, integrate with your own automation, or you don’t trust curl … | bash (fair).
0. Log into your server
You already have a Kubernetes cluster — skip to step 1. The rest of the
install runs from your laptop using kubectl, not from the server itself.
Open a terminal on your laptop and SSH into the Linux VM you’ll install
Dibbla on. Replace <your-server-ip> with the public IP of your server.
ssh ubuntu@<your-server-ip> ssh admin@<your-server-ip> # or `debian@` on some images ssh ec2-user@<your-server-ip> # or `rocky@`, `cloud-user@`, etc. ssh <your-user>@<your-server-ip> If you’d rather work as root and your image allows it, swap the user above for root. Every command in the next steps assumes you can run things with sudo.
1. Bring up your cluster
Make sure your cluster meets the overview prerequisites: Kubernetes 1.27+, an ingress controller (nginx or Traefik), a default StorageClass, and ideally cert-manager already installed. Then skip ahead to step 2.
k3s installs in one line. The bundled Traefik ingress, a local-path
StorageClass, and ServiceLB are all set up automatically.
curl -sfL https://get.k3s.io | sh -For multi-node setups and the kubeconfig dance, see the k3s reference. After the cluster is up, install cert-manager once per cluster:
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/latest/download/cert-manager.yaml
kubectl -n cert-manager wait --for=condition=Available --timeout=180s deployment --all MicroK8s is snap-based and uses addons for the heavy components.
MicroK8s ships as a snap, which is native on Ubuntu but requires installing
snapd first on RHEL-family or other distros. If you haven’t done that
setup, k3s is a smoother path on this OS.
sudo snap install microk8s --classic
sudo usermod -a -G microk8s $USER
newgrp microk8s
microk8s status --wait-ready
microk8s enable dns hostpath-storage ingress cert-managerFor multi-node setups and addon details, see the MicroK8s reference.
Point a wildcard DNS record at your ingress
*.example.com. IN A <your-ingress-ip>
example.com. IN A <your-ingress-ip>
The platform routes deployed apps by Host header, so a single wildcard covers every app you’ll ever deploy.
2. Gather secrets
You’ll collect a few things before installing. Some are generated locally; one is issued by Dibbla.
- GHCR PAT — a GitHub access token with
read:packagesscope that lets your cluster pull platform images fromghcr.io/dibbla-agents/*. The Dibbla team issues this to you — email [email protected] and we’ll send one. You can’t generate it yourself; the platform images are private and the PAT is scoped to a Dibbla-managed account.
Self-hosted auth additionally needs OAuth credentials and signing keys you generate yourself:
- A Google OAuth client — register one in the Google Cloud Console (type: Web application) and capture the client ID and client secret. (Microsoft Entra also works — see the auth reference.)
- A JWT secret and a signing key — generate each by running
openssl rand -hex 32once locally. Store them in a secret manager — rotating either invalidates every token your platform has ever issued.
Hosted auth doesn’t need OAuth or signing keys — Dibbla manages those for you. After the platform is running you’ll mint a long-lived API token from app.dibbla.com → Settings → API tokens.
The bundled Postgres needs two passwords — one for the dibbla user, one
for the postgres superuser. Generate any way you like (openssl rand -base64 24
is a fine choice).
External data plane needs Postgres + Redis credentials for your managed instances — host, port, username, password, and (for Postgres) the SSL mode your provider expects. Postgres must be reachable from the cluster and accept the credentials; the auth-service runs its own migrations on first start.
3. Your tailored values.yaml
values.yaml is the configuration file Helm reads when installing Dibbla into your cluster — it’s how you tell the chart your domain, your secrets, which ingress class to use, whether to bundle Postgres and Redis, and how to handle TLS. The block below is generated from your choices above. Copy it, replace every <your-…> placeholder with a real value, and save it as values.yaml on the machine you’ll run helm install from.
global:
baseDomain: example.com
imagePullSecret:
create: true
registry: ghcr.io
username: <your-github-username>
token: <your-ghcr-pat>
postgresql:
enabled: true
username: dibbla
password: <your-postgres-password>
superuserPassword: <your-postgres-superuser-password>
redis:
enabled: true
minio:
enabled: true
rootUser: minio
rootPassword: <your-minio-root-password>
loki:
enabled: true
alloy:
enabled: true
auth-service:
google:
clientId: <your-google-client-id>
clientSecret: <your-google-client-secret>
# microsoft: # uncomment to enable Microsoft Entra
# clientId: <your-ms-client-id>
# clientSecret: <your-ms-client-secret>
# tenantId: <your-ms-tenant-id>
jwt:
secret: <your-jwt-secret>
signingKey: <your-signing-key>
redirectBaseUrl: https://app.example.com
allowedRedirectBaseUrls: https://app.example.com
api-gateway:
ingress:
enabled: true
type: standard
className: nginx
hosts:
- host: app.example.com
- host: api.example.com
annotations:
cert-manager.io/cluster-issuer: letsencrypt
tls:
- secretName: dibbla-tls
hosts:
- app.example.com
- api.example.com
deploy-api:
ingressClass: nginx
workflow-server:
rootToken: <your-workflow-root-token>
oauthEncryptionKey: <your-oauth-encryption-key>
googleClientId: <your-google-client-id> # mirror auth-service
googleClientSecret: <your-google-client-secret>
jwtSecret: <your-jwt-secret> # mirror auth-service
redirectBaseUrl: https://app.example.com
go-toolserver:
anthropicApiKey: <your-anthropic-key>
openaiApiKey: <your-openai-key>- cert-manager TLS: install cert-manager and create a `letsencrypt` ClusterIssuer (HTTP-01 or DNS-01) before installing the chart.
- Generate every secret with `openssl rand -hex 32` (or `-base64 24` for Postgres-style passwords). Rotating JWT/signing keys signs every user out.
4. Install
helm install dibbla oci://ghcr.io/dibbla-agents/charts/dibbla \
--namespace dibbla --create-namespace \
-f values.yaml
After a minute:
kubectl -n dibbla get pods
You should see dibbla-api-gateway-…, dibbla-auth-service-…,
dibbla-deploy-api-…, dibbla-postgresql-0, and dibbla-redis-master-0 all
Running.
You should see dibbla-api-gateway-… and dibbla-deploy-api-… Running.
The bundled dibbla-postgresql-0 and dibbla-redis-master-0 will also be
Running until you strip them.
You should see dibbla-api-gateway-…, dibbla-auth-service-…, and
dibbla-deploy-api-… all Running. Postgres and Redis run outside the
cluster.
You should see dibbla-api-gateway-… and dibbla-deploy-api-… Running.
No in-cluster Postgres or Redis.
5. TLS
All traffic to your platform runs over HTTPS. Browsers refuse to send credentials over plain HTTP, OAuth providers require HTTPS callback URLs, and your users’ tokens, sessions, and source uploads are sensitive — TLS is what keeps them confidential in transit. You’ll either let cert-manager issue Let’s Encrypt certificates automatically, or pre-create the certificate yourself.
The chart’s ingress is annotated with cert-manager.io/cluster-issuer: letsencrypt.
Create a matching ClusterIssuer and the dibbla-tls secret is provisioned
and renewed automatically:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: [email protected]
privateKeySecretRef:
name: letsencrypt-account-key
solvers:
- http01:
ingress:
class: <your-ingress-class>For DNS-01 (required for wildcard certs and recommended on cloud-managed clusters), see the Helm install reference.
You’re providing the certificate yourself. Before installing, create the
dibbla-tls Secret in the release namespace covering both
app.<base-domain> and api.<base-domain>:
kubectl create namespace dibbla
kubectl -n dibbla create secret tls dibbla-tls \
--cert=path/to/tls.crt \
--key=path/to/tls.keyYou’re responsible for renewal.
6. First sign-in
Sign in at app.dibbla.com with the email you want as the org owner, create your org, and mint a long-lived API token from Settings → API tokens. Then point the CLI at your platform:
dibbla login --api-url https://api.example.com --api-key dib_…The CLI talks to your platform; your platform validates the token against app.dibbla.com. Full sign-in flow on the auth reference page.
Once the platform is running, create the first org and admin user:
curl -X POST https://api.example.com/api/v1/admin/orgs \
-H "Content-Type: application/json" \
-d '{
"name": "Your Org",
"domains": ["example.com"],
"admin_email": "[email protected]",
"admin_name": "Your Name"
}'The admin signs in via OAuth at https://app.example.com and lands in the dashboard with owner permissions. Then point the CLI at your platform:
dibbla login --api-url https://api.example.com --api-key dib_…Field semantics and the Microsoft Entra path are documented on the auth reference page.
Reference pages
When you need more detail on any of the above, the per-component reference covers it in full:
- Architecture — service ports, dependencies, and traffic flow.
- Install with Helm — the full chart reference, every option.
- K3s reference cluster — multi-node bootstrap and kubeconfig.
- MicroK8s reference cluster — addon details and quirks.
- Configure authentication — OAuth setup, Microsoft Entra, sign-in flow.