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
- pendingqueued
- buildingrailpack
- imagepushed
- rolloutswarm
- routecaddy
- tlsissued
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.
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
- detectrailpack · bun + vite0.4s
- install412 packages6.2s
- buildbun run build11.4s
- imagesha256:9f3c1a…2.1s
- rollout1/1 replicas healthy3.0s
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
Storefront and checkout. Built from the main branch on every push.
Primary datastore. Nightly encrypted backups to object storage.
- 4.2 GBpgdata/var/lib/postgresql/data
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
- storefront.example.com→ webtls validdns pointed
- api.example.com→ apitls validdns pointed
- new.example.com→ webtls obtainingdns unpointed
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
- DATABASE_URL${database:postgres.DATABASE_URL}
- REDIS_URL${database:cache.REDIS_URL}
- STRIPE_KEY••••••••••••••••sealed
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
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.
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
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.