Skip to content

Workload Management

Add PostgreSQL in 5 seconds. No YAML. No pain.

Terminal window
loko workloads add postgres
loko env create
# Done. PostgreSQL running with DNS, password, and pgAdmin.

Remember spending an hour configuring PostgreSQL? Finding the right Helm chart, writing 200 lines of values.yaml, generating passwords, setting up persistence, configuring DNS? Never again.

LoKO’s workload catalog gives you pre-configured, battle-tested services that just work. One command. Complete setup.


Terminal window
# Find a Helm chart (which one? bitnami? groundhog2k? official?)
helm search repo postgres
# Read documentation for 30 minutes
# Create values.yaml
cat > postgres-values.yaml <<EOF
auth:
postgresPassword: $(openssl rand -base64 32) # Generate password
database: mydb
primary:
persistence:
enabled: true
size: 10Gi
storageClass: standard
resources:
limits:
memory: 512Mi
volumePermissions:
enabled: true
securityContext:
runAsUser: 0
metrics:
enabled: false
# ... 150 more lines
EOF
# Install
helm repo add bitnami https://charts.bitnami.com/bitnami
helm install postgres bitnami/postgresql -f postgres-values.yaml
# Wait for it to be ready
kubectl wait --for=condition=ready pod/postgres-0 --timeout=300s
# Get password (where was it again?)
kubectl get secret postgres-postgresql -o jsonpath='{.data.postgres-password}' | base64 -d
# Access it
kubectl port-forward svc/postgres-postgresql 5432:5432
# Keep this terminal open forever...

Time spent: 45-60 minutes. Fun had: None.

Terminal window
loko workloads add postgres
loko env create

Time spent: 10 seconds. Everything you get:

  • ✅ PostgreSQL running on postgres.dev.me:5432
  • ✅ Password auto-generated and saved
  • ✅ pgAdmin web UI at https://postgres-ui.dev.me
  • ✅ Persistent storage (10Gi default, configurable)
  • ✅ Health checks configured
  • ✅ Connection strings ready

Access it:

Terminal window
psql -h postgres.dev.me -U postgres
# Or web UI: https://postgres-ui.dev.me

That’s why the catalog exists. Stop configuring infrastructure. Start building apps.


Infrastructure services like databases and message queues:

  • Databases: PostgreSQL, MySQL, MongoDB
  • Cache: Valkey (Redis-compatible)
  • Message Queues: RabbitMQ
  • Object Storage: Garage (S3-compatible)

DNS: <workload>.${DOMAIN} (e.g., postgres.dev.me)

Your custom applications:

  • Custom Helm charts
  • Local images
  • Third-party applications

DNS: <workload>.apps.${DOMAIN} or <workload>.${DOMAIN} (configurable)

In-cluster components managed by LoKO:

  • Traefik: Ingress controller (required, cannot be disabled)
  • Zot: Container registry (optional, can be disabled)
  • metrics-server: Resource metrics (optional, can be disabled)

Outside-of-cluster components:

  • HAProxy: TCP load balancer for database/service access from host
  • dnsmasq: In-cluster DNS resolver for *.dev.me domain resolution

Unless you pass --config / -c, workload commands target the active environment first and fall back to ./loko.yaml only when no environment is active.

Terminal window
loko workloads list
Terminal window
loko workloads list --user # User workloads only
loko workloads list --system # System workloads only
loko workloads list --internal # Internal components only
Terminal window
loko workloads list --all
loko workloads list --disabled # Disabled only
Terminal window
loko workloads list --format json # JSON output
loko workloads list --format text # Plain text (TSV)
loko workloads list --format json | jq # Pipe to jq
Terminal window
# Add to config (enabled by default)
loko workloads add postgres
# Add and deploy immediately
loko workloads add postgres --now
# Add but keep disabled
loko workloads add rabbitmq --disabled

Edit loko.yaml:

workloads:
myapp:
enabled: true
namespace: apps
config:
chart:
repo: myrepo
name: myrepo/myapp
version: 1.0.0
values:
ingress:
enabled: true
hosts:
- host: myapp.dev.me
Terminal window
# Enable in config only
loko workloads enable postgres
# Enable several at once
loko workloads enable mysql postgres mongodb
# Enable and deploy
loko workloads enable mysql postgres --now
Terminal window
# Disable in config only
loko workloads disable postgres
# Disable several at once
loko workloads disable mysql postgres mongodb
# Disable and undeploy
loko workloads disable mysql postgres --now
Terminal window
# Deploy all enabled user + system workloads
loko workloads deploy
# Include internal components
loko workloads deploy --all
Terminal window
loko workloads deploy postgres
loko workloads deploy mysql postgres # Multiple
Terminal window
loko workloads deploy --user # User workloads only
loko workloads deploy --system # System workloads only
Terminal window
loko workloads undeploy postgres
loko workloads undeploy mysql postgres
Terminal window
loko workloads undeploy --all
Terminal window
loko workloads info postgres

