clouderized.yaml is the platform config for your app — written by the Clouderized operator during onboarding, not committed to your repo. It tells the platform what port your app listens on, what tier to run it on, and how to route traffic. You don't edit this file directly; if you need a change (e.g. a new env var, a different port), contact the operator.
Full example
customer: acme
app: backend
tier: pro
port: 8080
domain: acme-backend.clouderized.com
healthcheck:
path: /health
interval: 30s
timeout: 10s
volumes:
- name: uploads
mount: /app/uploads
env:
PORT: "8080"
LOG_LEVEL: info
custom_domains:
- api.acme.com
# JVM apps only — set automatically by the provisioner
jvm_opts: "-Xms256m -Xmx1536m"
stop_signal: SIGKILL
Required fields
customer
string · required
Your Clouderized account name. Used as a namespace for all your containers and networks. Set by the operator at signup — do not change.
app
string · required
The name of this specific app. Combined with customer to form the container name: customer-app. Lowercase, no spaces.
tier
string · required
Determines the resource limits applied to your container.
| Value | Memory | CPU | Rate limit |
|---|---|---|---|
starter |
512 MB | 0.5 vCPU | 50 req/s avg, 100 burst |
pro |
2 GB | 2 vCPU | 1000 req/s avg, 1500 burst |
JVM/Scala apps require Pro — 512 MB is insufficient for stable JVM operation.
port
integer · required
The port your app listens on inside the container. Traefik routes external HTTPS traffic to this port. Must match your app's actual bind port — commonly 8080, 3000, or 8000.
domain
string · required
The primary domain assigned to your app — always in the form customer-app.clouderized.com. Set by the operator. Use custom_domains to add your own domain on top.
Optional fields
healthcheck
object · optional
Configures the Traefik load balancer health check. If omitted, defaults are used (path: /, interval: 10s, timeout: 5s).
path/HTTP path Traefik probes
interval10sHow often to probe
timeout5sProbe timeout before marking unhealthy
Expose a GET /health endpoint that returns HTTP 200 for best results. A slow or missing health endpoint will delay traffic routing after deploys.
volumes
list · optional
Extra persistent bind mounts beyond the default /app/data. Each entry has a name (used for the host directory) and a mount (container path).
volumes:
- name: uploads # host dir: ./data/app/uploads/
mount: /app/uploads
- name: cache
mount: /app/cache
All volumes survive redeploys. Every app also gets /app/data automatically — no need to declare it here.
env
map · optional
Static environment variables baked into the compose config. Use these for non-secret config like PORT, LOG_LEVEL, or APP_ENV. Secret values (DB passwords, API keys) should be set as Gitea repo secrets instead — they are written to app.env by the deploy workflow and never committed.
env:
PORT: "8080"
LOG_LEVEL: info
APP_ENV: production
custom_domains
list · optional
Additional domains to route to your app. Your customer-app.clouderized.com domain always works regardless. Point your domain's DNS to Clouderized before the operator adds it here.
custom_domains:
- api.yourdomain.com
- www.yourdomain.com
jvm_opts
JVM / Scala apps only
JVM flags injected via JAVA_TOOL_OPTIONS. Set automatically by the provisioner for JVM-based apps — you rarely need to set this manually. Controls heap size and GC tuning within the container's memory limit.
# Pro tier — 2 GB limit, heap capped at 1.5 GB
jvm_opts: "-Xms256m -Xmx1536m -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
stop_signal
JVM / Scala apps only
Signal sent to the container on stop/restart. Set to SIGKILL for JVM apps — the JVM ignores SIGTERM, so skipping straight to SIGKILL avoids a 30-second shutdown delay. Set automatically by the provisioner when a JVM base image is detected.
Minimal example
Only the five required fields — everything else uses defaults.
customer: acme
app: backend
tier: starter
port: 3000
domain: acme-backend.clouderized.com