Skip to content

Helm / Kubernetes

A Helm chart is provided for deploying Strøm on Kubernetes with proper secret management, RBAC, and optional container runners.

  • Kubernetes 1.26+
  • Helm 3.8+
  • PostgreSQL database (external)
Terminal window
# Install latest version
helm install stroem oci://ghcr.io/fremvaerk/charts/stroem
# Install specific version
helm install stroem oci://ghcr.io/fremvaerk/charts/stroem --version 1.0.0
# Install with values file
helm install stroem oci://ghcr.io/fremvaerk/charts/stroem -f values.yaml
Terminal window
helm upgrade stroem oci://ghcr.io/fremvaerk/charts/stroem --version 1.1.0
helm uninstall stroem

The chart uses a config pass-through pattern:

  • server.config and worker.config contain the full YAML config passed as-is to ConfigMaps
  • Secrets are injected via extraSecretEnv as STROEM__ environment variables that override config values at runtime
  • No init containers or sed templating — clean and debuggable
Env VarOverrides YAML key
STROEM__DB__URLdb.url
STROEM__WORKER_TOKENworker_token
STROEM__AUTH__JWT_SECRETauth.jwt_secret
STROEM__LISTENlisten
KeyDescriptionDefault
server.image.repositoryServer image repositorystroem-server
server.image.tagServer image taglatest
server.replicasNumber of server replicas1
server.service.typeKubernetes service typeClusterIP
server.service.portService port8080
server.configFull server-config.yaml contentSee values.yaml
server.extraSecretEnvSecret env vars for overrides{}
server.extraEnvPlain env vars{}
server.resourcesCPU/memory resource limits{}
KeyDescriptionDefault
worker.image.repositoryWorker image repositorystroem-worker
worker.image.tagWorker image taglatest
worker.replicasNumber of worker replicas2
worker.configFull worker-config.yaml contentSee values.yaml
worker.extraSecretEnvSecret env vars for overrides{}
worker.extraEnvPlain env vars{}
worker.dind.enabledEnable Docker-in-Docker sidecarfalse
worker.dind.imageDinD imagedocker:27-dind
worker.resourcesCPU/memory resource limits{}

server_url and worker_name are automatically injected — server_url is derived from the Helm release name, and worker_name is set to the pod name.

KeyDescriptionDefault
rbac.createCreate RBAC resourcestrue
serviceAccount.createCreate service accounttrue
serviceAccount.nameService account name override""
KeyDescriptionDefault
ingress.enabledEnable ingressfalse
ingress.classNameIngress class name""
ingress.annotationsIngress annotations{}
ingress.hostsIngress host rulesSee values.yaml
ingress.tlsTLS configuration[]
server:
config:
listen: "0.0.0.0:8080"
db:
url: "postgres://stroem:stroem@postgres:5432/stroem"
log_storage:
local_dir: /var/stroem/logs
workspaces:
default:
type: folder
path: /workspace
worker_token: "dev-token"
server:
config:
listen: "0.0.0.0:8080"
db:
url: "placeholder"
log_storage:
local_dir: /var/stroem/logs
workspaces:
default:
type: folder
path: /workspace
worker_token: "placeholder"
extraSecretEnv:
STROEM__DB__URL: "postgres://real-user:real-pass@rds:5432/stroem"
STROEM__WORKER_TOKEN: "production-secret-token"
worker:
extraSecretEnv:
STROEM__WORKER_TOKEN: "production-secret-token"
server:
config:
auth:
jwt_secret: "placeholder"
refresh_secret: "placeholder"
initial_user:
email: admin@example.com
password: "placeholder"
extraSecretEnv:
STROEM__AUTH__JWT_SECRET: "real-jwt-secret"
STROEM__AUTH__REFRESH_SECRET: "real-refresh-secret"
STROEM__AUTH__INITIAL_USER__PASSWORD: "real-admin-password"
worker:
config:
tags:
- script
- docker
docker: {}
dind:
enabled: true
resources:
limits:
cpu: "2"
memory: 4Gi
worker:
config:
tags:
- script
- kubernetes
kubernetes:
namespace: stroem-jobs
rbac:
create: true
ingress:
enabled: true
className: nginx
hosts:
- host: stroem.example.com
paths:
- path: /
pathType: Prefix
tls:
- secretName: stroem-tls
hosts:
- stroem.example.com
Terminal window
# Basic install
helm install stroem ./helm/stroem \
--set database.url="postgres://stroem:pw@postgres:5432/stroem" \
--set workerToken="my-secure-token"
# With Kubernetes runner
helm install stroem ./helm/stroem \
--set worker.kubernetes.enabled=true \
--set worker.kubernetes.namespace=stroem-jobs
# With Docker runner
helm install stroem ./helm/stroem \
--set worker.dind.enabled=true