Documentation

Getting started guide, API reference, CLI usage, and workflow examples.

Get Started

Getting Started

Step-by-step guide to deploying your first app on orkestr.

Your code stays yours

orkestr does not store your source code. During deployments, your repository is cloned temporarily to build a Docker image and is automatically deleted immediately after - whether the build succeeds or fails. Only the compiled Docker image is retained to run your application. When you delete a project, everything is permanently removed - containers, images, logs, and configuration.

Plans at a Glance

FeatureFreeProTeam
Projects1515
Environments per project13Unlimited
Add-ons per project-25
Groups-YesYes
Rollbacks-YesYes
API access-100 req/min500 req/min
Backup retention-7 days30 days
1

Connect a Git Provider

Link your GitHub, GitLab, Bitbucket, or Codeberg account so orkestr can access your repositories.

  1. Go to Settings from the sidebar.
  2. Scroll to Connected Providers.
  3. Click the provider you want to connect (e.g. GitHub).
  4. Authorize orkestr via the OAuth flow on the provider's site.
  5. You'll be redirected back - the provider now shows Connected with your username.
Tip: You can connect multiple providers at once. You can also enter a repository URL manually when creating a project if you prefer not to connect an account.
2

Create a Project

A project represents a single app or service linked to a Git repository.

  1. Navigate to Projects and click New Project.
  2. Pick a repository from your connected providers, or paste a repo URL manually.
  3. orkestr auto-detects the framework, port, and Dockerfile. For monorepos it lists each service - pick the one you want to deploy.
  4. Review the auto-generated name, slug (used in your URL, e.g. my-app.orkestr.eu), branch, and description. Edit any field if needed.
  5. Click Create Project.
Plan limits: Free - 1 project • Pro - 5 projects • Team - 15 projects.
3

Add Environment Variables

Most apps need configuration like database URLs, API keys, or feature flags. Set these before your first deploy so the app starts correctly.

  1. Open your project and click into the environment you want to configure (e.g. production).
  2. Scroll to Environment Variables.
  3. Add key-value pairs (e.g. DATABASE_URL, SECRET_KEY).
  4. Values are encrypted at rest and masked in the dashboard. They are injected into your container at runtime.
Tip: Each environment has its own set of variables. Your staging environment can point to a different database than production. Add-ons like PostgreSQL and Redis automatically inject their connection URLs.
4

Deploy Your App

Trigger a deployment to build a Docker image from your repo and run it on orkestr's infrastructure.

  1. Open your project and select the environment you want to deploy (defaults to production).
  2. Click the Deploy button.
  3. orkestr clones your repo, builds a Docker image, and starts the container.
  4. Follow the build pipeline in real time - each step (clone, build, push, deploy) shows live logs.
  5. Once the status shows Live, your app is running at its slug.orkestr.eu URL.
Auto-deploy: Enable auto-deploy on any environment so pushes to its branch trigger a deployment automatically. Requires a connected Git provider.
5

Set Up Environments

Environments let you run the same project from different branches - e.g. production, staging, and dev - each with its own URL, env vars, and deploy history.

  1. Open your project and scroll to Environments.
  2. Click + Add Environment.
  3. Enter a name (e.g. staging) and the branch it should deploy from (e.g. develop).
  4. Click create. The environment gets its own subdomain (e.g. my-app-staging.orkestr.eu).
  5. Click into the environment to configure environment variables, toggle auto-deploy, or trigger a deployment.
Plan limits: Free - 1 environment • Pro - 3 per project • Team - unlimited. The production environment cannot be deleted.
6

Create a Group

Groups connect multiple projects on a private network so they can talk to each other via internal DNS - perfect for a frontend + API + worker setup.

  1. Navigate to Groups and click New Group.
  2. Enter a name and optional description. The slug auto-generates.
  3. Click Create Group.
  4. On the group detail page, click Add Service and select the projects you want to include.
  5. Services in a group can reach each other at http://project-name:port on the private network.
Note: Groups are available on Pro and Team plans. A project can only belong to one group at a time. Deleting a group disconnects its projects but does not delete them.
7

Add a Database or Cache

Provision a managed PostgreSQL database or Redis cache and have the connection string automatically injected as an environment variable.

  1. Navigate to Add-ons and click Add Service.
  2. Select the project the add-on belongs to and optionally assign it to a group for private networking.
  3. Enter a name (e.g. main-db) and choose PostgreSQL or Redis.
  4. Click Create Add-on. The connection URL is injected as DATABASE_URL or REDIS_URL.
  5. Manage backups from the add-on card - trigger manual backups, download, or schedule automatic ones.
