Skip to content

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
[deploy]
release_commands = [
    "python manage.py migrate --noinput",
]

[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.