Configuration reference¶
All persistent configuration lives in dekube.yaml. This file is created on first run and preserved across re-runs. User edits are never overwritten.
Full example¶
name: my-platform
volume_root: ./data
extensions:
caddy:
email: admin@example.com
distribution_version: v3.1.0
depends:
- keycloak
- cert-manager==0.3.0
- trust-manager
volumes:
data-postgresql:
driver: local
myapp-data:
host_path: app
other:
host_path: ./custom
exclude:
- prometheus-operator
- meet-celery-*
replacements:
- old: 'path_style_buckets = false'
new: 'path_style_buckets = true'
overrides:
redis-master:
image: redis:7-alpine
command: ["redis-server", "--requirepass", "$secret:redis:redis-password"]
volumes: ["$volume_root/redis:/data"]
environment: null
services:
minio-init:
image: quay.io/minio/mc:latest
restart: on-failure
entrypoint: ["/bin/sh", "-c"]
command:
- mc alias set local http://minio:9000 $secret:minio:rootUser $secret:minio:rootPassword
&& mc mb --ignore-existing local/my-bucket
Sections¶
name¶
Compose project name. Auto-set to the source directory basename on first run.
volume_root¶
Base path for volume host mounts. Default: ./data.
Bare names in host_path are prefixed with this value. Paths starting with ./ or / are used as-is.
volume_root: ./data
volumes:
app-data:
host_path: app # resolves to ./data/app
other:
host_path: ./custom # used as-is (starts with ./)
On first run, discovered PVCs are auto-registered with host_path: <pvc_name> (e.g. host_path: data-postgresql -> ./data/data-postgresql). On subsequent runs, PVCs not mapped in the config emit a warning but are still usable as named Docker volumes.
volumes¶
Map PVCs to named volumes or host paths.
volumes:
data-postgresql:
driver: local # named docker volume (no host path)
myapp-data:
host_path: app # bind mount under volume_root
driver: local— named Docker volume (managed by the runtime)host_path: <name>— bind mount. Bare name =volume_root/<name>. Explicit path (./or/prefix) = used as-is.
exclude¶
Skip workloads by name. Supports wildcards via fnmatch syntax (*, ?, [seq]).
On first run, K8s-only workloads matching cert-manager, ingress, reflector are auto-excluded.
Separately, workloads with replicas: 0 are auto-skipped (with a warning), regardless of the exclude list. This check runs independently — a workload with replicas: 0 is skipped even if it's not in exclude.
replacements¶
Global find/replace applied to generated ConfigMap/Secret files, environment variable values, and Caddyfile upstreams. Port remapping is automatic — use replacements for other rewrites.
replacements:
- old: 'path_style_buckets = false'
new: 'path_style_buckets = true'
- old: 'some.old.hostname'
new: 'new.hostname'
Replacements are also applied to Caddyfile upstream names.
overrides¶
Deep merge into generated services. Useful for replacing images, commands, or environment variables.
overrides:
redis-master:
image: redis:7-alpine
command: ["redis-server", "--requirepass", "$secret:redis:redis-password"]
volumes: ["$volume_root/redis:/data"]
environment: null # null deletes the key entirely
- Deep merge: nested dicts are merged recursively (e.g. you can override individual environment variables without replacing the entire
environmentblock). nulldeletes: setting a key tonullremoves it from the generated service.- Overrides that reference a non-existent generated service are skipped with a warning.
services¶
Custom services not from K8s manifests. Added to compose output alongside generated services.
services:
minio-init:
image: quay.io/minio/mc:latest
restart: on-failure
entrypoint: ["/bin/sh", "-c"]
command:
- mc alias set local http://minio:9000 $secret:minio:rootUser $secret:minio:rootPassword
&& mc mb --ignore-existing local/my-bucket
Combined with restart: on-failure, this is the brute-force retry pattern for one-shot init tasks (bucket creation, API configuration, etc.). The service retries until it succeeds, then exits.
If a custom service name conflicts with a generated service, the custom one overwrites it (with a warning).
extensions.caddy.email¶
If set, generates a global Caddy block for automatic HTTPS certificate provisioning:
Previously caddy_email (top-level). Migrated automatically on first run — see Config migration.
extensions.caddy.tls_internal¶
If true, adds tls internal to all Caddyfile host blocks. Forces Caddy to use its internal CA for all domains (useful for .local development domains).
Previously caddy_tls_internal (top-level). Migrated automatically on first run.
distribution_version¶
Pin the distribution version for dekube-manager. Ignored by helmfile2compose itself.
core_version is accepted as a backwards-compatible alias.
distribution¶
Select which distribution dekube-manager installs. Default: helmfile2compose. Use core for the bare engine (dekube.py).
depends¶
List of dekube extensions required by this project. dekube-manager reads this list and installs them automatically.
Bare names pull the latest release. Pin with ==version for reproducibility (recommended — see Your project).
See dekube-manager — declarative dependencies for override behavior and details.
ingress_types¶
Maps custom ingressClassName values to canonical rewriter names. Without this, custom class names won't match any rewriter and the Ingress is skipped with a warning.
ingress_types:
haproxy-controller-internal: haproxy
haproxy-controller-external: haproxy
nginx-internal: nginx
The mapping is applied before rewriter dispatch. See Ingress controllers for details.
Previously ingressTypes (camelCase). Migrated automatically on first run.
disable_ingress¶
If true, skips the ingress provider service in compose.yml. Ingress rules are still written to Caddyfile-<project> for manual merging with your existing reverse proxy.
Manual only — never auto-generated. See Advanced for the full cohabitation guide.
Previously disableCaddy. Migrated automatically on first run.
network¶
Override the default compose network with an external one:
Generates:
Required when sharing a network across multiple compose projects. See Advanced.
Config migration¶
v3.1.0 normalized config keys to snake_case. On first run, old keys are automatically migrated:
| Old key | New key |
|---|---|
disableCaddy |
disable_ingress |
ingressTypes |
ingress_types |
caddy_email |
extensions.caddy.email |
caddy_tls_internal |
extensions.caddy.tls_internal |
helmfile2ComposeVersion |
removed (silently ignored) |
A stderr notice is printed if migration occurred. Migration happens in memory — to persist the new key names, edit your dekube.yaml manually (or delete it and re-run to regenerate from scratch).
Placeholders¶
$secret:<name>:<key>¶
Resolved from K8s Secret manifests at generation time. Usable in overrides and services values.
The referenced Secret must exist in the rendered K8s manifests. Both data (base64-decoded) and stringData (plain) are supported.
$volume_root¶
Resolved to the volume_root config value. Usable in overrides and services values.