Plan limits: Free - no add-ons • Pro - 2 per project • Team - 5 per project. Deleting an add-on permanently destroys its data.
8

Configure a Custom Domain

Point your own domain to any project. orkestr handles TLS certificates automatically.

  1. Navigate to Domains and find your project.
  2. Click Add domain and enter your custom domain (e.g. app.yourdomain.com).
  3. Click Save. The status will show Pending DNS.
  4. At your DNS provider, add a CNAME record pointing to your project's default domain (shown in the instructions).
  5. Click Verify DNS. Once propagation completes (usually minutes, up to 48 hours), the status changes to Active and your domain is live.
Tip: For root domains (e.g. yourdomain.com), use an ALIAS or ANAME record if your DNS provider supports it, as CNAME is not standard for root domains.
9

Monitor Your App

Keep an eye on your running containers with built-in monitoring for CPU, memory, logs, and health.

  1. Navigate to Monitoring from the sidebar.
  2. Stats - view real-time CPU usage, memory consumption, and network I/O per container.
  3. Logs - stream your application's stdout/stderr output with configurable line count.
  4. Health - check container status, uptime, and restart count at a glance.
Alerts: orkestr sends real-time notifications when a deployment fails or when CPU/memory usage spikes above thresholds.
10

Roll Back a Deployment

If a deployment introduces a bug or breaks your app, you can instantly revert to a previous working version.

  1. Open your project and go to the environment with the broken deployment.
  2. In the deployment history, find the last deployment that was working (status superseded).
  3. Click Rollback on that deployment.
  4. orkestr restarts your container with the previous Docker image - no rebuild required, so it's near-instant.
Note: Rollbacks are available on Pro and Team plans. You can also trigger rollbacks via the API, CLI, or MCP server for automated recovery workflows.
11

Generate an API Token

API tokens let you interact with orkestr programmatically - from CI/CD pipelines, the CLI, or MCP-connected AI assistants.

  1. Go to Settings and switch to the API tab.
  2. Enter a name for the token (e.g. CI/CD Pipeline) and choose an optional expiry (30, 90, 180, 365 days, or never).
  3. Click Create Token.
  4. Copy the token immediately - it is only shown once and cannot be retrieved later. Tokens are hashed before storage.
Note: API tokens are available on Pro and Team plans. Pro allows up to 5 tokens, Team up to 20.

API Reference

Authentication

All API requests require a Bearer token in the Authorization header. Create an account and upgrade to a Pro or Team plan to generate tokens.

# Example request
curl -X GET https://api.orkestr.eu/api/v1/projects \
-H "Authorization: Bearer sp_live_your_token_here" \
-H "Content-Type: application/json"

Base URL

https://api.orkestr.eu/api/v1

All endpoints return JSON. Successful responses use 2xx status codes. Errors return { "detail": "error message" }.

Rate Limits

Starter

No API access

Pro

100 req/min

5 tokens

Team

500 req/min

20 tokens

Token Format

API tokens follow the format sp_live_<random>. The sp_live_ prefix makes them easy to identify in logs and secret scanners.

  • Tokens are hashed (SHA-256) - we never store the raw value
  • Shown once on creation - copy immediately
  • Optional expiration (30, 90, 180, 365 days)

Projects

Create, manage, and analyze your projects.

Environments

Manage per-project environments (production, staging, dev).

Deployments

Trigger deployments, view logs, and rollback.

Monitoring

Container stats, logs, and health checks.

Response Codes

200Success
201Created
204Deleted (no content)
400Bad request - invalid input
401Unauthorized - invalid or expired token
403Forbidden - plan limit or insufficient permissions
404Resource not found
409Conflict - name taken or deployment in progress
429Rate limit exceeded

CLIorkestr-cli

Installation

Install the CLI with pip. Requires Python 3.10+.

# Install from PyPI
pip install orkestr-cli
# Verify installation
orkestr --version
orkestr, version 0.1.0

Authentication

