App Recipes
Recipes are reusable application blueprints that let you define an app configuration once and deploy instances of it to any server with a single click. Instead of manually configuring the same settings each time, a recipe captures the app type, runtime versions, Git repository, database requirements, environment variables, and post-deploy commands into a template.
Creating a Recipe
Navigate to Recipes in the sidebar and click Create Recipe. The recipe builder walks you through these steps:
- Name & Description — Give your recipe a recognizable name and optional description.
- App Type — Choose from WordPress, Laravel, Node.js, Python, Docker, or Static Site.
- App Configuration — Set runtime versions (PHP, Node, Python), port, Git repository, build/deploy commands, or Docker image and template.
- Database — Optionally provision a standalone database (PostgreSQL, MariaDB, or MongoDB) alongside the app. WordPress and Laravel deployments already create their own databases automatically, so this step is mainly for Node.js, Python, Docker, and Static apps that need a separate database.
- Environment Variables — Define default
.envkey-value pairs. Users can override values at deploy time. - Post-Deploy Commands — Commands that run after the app is fully deployed, such as database migrations or seed scripts.
- Review — Confirm your settings and save the recipe.
Deploying a Recipe Instance
From a recipe's detail page, click Deploy Instance. The deploy wizard has three steps:
- Select Server — Pick the target server from your connected servers.
- Configure — Enter the domain for this instance and optionally override any environment variables defined in the recipe.
- Review & Deploy — Confirm settings and deploy. You'll see real-time progress as the app is provisioned.
Once deployment completes, you can click View App to go to the app's detail page.
Managing Instances
Each recipe tracks all deployed instances. From the recipe's detail page you can:
- View the linked app for any instance
- Destroy an instance, which deletes the app and any standalone database created by the recipe from the server
Editing & Deleting Recipes
- Click Edit on a recipe to update its name, description, or configuration. Existing instances are not affected by changes to the recipe.
- Click Delete Recipe in the Danger Zone. All instances must be destroyed first before a recipe can be deleted.
Recipe Config Reference
The recipe configuration is stored as JSON and supports these fields:
| Field | Required | Description |
|---|---|---|
type |
Yes | App type: wordpress, laravel, nodejs, python, docker, static |
php_version |
No | PHP version (WordPress/Laravel): 8.1, 8.2, 8.3, 8.4 |
node_version |
No | Node.js version: 18, 20, 22 |
python_version |
No | Python version: 3.10, 3.11, 3.12 |
port |
No | Application port (Node.js/Python/Docker) |
git_repo_url |
No | Git repository URL |
git_branch |
No | Git branch (default: main) |
build_command |
No | Build command (e.g. npm install && npm run build) |
deploy_command |
No | Deploy command (Laravel: composer install —no-dev && php artisan migrate —force) |
docker_image |
No | Docker image (e.g. nginx:latest) |
docker_template |
No | Predefined Docker template key |
docker_internal_port |
No | Container-internal port |
docker_compose_dir |
No | Subdirectory containing docker-compose.yml |
database.type |
No | Database engine: postgresql, mariadb, mongodb |
database.name_suffix |
No | Database name prefix (final name: {suffix}_{system_user}) |
env_template |
No | Array of {"key": "...", "value": "..."} pairs |
post_deploy_commands |
No | Array of shell commands to run after deployment |
Example: Node.js API with PostgreSQL
Create a recipe with:
- Type: Node.js
- Node Version: 20
- Port: 3000
- Git Repo:
https://github.com/your-org/api-server.git - Branch:
main - Build Command:
npm install - Database: PostgreSQL, suffix
apidb - Env Template:
NODE_ENV=production,PORT=3000 - Post-Deploy:
npm run migrate
Then deploy instances to different servers with unique domains — each gets its own app, database, and environment.