appliku.yml Reference¶
This is the full specification reference for the appliku.yml configuration file. Place this file in the root directory of your application repository to define build settings, processes, databases, volumes, and cron jobs.
For a guide-oriented introduction, see appliku.yml Configuration.
Top-Level Keys¶
build_settings: # Build and deployment configuration
services: # Application processes
databases: # Database services to provision
volumes: # Persistent storage volumes
cronjobs: # Scheduled tasks
commands: # Saved commands for the Run Command autocomplete
All top-level keys are optional. You can define only the sections you need.
build_settings¶
Configures how your application is built and prepared for deployment.
| Key | Type | Required | Default | Description |
|---|---|---|---|---|
build_image |
string | Yes | -- | Build image or dockerfile/custom |
build_command |
string | No | -- | Command to run during the build phase |
dockerfile |
string | No | -- | Inline Dockerfile content (when build_image is dockerfile or custom) |
dockerfile_path |
string | No | "Dockerfile" |
Path to Dockerfile in repository |
dockerfile_context_path |
string | No | -- | Build context path for Dockerfile |
container_port |
integer | No | -- | Port your application listens on |
release_command |
string | No | -- | Command to run after build, before deployment (e.g., migrations) |
skip_release_command |
boolean | No | false |
Skip the release command |
expose_web_port |
boolean | No | false |
Expose container port on all interfaces |
is_static_site |
boolean | No | false |
Mark as a static site |
output_directory |
string | No | -- | Directory containing built static files |
environment_variables |
array | No | -- | Environment variable definitions |
build_image Values¶
The default is python-3.14-uv-node-26. See Build Images for details. Images marked deprecated use an end-of-life Node.js version and get no security fixes.
Python:
python-3.15, python-3.14, python-3.13, python-3.12, python-3.11, python-3.10, python-3.9, python-3.8, python-3.7
Python with uv:
python-3.15-uv, python-3.14-uv, python-3.13-uv, python-3.12-uv, python-3.11-uv
Python + Node.js:
python-3.15-node-26, python-3.14-node-26, python-3.13-node-26, python-3.12-node-26, python-3.11-node-26
Deprecated: python-3.14-node-25.6, python-3.13-node-20.18, python-3.12-node-20.10, python-3.11-node-20.10, python-3.10-node-20.10
Python (uv) + Node.js:
python-3.15-uv-node-26, python-3.14-uv-node-26, python-3.13-uv-node-26, python-3.12-uv-node-26
Deprecated: python-3.14-uv-node-25.6, python-3.13-uv-node-25.6, python-3.12-uv-node-25.6, python-3.11-uv-node-25.6
Node.js:
node-26-npm, node-26-yarn, node-24-npm, node-22-npm
Deprecated: node-25-npm, node-20-npm, node-20-yarn, node-14
Ruby:
ruby-3.4.1, ruby-3.3-rails
Custom:
dockerfile (from repository), custom (inline in dashboard)
Static Sites:
no-build-static (requires is_static_site: true)
environment_variables¶
Each entry in the environment_variables array supports several formats:
Static value:
From database (public connection URL):
From database (private/internal connection URL):
environment_variables:
- name: DATABASE_URL
from_database:
name: db
property: private_connection_url
From domains (comma-separated list of all application domains):
Manual (placeholder for user-provided values):
services¶
Defines the processes that run your application. Each key is the service name.
| Key | Type | Required | Default | Description |
|---|---|---|---|---|
command |
string | Yes | -- | Command to run the service |
scale |
integer | No | 1 |
Number of instances |
mode |
string | No | "replicated" |
replicated or global |
placement_constraints |
string | No | -- | Docker Swarm placement constraints |
resources_limits_memory |
string | No | -- | Memory limit (e.g., "512M", "2G") |
resources_limits_cpus |
string | No | -- | CPU limit (e.g., "0.5", "2") |
resources_reservations_memory |
string | No | -- | Memory reservation |
resources_reservations_cpus |
string | No | -- | CPU reservation |
image |
string | No | -- | Use an existing Docker image instead of building |
volumes |
array | No | -- | Docker volume mounts |
shm_size |
string | No | -- | Shared memory size |
ports |
array | No | -- | Port mappings |
There is no mem_limit key. The four resources_* keys work on a single server and in a cluster, except resources_reservations_cpus, which applies only in a cluster. See Resource Limits for how Appliku applies each key.
Example¶
services:
web:
command: gunicorn project.wsgi --bind 0.0.0.0:8000
scale: 2
resources_limits_memory: 512M
resources_limits_cpus: "1"
worker:
command: celery -A project worker -l info
scale: 1
resources_limits_memory: 256M
release:
command: python manage.py migrate
Note
The release service is special -- it runs once after each deployment (like a release command) rather than as a long-running process.
databases¶
Defines database services to provision. Each key is a name you choose (used to reference the database in environment_variables).
| Key | Type | Required | Description |
|---|---|---|---|
type |
string | Yes | Database engine and version identifier |
Available Types¶
| Type Key | Engine |
|---|---|
postgresql_19 |
PostgreSQL 19 + PostGIS (beta) |
postgresql_18 |
PostgreSQL 18 + PostGIS |
postgresql_17 |
PostgreSQL 17 |
postgresql_16 |
PostgreSQL 16 |
postgresql_15 |
PostgreSQL 15 |
postgresql_12 |
PostgreSQL 12 |
postgis_16_34 |
PostGIS 16 + 3.4 |
postgis |
PostGIS |
postgresql_16_pgvector |
PostgreSQL 16 + pgvector |
timescale_db_17 |
TimescaleDB 17 |
timescale_db_17_ha |
TimescaleDB 17 HA |
timescale_db_15 |
TimescaleDB 15 |
mysql_8 |
MySQL 8 |
redis_8 |
Redis 8 |
redis_7 |
Redis 7 |
redis_6 |
Redis 6 |
rabbitmq |
RabbitMQ |
elasticsearch_8_17 |
Elasticsearch 8.17 |
Example¶
volumes¶
Defines persistent storage volumes that survive container restarts and redeployments.
| Key | Type | Required | Description |
|---|---|---|---|
target |
string | Yes | Mount path inside the container |
url |
string | No | URL path for web access (served by Nginx). See the URL rules |
environment_variable |
string | No | Env var name set to the volume path |
source |
string | No | Accepted, but not used: the files are always in /home/app/<app-name>/volumes/volume_<id> on the server |
Example¶
volumes:
media:
target: /app/media/
url: /media/
environment_variable: MEDIA_ROOT
data:
target: /app/data/
environment_variable: DATA_PATH
Tip
When you set a url on a volume, Nginx serves files from that volume directly without passing requests to your application. This is efficient for serving user-uploaded media files.
cronjobs¶
Defines scheduled tasks that run at specified intervals using cron expressions.
| Key | Type | Required | Description |
|---|---|---|---|
schedule |
string | Yes | Cron expression (e.g., "0 * * * *") |
command |
string | Yes | Command to execute |
Cron Expression Format¶
┌───────────── minute (0-59)
│ ┌───────────── hour (0-23)
│ │ ┌───────────── day of month (1-31)
│ │ │ ┌───────────── month (1-12)
│ │ │ │ ┌───────────── day of week (0-6, Sunday=0)
│ │ │ │ │
* * * * *
Appliku accepts 5 fields or a macro such as @daily. It refuses values that cron cannot use, for example 5/10 or 22-2. See Schedule Rules.
Example¶
cronjobs:
send_emails:
schedule: "0 * * * *"
command: python manage.py send_emails
daily_backup:
schedule: "0 2 * * *"
command: python manage.py backup
weekly_cleanup:
schedule: "0 3 * * 0"
command: python manage.py cleanup_old_records
Note
Cron job logs are stored on the server at /home/app/_cron_logs/job_<job_id>.log. You can view them by SSHing into the server.
How Appliku Applies the Section¶
At each deployment, Appliku makes the cron jobs of the application match the cronjobs section:
- A job that is in the file but not in Appliku is created.
- A job whose
scheduleorcommandis different is updated. - A job that is not in the file is deleted. This includes jobs that you added in the dashboard.
If the file has no cronjobs key, Appliku does not change the cron jobs of the application. You can then manage them in the dashboard.
When the file has a cronjobs section, the Cron Jobs tab shows the jobs, but you cannot add, edit or delete them there. This is also true for the CLI and the API (they get the error "The cron jobs of this application are managed by the configuration file ..."). The time limit is also read-only: use the timeout key. To change a job, change the file and deploy. You can still turn a job on or off on the Cron Jobs tab (or with appliku crons update --id <job id> --enable / --disable); a deployment keeps this setting for a job that stays in the file.
The deployment log lists the jobs that a deployment deletes ("Cron jobs deleted because appliku.yml has no such job: ..."). After you click Save and Validate on the YAML Config tab, the YAML Config tab and the Cron Jobs tab warn you which dashboard jobs the next deployment deletes. To keep such a job, add it to the file before you deploy.
Warning
An empty cronjobs section deletes all cron jobs of the application at the next deployment. Both of these forms are empty:
To keep the cron jobs that you manage in the dashboard, remove the cronjobs key from the file.
commands¶
Defines a list of frequently used commands that appear as autocomplete suggestions in the Run Command tab. The list is a flat array of strings and is fully replaced on every deployment.
| Type | Required | Description |
|---|---|---|
list(string) |
No | Ordered list of command strings |
Example¶
commands:
- python manage.py show_urls
- python manage.py validate_templates
- python manage.py check
- python manage.py send_queued_mail
Note
Commands are suggestions only — they are never executed automatically. Users select or type a command in the Run Command tab and trigger it manually.
Complete Example¶
build_settings:
build_image: python-3.14-uv-node-26
build_command: npm run build
container_port: 8000
environment_variables:
- name: DEBUG
value: "false"
- name: DATABASE_URL
from_database:
name: db
property: private_connection_url
- name: REDIS_URL
from_database:
name: cache
property: connection_url
- name: ALLOWED_HOSTS
from_domains: true
- name: SECRET_KEY
source: manual
services:
web:
command: gunicorn project.wsgi --bind 0.0.0.0:8000 --workers 3
scale: 2
resources_limits_memory: 512M
worker:
command: celery -A project worker -l info
scale: 1
resources_limits_memory: 256M
release:
command: python manage.py migrate
databases:
db:
type: postgresql_17
cache:
type: redis_7
volumes:
media:
target: /app/media/
url: /media/
environment_variable: MEDIA_ROOT
cronjobs:
cleanup:
schedule: "0 3 * * *"
command: python manage.py cleanup_old_files
send_reports:
schedule: "0 8 * * 1"
command: python manage.py send_weekly_report
commands:
- python manage.py migrate
- python manage.py createsuperuser
- python manage.py shell
Related Pages¶
- appliku.yml Configuration -- guide-oriented introduction
- Build Images
- Predefined Dockerfiles
- Database Types