orkestr loginAuthenticate with an API token
$ orkestr login
API token: ****
Logged in as deploy-bot.
orkestr logoutClear stored credentials
orkestr whoamiShow current user info
$ orkestr whoami
Username: deploy-bot
Email: bot@example.com
Plan: pro
Active: True
orkestr set-url <url>Set the API base URL (defaults to https://api.orkestr.eu)

Projects

orkestr projects listList all projects
$ orkestr projects list
Name Framework Status Created
my-api fastapi active 2026-03-30 18:37:31
frontend-app react active 2026-03-28 10:15:22
orkestr projects create <name> --repo <url>Create a new project from a git repository
$ orkestr projects create my-api --repo https://github.com/user/repo
Project 'my-api' created.
ID: 04cc3d67-ded5-4f05-92e4-8e52716e0ec6
orkestr projects show <name>Show project details (accepts name or UUID)
orkestr projects update <name> [options]Update project settings (--display-name, --description, --branch)
orkestr projects analyze <name>Detect framework, port, and resource requirements
orkestr projects delete <name>Delete a project and destroy its infrastructure

Environments

orkestr envs list <project>List environments for a project
orkestr envs create <project> <name> --branch <branch>Create a new environment
orkestr envs update <project> <env_id> [options]Update environment (--branch, --auto-deploy / --no-auto-deploy)
orkestr envs delete <project> <env_id>Delete an environment

Deployments

orkestr deploy <project>Trigger a deployment (shortcut)
$ orkestr deploy my-api
Deployment triggered.
Deployment ID: a1b2c3d4-...
Status: queued
Track progress: orkestr deployments show a1b2c3d4-...
orkestr deployments list <project>List deployment history
orkestr deployments show <id>Show deployment details and pipeline steps
orkestr deployments logs <id>Show full pipeline logs by step
orkestr deployments rollback <id>Rollback to a previous deployment

Add-ons & Backups

orkestr addons list <project>List add-ons for a project
orkestr addons add <project> --type <postgres|redis> --name <name>Provision a new add-on
$ orkestr addons add my-api --type postgres --name mydb
Add-on 'mydb' (postgres) provisioned.
Status: running
Env Var: DATABASE_URL
Connection: postgresql://...
orkestr addons delete <project> <addon_id>Destroy an add-on and its data
orkestr addons backups <project> <addon_id>List backups for an add-on
orkestr addons backup <project> <addon_id>Trigger a manual backup
orkestr addons download <project> <addon_id> <backup_id>Get a download URL for a backup
orkestr addons delete-backup <project> <addon_id> <backup_id>Delete a backup

Monitoring

orkestr logs <project>Show application runtime logs (--lines, --env)
$ orkestr logs my-api --lines 50
Container: my-api-production
2026-03-30 INFO: Application startup complete
2026-03-30 INFO: Uvicorn running on 0.0.0.0:8000
orkestr stats <project>Show container CPU, memory, and network stats
orkestr health <project>Show container health, uptime, and restart count

Global Flags

These flags can be used with any command.

--jsonOutput raw JSON instead of formatted tables
--api-url <url>Override the API base URL for this command
--token <token>Use a specific API token for this command
--versionShow CLI version
--helpShow help for any command
# Get JSON output for scripting
orkestr projects list --json
 
# Deploy to a specific environment
orkestr deploy my-api --env staging

MCP ServerAI Integration

Overview

orkestr exposes an MCP (Model Context Protocol) server that lets AI coding assistants manage your projects, deployments, and infrastructure directly.

Connect Claude Code, Claude Desktop, Cursor, Windsurf, or any MCP-compatible client and use natural language to deploy, monitor, and manage your apps.

Setup

URL + Token

Transport

Streamable HTTP

Tools

26 available

Setup

Create an account and generate an API token, then add this to your MCP client config.

Claude Code / Claude Desktop - ~/.claude.json or claude_desktop_config.json

{
"mcpServers": {
"orkestr": {
"command": "npx",
"args": [
"mcp-remote",
"https://orkestr.eu/api/mcp",
"--header",
"Authorization: Bearer sp_live_your_token_here"
]
}
}
}

Cursor - .cursor/mcp.json

{
"mcpServers": {
"orkestr": {
"url": "https://orkestr.eu/api/mcp",
"headers": {
"Authorization": "Bearer sp_live_your_token_here"
}
}
}
}

Available Tools

Projects

list_projectsList all your projects
get_projectGet project details by name or ID
create_projectCreate a new project from a git repo
update_projectUpdate project settings
delete_projectDelete a project and its infrastructure
analyze_projectDetect framework, port, and resources

Environments

list_environmentsList environments for a project
create_environmentCreate a new environment
update_environmentUpdate environment settings
delete_environmentDelete a non-production environment

Deployments

deployTrigger a deployment (defaults to production)
list_deploymentsList recent deployments
get_deploymentGet deployment details and pipeline steps
get_deployment_logsGet build/deploy logs by step
rollback_deploymentRollback to a previous deployment (Pro+)

Monitoring

get_logsApplication runtime logs (stdout/stderr)
get_statsContainer CPU, memory, network stats
get_healthContainer status, uptime, restart count

Add-ons

list_addonsList databases and caches for a project
create_addonProvision a PostgreSQL or Redis add-on
delete_addonDestroy an add-on and its data

Backups

list_backupsList backups for an add-on
create_backupTrigger a manual backup
download_backupGet a download URL for a backup
delete_backupDelete a backup

Auth

whoamiShow current user info and plan

Example Prompts

Once connected, you can use natural language in your AI assistant. Here are some examples:

“Deploy my-api to production”

Triggers a deployment for the my-api project

“Show me the logs for my-api, last 50 lines”

Fetches runtime logs from the container

“Create a staging environment for my-api on the develop branch”

Creates a new environment with auto-deploy

“What's the CPU and memory usage of my-api?”

Returns container resource stats

“Add a PostgreSQL database to my-api”

Provisions a managed Postgres add-on

“List all my projects and their status”

Shows all projects with framework and status info

“Roll back my-api to the previous deployment”

Finds the last good deployment and rolls back

Workflow Examples

Ready-to-use workflows you can drop into your projects. Replace the placeholder values with your own.

PR Deploy Previews

GitHub Actions - every PR gets a live preview URL

Deploys a preview environment when a PR is opened or updated, comments the live URL on the PR, and cleans up when the PR is closed. Add your ORKESTR_TOKEN and ORKESTR_PROJECT_ID as repository secrets.

# .github/workflows/preview.yml
name: Deploy Preview
on:
pull_request:
types: [opened, synchronize, closed]
 
env:
API: https://api.orkestr.eu/api/v1
TOKEN: ${{ secrets.ORKESTR_TOKEN }}
PROJECT: ${{ secrets.ORKESTR_PROJECT_ID }}
 
jobs:
deploy-preview:
if: github.event.action != 'closed'
runs-on: ubuntu-latest
steps:
- name: Create preview environment
id: env
run: |
# Create environment (409 = already exists, that's fine)
RESULT=$(curl -s -w "\n%{http_code}" -X POST \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"pr-${{ github.event.number }}","branch":"${{ github.head_ref }}","auto_deploy":true}' \
$API/projects/$PROJECT/environments)
 
# Get the environment ID
ENV_ID=$(curl -s \
-H "Authorization: Bearer $TOKEN" \
$API/projects/$PROJECT/environments \
| jq -r '.[] | select(.name=="pr-${{ github.event.number }}") | .id')
echo "env_id=$ENV_ID" >> $GITHUB_OUTPUT
 
- name: Trigger deployment
run: |
curl -s -X POST \
-H "Authorization: Bearer $TOKEN" \
"$API/projects/$PROJECT/deployments?environment_id=$${{ steps.env.outputs.env_id }}"
 
- name: Comment preview URL
uses: actions/github-script@v7
with:
script: |
github.rest.issues.createComment({
owner: context.repo.owner, repo: context.repo.repo,
issue_number: context.issue.number,
body: '🚀 **Preview deployed!**\n\nhttps://pr-$${{ github.event.number }}-$${{ secrets.ORKESTR_PROJECT_NAME }}.orkestr.eu'
})
 
cleanup-preview:
if: github.event.action == 'closed'
runs-on: ubuntu-latest
steps:
- name: Get environment ID and delete
run: |
ENV_ID=$(curl -s \
-H "Authorization: Bearer $TOKEN" \
$API/projects/$PROJECT/environments \
| jq -r '.[] | select(.name=="pr-${{ github.event.number }}") | .id')
if [ -n "$ENV_ID" ]; then
curl -s -X DELETE \
-H "Authorization: Bearer $TOKEN" \
$API/projects/$PROJECT/environments/$ENV_ID
fi

CI/CD Pipeline

GitHub Actions - deploy on push to main after tests pass

Runs your test suite first, then triggers a orkestr deployment only if tests pass. Polls until the deployment completes and fails the workflow if the deploy fails.

# .github/workflows/deploy.yml
name: Test & Deploy
on:
push:
branches: [main]
 
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm ci && npm test
 
deploy:
needs: test
runs-on: ubuntu-latest
steps:
- name: Trigger deployment
id: deploy
run: |
DEPLOY=$(curl -s -X POST \
-H "Authorization: Bearer $${{ secrets.ORKESTR_TOKEN }}" \
https://api.orkestr.eu/api/v1/projects/$${{ secrets.ORKESTR_PROJECT_ID }}/deployments)
echo "id=$(echo $DEPLOY | jq -r '.id')" >> $GITHUB_OUTPUT
echo "Deploy triggered: $(echo $DEPLOY | jq -r '.id')"
 
- name: Wait for deployment
run: |
for i in $(seq 1 60); do
STATUS=$(curl -s \
-H "Authorization: Bearer $${{ secrets.ORKESTR_TOKEN }}" \
https://api.orkestr.eu/api/v1/deployments/$${{ steps.deploy.outputs.id }} \
| jq -r '.status')
echo "Status: $STATUS"
case $STATUS in
live) echo "Deployed!"; exit 0 ;;
failed) echo "Deploy failed"; exit 1 ;;
esac
sleep 5
done
echo "Timeout"; exit 1