Shows:

  • Chart details
  • Default configuration
  • Endpoints and ports
  • Connection strings
  • Health checks
  • Available UIs
Terminal window
loko workloads endpoints postgres

Output:

┏━━━━━━━━┳━━━━━━━━━━┳━━━━━━┳━━━━━━━━━━━━━━━━━━━━┓
┃ Name ┃ Protocol ┃ Port ┃ External URL ┃
┡━━━━━━━━╇━━━━━━━━━━╇━━━━━━╇━━━━━━━━━━━━━━━━━━━━┩
│ client │ tcp │ 5432 │ postgres.dev.me │
└────────┴──────────┴──────┴────────────────────┘
Terminal window
# Show connection strings (password masked)
loko workloads connect postgres
# Show with actual password
loko workloads connect postgres --show-password
loko workloads connect postgres -p

Example output:

Connection strings for postgres:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
default: postgresql://postgres:${PASS}@postgres.dev.me:5432/${DB}
jdbc: jdbc:postgresql://postgres.dev.me:5432/${DB}?user=postgres&password=${PASS}

Run basic port connectivity checks (no client tools required):

Terminal window
loko workloads check postgres # infrastructure tier (default)
loko workloads check postgres --tier infrastructure
loko workloads check postgres -t infra # alias

Run deeper checks using client tools (requires mysql, psql, etc.):

Terminal window
loko workloads check postgres --tier client
loko workloads check postgres -t client
Terminal window
loko workloads check postgres --all
loko workloads check postgres -a
Terminal window
loko workloads check postgres --port-forward
loko workloads check postgres -f

Health check tiers:

  • infrastructure: Port connectivity checks (no client tools needed, runs by default)
  • client: Service validation using client tools (requires tools like mysql, psql, valkey-cli, etc.)
Terminal window
loko logs workload postgres
# Follow (real-time)
loko logs workload postgres --follow
Terminal window
# Last 100 lines
loko logs workload postgres --tail 100
# Last 5 minutes
loko logs workload postgres --since 5m
Terminal window
loko logs workload traefik --container traefik
Terminal window
loko logs workload postgres --previous
Terminal window
loko secrets fetch

Fetches workload credentials from the cluster and updates persisted environment secrets.

Terminal window
# Display in terminal
loko secrets show
# JSON format
loko secrets show --format json
# Get specific password
loko secrets show --format json | jq '.postgres.password'

Auto-generated credentials for:

  • PostgreSQL (postgres password)
  • MySQL (root password)
  • MongoDB (root password)
  • RabbitMQ (admin password)
  • Valkey (default password)

Many workloads have linked web UI tools that provide visual interfaces for management.

Use loko workloads info to see linked UI workloads:

Terminal window
loko workloads info postgres
# Shows: postgres-ui (pgAdmin) as a linked workload
loko workloads info valkey
# Shows: cache-ui (phpCacheAdmin) as a linked workload

UI workloads are added just like any other workload:

Terminal window
# Add PostgreSQL and its UI
loko workloads add postgres
loko workloads add postgres-ui
loko env create
# Add Valkey and its unified cache UI
loko workloads add valkey
loko workloads add cache-ui
loko env create
# Or add UI later
loko workloads add mysql
loko env create
# Later: add the UI
loko workloads add mysql-ui --now
DatabaseUI WorkloadToolURL
postgrespostgres-uipgAdminpostgres-ui.dev.me
mysqlmysql-uiphpMyAdminmysql-ui.dev.me
mongodbmongodb-uimongo-expressmongodb-ui.dev.me
valkeycache-uiphpCacheAdmincache-ui.dev.me
memcachedcache-uiphpCacheAdmincache-ui.dev.me
natsnats-uiNATS Dashboardnats-ui.dev.me
redpandaredpanda-uiRedpanda Consoleredpanda-ui.dev.me
garagegarage-uiGarage WebUIgarage-ui.dev.me
rabbitmq(built-in)Management UIrabbitmq.dev.me

Note: cache-ui provides a unified interface for both Valkey (Redis) and Memcached.

Stack: Node.js API + PostgreSQL + Valkey (cache) + React frontend

Terminal window
# Add backend services
loko workloads add postgres
loko workloads add valkey
loko env create
# Your API connects to:
# - postgres.dev.me:5432
# - valkey.dev.me:6379
# Build and push images
docker build -t cr.dev.me/api:v1 ./api
docker push cr.dev.me/api:v1
docker build -t cr.dev.me/frontend:v1 ./frontend
docker push cr.dev.me/frontend:v1
# Deploy to cluster
kubectl apply -f k8s/
# Access:
# - API: https://api.dev.me
# - Frontend: https://app.dev.me
# - Database: postgres-ui.dev.me (web UI)

Services: User service, Order service, Notification service

