Skip to content
pre-1.0 · under active development

Push to git.
Deploy to your own servers.

A deployment platform that runs on your hardware. Builds from a repo, managed databases, automatic HTTPS, previews on every pull request — self-hosted, open source, no usage bill.

curl -fsSL https://get.otterdeploy.com/install.sh | bash
  • 5database engines
  • 18stack templates
  • 34CLI commands
  • 1machine to start
storefront / webrunning
  1. pendingqueued
  2. buildingrailpack
  3. imagepushed
  4. rolloutswarm
  5. routecaddy
  6. tlsissued
https://storefront.example.com23.1s
one platform

A repo goes in. A running, routed, backed-up service comes out.

Build, edge, data, logs, previews and backups are one install on machines you own — not six services you wire together and then maintain.

deploy

Connect a repo. Push. That's the deploy.

The repo is inspected, the framework is detected, and Railpack builds it — no Dockerfile to write and keep current, though it'll use yours if there is one. The image rolls out as a Swarm service, the old one drains, and the whole thing is one log you can watch.

  • Next.js, Astro, Go, Rust, static
  • Dockerfile when you want it
  • Rollback to any build
storefront / web · build #128running
  • detectrailpack · bun + vite0.4s
  • install412 packages6.2s
  • buildbun run build11.4s
  • imagesha256:9f3c1a…2.1s
  • rollout1/1 replicas healthy3.0s
deployed in 23.1sno downtime
projects

Your services, drawn the way you think about them

A project is a canvas: services, databases and compose stacks, with the wiring between them visible. Click a node for its logs, metrics, variables and domains — no hunting through tabs to find out what's actually running.

  • Live status per node
  • Compose stacks as one resource
  • Templates to start from
storefront4 resources
Next.js
web
Service
running

Storefront and checkout. Built from the main branch on every push.

Next.js · Railpack
a3f91c2feat: checkout redesign
postgres
Database
pending create

Primary datastore. Nightly encrypted backups to object storage.

PostgreSQL 17
Mounts
  • pgdata
    /var/lib/postgresql/data
    4.2 GB
edge

Domains that tell you the truth

Point a domain at your box and the Caddy edge picks it up, issues the certificate and starts routing. When something isn't right, it says which part — the DNS hasn't propagated, or the certificate is still being issued.

  • Automatic HTTPS
  • Multi-domain routing
  • Password-wall a deployment
edge / routescaddy
  • storefront.example.comweb
    tls validdns pointed
  • api.example.comapi
    tls validdns pointed
  • new.example.comweb
    tls obtainingdns unpointed
data

Databases your services can just ask for

Provision Postgres, Redis, MariaDB, MongoDB or ClickHouse next to the app that needs it. Reference it by name and the connection string is filled in at deploy — nothing copied, nothing to rotate by hand. Secrets can be sealed so even the API won't read them back.

  • Five engines
  • Encrypted backups
  • Restore to any snapshot
web · environment3 keys
  • DATABASE_URL${database:postgres.DATABASE_URL}
  • REDIS_URL${database:cache.REDIS_URL}
  • STRIPE_KEY••••••••••••••••sealed
resolved at deploy
postgres://web:••••••@postgres:5432/app
previews

Every pull request gets its own URL

Open a PR and it comes up on its own deployment, with its own database copy if you want one. The link goes on the pull request. Close it and everything is torn down — and anything left idle is reaped without you remembering to.

  • Per-PR deployments
  • Optional database branching
  • Automatic teardown
pull request #482preview · active

feat: checkout redesign

storefront-pr-482.example.com
compute
its own service, its own route
database
postgres → branched copy
teardown
when the PR closes, or when it goes idle

And the rest of the platform

No tiers, no add-ons, no seat pricing. All of it is in the box you install.

Read the docs

Build & deploy

  • Framework auto-detect
  • Dockerfile builds
  • Monorepo aware
  • Compose stacks
  • 18 stack templates
  • Rollback
  • Crash reporting
  • Environments

Edge & networking

  • Multi-domain routing
  • Automatic TLS
  • Custom certificates
  • Layer-4 exposure
  • Deployment protection
  • Access logs
  • Edge events
  • CrowdSec

Data

  • Postgres
  • Redis
  • MariaDB
  • MongoDB
  • ClickHouse
  • Built-in data browser
  • Encrypted backups
  • Scheduled snapshots
  • Volumes & mounts

Operate

  • Live logs
  • CPU & memory metrics
  • Web terminal
  • Multi-node Swarm
  • Tailscale & NetBird mesh
  • Host health alerts
  • Slack, Discord, PagerDuty
  • Raw Docker

Access & security

  • Org RBAC
  • Scoped API keys
  • Audit log
  • Sealed variables
  • Host firewall
  • SSH keys
  • Private registries
  • Anomaly alerts

Automate

  • otterdeploy.json
  • Typed oRPC API
  • 34 CLI commands
  • Outbound webhooks
  • Inbound triggers
  • Device login
  • CI tokens
  • Shell completions

One box, one command, your own platform.

The installer provisions the host, pulls the published images, puts Docker into Swarm mode and brings the stack up — with the host firewall and CrowdSec on by default.

curl -fsSL https://get.otterdeploy.com/install.sh | bash
Host
One Linux box with root
Runtime
Docker, Swarm-enabled by the installer
Ports
80 and 443, for the edge and ACME
pre-1.0

otterdeploy is under active development. Interfaces and schemas still change without migration paths, so it isn't recommended for production workloads yet — run it on something you'd be willing to rebuild.