App Configuration¶
Every app you deploy to Konigle Cloud must have two files in its project root:
| File | Purpose |
|---|---|
Dockerfile |
Builds the container image for your app |
bentocloud.toml |
Tells the platform what processes to run and how |
The deploy command validates that both files exist before packaging your code.
bentocloud.toml¶
bentocloud.toml is the single source of truth for how your app runs on the
platform. It defines your processes, optional release commands, and resource
limits.
Minimal example¶
[app]
name = "my-app"
[processes.web]
command = "gunicorn myapp.wsgi --bind 0.0.0.0:8000"
http = true
http_port = 8000
health_check = "/health/"
Full example¶
[app]
name = "my-app"
[deploy]
release_commands = [
"python manage.py migrate --noinput",
"python manage.py collectstatic --noinput",
]
[processes.web]
command = "gunicorn myapp.wsgi --bind 0.0.0.0:8000"
http = true
http_port = 8000
uat_http_port = 8001
uat_command = "gunicorn myapp.wsgi --bind 0.0.0.0:8001"
http_path = "/"
health_check = "/health/"
instances = 2
[processes.worker]
command = "celery -A myapp worker"
[processes.beat]
command = "celery -A myapp beat"
singleton = true
[resources]
cpu = "0.5"
memory = "512MB"
[resources.worker]
cpu = "1"
memory = "1GB"
Sections¶
[app]¶
Basic identity of your application.
| Key | Required | Description |
|---|---|---|
name |
No | Used as the OCI image namespace. Defaults to the web app name if omitted |
runtime |
No | Runtime hint (python, nodejs). Ignored when a Dockerfile is present |
[deploy]¶
Commands that run once in a temporary container before your processes start. Use these for database migrations, asset compilation, or any other one-off setup.
| Key | Default | Description |
|---|---|---|
release_commands |
[] |
List of shell commands run in order. Deploy is aborted if any command exits non-zero |
[processes.<name>]¶
Defines a named process your app runs. You must define at least one process.
The name (e.g. web, worker) is used in logs and monitoring.
| Key | Default | Description |
|---|---|---|
command |
— | Required. Shell command to run, e.g. gunicorn myapp.wsgi |
http |
false |
Whether this process receives HTTP traffic from the web server |
http_port |
— | Port the process listens on. Required when http = true |
http_path |
"/" |
URL path prefix the web server routes to this process |
strip_path |
true |
Strip http_path before proxying to http_port |
health_check |
"" |
HTTP path the web server polls before routing traffic, e.g. "/health/" |
instances |
1 |
Number of containers to run simultaneously |
singleton |
false |
Enforce exactly one instance at all times. Cannot be combined with instances > 1 |
public |
true |
Whether this process is reachable publicly. false = internal only |
uat_http_port |
http_port + offset |
Port override for the uat space. Useful when uat and production run on the same computer |
uat_command |
same as command |
Command override for the uat space |
HTTP processes receive traffic from the web server (e.g. Nginx). Set
http = true and provide http_port. The health_check path is polled before
traffic is routed — your process must return a 2xx response on that path to
be considered healthy.
Non-HTTP processes (workers, schedulers) run alongside your web process but receive no direct traffic.
[resources]¶
CPU and memory limits. Define defaults at the top level and override per-process as needed.
| Key | Default | Description |
|---|---|---|
cpu |
"0.5" |
vCPU allocation, e.g. "0.5", "1", "2" |
memory |
"512MB" |
Memory limit, e.g. "512MB", "1GB" |
[resources] # applied to all processes
cpu = "0.5"
memory = "512MB"
[resources.worker] # overrides for the "worker" process only
cpu = "1"
memory = "1GB"
Per-process resource sections are merged with the top-level defaults — you only need to specify the keys you want to override.
UAT vs production¶
uat and production are fully isolated environments. Each space has its own
database, cache, and processes — a change in one space has no effect on the
other.
The platform runs both spaces on the same computer, so HTTP processes need different ports to avoid conflicts.
Use uat_http_port and uat_command to set the uat-specific values:
[processes.web]
command = "gunicorn myapp.wsgi --bind 0.0.0.0:8000"
http = true
http_port = 8000
uat_http_port = 8001
uat_command = "gunicorn myapp.wsgi --bind 0.0.0.0:8001"
If you omit uat_http_port, the platform assigns one automatically by
offsetting from http_port.