Terminal window
# Add infrastructure
loko workloads add postgres
loko workloads add rabbitmq
loko workloads add valkey
loko env create
# Each service gets:
# - Shared PostgreSQL database (postgres.dev.me)
# - Message queue for async tasks (rabbitmq.dev.me)
# - Shared cache (valkey.dev.me)
# Develop services locally, connect to cluster:
# In your .env:
DATABASE_URL=postgresql://postgres:PASSWORD@postgres.dev.me:5432/mydb
RABBITMQ_URL=amqp://admin:PASSWORD@rabbitmq.dev.me:5672
REDIS_URL=redis://valkey.dev.me:6379

Scenario 3: Testing with Multiple Databases

Section titled “Scenario 3: Testing with Multiple Databases”

Need: Test PostgreSQL and MongoDB migrations

Terminal window
# Add both databases
loko workloads add postgres
loko workloads add mongodb
loko env create
# Run tests
npm test -- --postgres-url=postgresql://postgres:PASS@postgres.dev.me:5432/test
npm test -- --mongodb-url=mongodb://root:PASS@mongodb.dev.me:27017/test
# Check data via web UIs
open https://postgres-ui.dev.me
open https://mongodb-ui.dev.me

Stack: Services + RabbitMQ + Storage

Terminal window
# Add messaging and storage
loko workloads add rabbitmq
loko workloads add garage
loko env create
# Now you have:
# - Message queue: rabbitmq.dev.me
# - S3-compatible storage: garage.dev.me
# - RabbitMQ management UI: https://rabbitmq.dev.me
# Publish events, process async, store files

Databases:

WorkloadDescriptionWeb UI
postgresPostgreSQL database serverpgAdmin at postgres-ui.dev.me
mysqlMySQL database serverphpMyAdmin at mysql-ui.dev.me
mongodbMongoDB document databasemongo-express at mongodb-ui.dev.me

Cache:

WorkloadDescriptionWeb UI
valkeyRedis-compatible in-memory cachephpCacheAdmin at cache-ui.dev.me
memcachedDistributed memory caching systemphpCacheAdmin at cache-ui.dev.me

Messaging:

WorkloadDescriptionWeb UI
rabbitmqRabbitMQ message brokerManagement UI at rabbitmq.dev.me
natsNATS messaging system with JetStreamDashboard at nats-ui.dev.me
redpandaKafka-compatible streaming platformConsole at redpanda-ui.dev.me
elasticmqSQS-compatible message queueWeb UI at elasticmq.dev.me
goawsSNS-compatible message serviceAPI endpoint at sns.dev.me

Storage:

WorkloadDescriptionWeb UI
garageS3-compatible distributed object storageWebUI at garage-ui.dev.me

DevOps/GitOps:

WorkloadDescriptionWeb UI
forgejoSelf-hosted Git service (Gitea fork)Web UI at forgejo.dev.me
argocdGitOps continuous deliveryWeb UI at argocd.dev.me
flux-operatorFlux CD operator for GitOps-

Collaboration:

WorkloadDescriptionWeb UI
excalidrawCollaborative whiteboardWeb UI at excalidraw.dev.me
penpotOpen-source design & prototyping (Figma alternative)Web UI at penpot.dev.me

DevTools:

WorkloadDescriptionWeb UI
httpbinHTTP request & response testing serviceWeb UI at httpbin.dev.me
it-toolsDeveloper utilities — converters, encoders, formattersWeb UI at it-tools.dev.me
mock-smtp-smsSMTP & SMS testing toolWeb UI at mock-smtp-sms.dev.me

Each workload includes:

  • ✅ Pre-configured Helm values
  • ✅ Auto-generated passwords (saved in persisted environment secrets)
  • ✅ DNS configuration (.dev.me by default)
  • ✅ Health checks
  • ✅ Connection strings
  • ✅ Web UI tools (where applicable)

Add Helm repositories:

Terminal window
loko config helm-repo-add \
--helm-repo-name bitnami \
--helm-repo-url https://charts.bitnami.com/bitnami

Then reference in config:

workloads:
helm-repositories:
- name: bitnami
url: https://charts.bitnami.com/bitnami
user:
- name: myapp
config:
repo:
ref: bitnami
chart: bitnami/nginx
version: 15.0.0
workloads:
system:
- name: postgres
enabled: true
config:
values:
storage:
size: 50Gi
resources:
limits:
memory: 2Gi
workloads:
system:
- name: postgres
config:
values:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: tier
operator: In
values:
- application
workloads:
system:
- name: postgres-main
config:
chart: groundhog2k/postgres
namespace: databases
- name: postgres-test
config:
chart: groundhog2k/postgres
namespace: databases-test
Terminal window
# Check if enabled
loko workloads list --all
# Enable it
loko workloads enable postgres --now
# Check Helm release
helm list -A
# Check pods
kubectl get pods -A
Terminal window
# Check endpoints
loko workloads endpoints postgres
# Check DNS
loko check dns
Terminal window
# View detailed logs
loko logs workload postgres --tail 100
# Check events
kubectl get events -n common-services