Auto-Rollback on Alert

Bash script - self-healing deployments via uptime webhooks

Wire this script into your uptime monitor's webhook (UptimeRobot, Betterstack, Pingdom). When your site goes down, it finds the last successful deployment and rolls back automatically.

#!/bin/bash
# auto-rollback.sh - triggered by uptime monitor webhook
 
API="https://api.orkestr.eu/api/v1"
TOKEN="sp_live_your_token"
PROJECT="your-project-id"
 
# Find the last successful deployment
LAST_GOOD=$(curl -s \
-H "Authorization: Bearer $TOKEN" \
"$API/projects/$PROJECT/deployments?limit=10" \
| jq -r '[.deployments[] | select(.status=="superseded" and .docker_image!=null)] | first | .id')
 
if [ "$LAST_GOOD" != "null" ] && [ -n "$LAST_GOOD" ]; then
echo "Rolling back to deployment $LAST_GOOD"
curl -s -X POST \
-H "Authorization: Bearer $TOKEN" \
"$API/deployments/$LAST_GOOD/rollback"
echo "Rollback triggered"
else
echo "No previous deployment to rollback to"
fi

Batch Operations Script

Bash - manage multiple projects programmatically

Loop through all your projects to update env vars, trigger deploys, or collect stats. Useful for agencies managing multiple client apps or teams with shared configuration.

#!/bin/bash
# batch-update.sh - update an env var across all projects
 
API="https://api.orkestr.eu/api/v1"
TOKEN="sp_live_your_token"
 
# Get all project IDs
PROJECTS=$(curl -s \
-H "Authorization: Bearer $TOKEN" \
"$API/projects" \
| jq -r '.projects[].id')
 
# Update env vars and redeploy each project
for id in $PROJECTS; do
echo "Updating project $id..."
 
# Set new env var
curl -s -X PATCH \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"env_vars":{"APP_VERSION":"2.1.0","UPDATED_AT":"$(date -u +%Y-%m-%dT%H:%M:%SZ)"}}' \
"$API/projects/$id"
 
# Trigger redeploy
curl -s -X POST \
-H "Authorization: Bearer $TOKEN" \
"$API/projects/$id/deployments"
 
echo "Done. Deployment queued."
done
 
echo "All projects updated and deploying."

AI Assistant

MCP - deploy and manage infrastructure with natural language

Connect an MCP client like Claude Code and manage your entire infrastructure conversationally. No scripts, no dashboards - just tell your AI assistant what you need.

You
create a staging environment for my-api on the develop branch
Claude
Created environment staging for my-api on branch develop.
Auto-deploy is enabled - pushes to develop will deploy automatically.
URL: my-api-staging.orkestr.eu
You
add a postgres database and deploy it
Claude
Provisioned PostgreSQL 16 add-on for my-api.
Connection string injected as DATABASE_URL.
Deployment triggered - build started.
You
how's the CPU looking after the deploy?
Claude
Container stats for my-api (production):
CPU: 12.4% of 0.5 vCPU - Memory: 187 MB / 512 MB
Network: 2.1 MB in / 890 KB out - Uptime: 4 minutes
Looks healthy. Well within resource limits.