HTTPS from the first boot
Set your panel domain and ACME email in the installer. A one-time setup token protects the first admin, and the stable channel lets you choose a slower release cadence.
Install on your own domainPush a branch. NineDeploy builds and deploys it on your server, with automatic TLS and healthchecked rollouts. Your databases, backups and certificates live alongside it.
curl -fsSL https://ninedeploy.com/install.sh | bashapi.example.com
Try breaking it. Traffic stays where it is.
Current release · v0.18.26
Set your panel domain and ACME email in the installer. A one-time setup token protects the first admin, and the stable channel lets you choose a slower release cadence.
Install on your own domainRestore verification covers all 11 managed engines in isolated copies. PostgreSQL adds point-in-time recovery into a new database. Structural drills remain a separate check.
Explore recovery322 templates, protected production lanes, CI runners and remote MCP. The runtime support matrix states exactly where canaries, autoscaling and scale to zero apply.
Check runtime supportRedrawn here from the real dashboard, numbers moving. Everything on this page has a screen like these behind it.
System
Activity
Monitoring
Doctor
Docker
Servers
Users
Settings
Live Monitoring & Telemetry
Real-time host, cluster nodes, container metrics and alerts.
Host CPU
8 cores
load avg 1.07 · total 5.5%
Host memory
16%
2.7 GB / 16.8 GB
Disk storage
30%
117.5 GB free
Active workloads
11
8 services · 3 databases
n8n
n8n-75
CPU
0.60 %
Memory
346 MB
Directus
directus-77
CPU
2.63 %
Memory
232 MB
Next.js Demo
nextjs-demo-118
CPU
0.03 %
Memory
42 MB
Uptime Kuma
uptime-kuma-41
CPU
0.24 %
Memory
88 MB
IT-Tools
it-tools-38
CPU
0.02 %
Memory
15 MB
pg
postgres
CPU
0.03 %
Memory
74 MB
Host, node and per-container telemetry every few seconds, with limits you can change in place.
Triggered by the panel, a webhook, the CLI, a cron job or a template install. Ten stages, and your site stays up through all of them.
A worker slot claims the deployment atomically and snapshots the build config plus a fingerprint of your env keys — never the values.
→ deployment #48 queued · slot-1 claimed
Builds still marked building after 45 minutes are requeued on boot, so a panel restart mid-build recovers instead of leaving a ghost.
→ requeued 1 stale build on boot
Image deploys pull, and a rollback pins the exact digest. Repo deploys check out the commit with the token scrubbed from every log line.
→ checkout 9f3c1ab · creds scrubbed
Project vars, then service vars, then attached database URLs. Infisical and Doppler references resolve at deploy time and are never stored.
→ env: 14 keys · DATABASE_URL injected
Your Dockerfile through buildx, Nixpacks when there isn't one, PM2 on the host, or docker compose up --build. The manifest fills any gaps.
→ buildx · 11/14 layers cached
The new container starts with secrets from a 0600 env-file that's deleted right after start. The old container keeps serving.
→ api-green up · api-blue serving
Container liveness and an HTTP probe against the new container's network IP, retried with a fresh timeout per attempt for up to five minutes.
→ GET /healthz → 200 (3/3)
Only after the probe passes: pin the digest, assign the domain, flip Traefik, wait two seconds, then retire the previous container.
→ route flipped → api-green
If anything fails, the new runtime is torn down and the old one keeps serving. Only the deployment is marked failed — not your site.
→ deploy #49 failed · api-green still live
The pipeline re-reads its own status at every checkpoint and tears down partial work when you cancel.
→ deploy #50 cancelled at build
Triggered by the panel, a webhook, the CLI, a cron job or a template install. Ten stages, and your site stays up through all of them.
Swipe through the ten stages.
It replaces the docker run invocations, nginx vhosts, certbot cron jobs and pg_dump scripts — and the wiki page nobody updated since the last migration.
From a push, an image or a template to a healthy container — and back again by digest.
Create services with a wizard, stream a running deploy, cancel it, roll it back. The CLI speaks the same REST API as the dashboard.
npm install -g ninedeploy
ninedeploy login # authenticate against your panel
ninedeploy services create # interactive wizard
ninedeploy services deploy 12
ninedeploy deploys watch 12 480 # stream a running deployment
ninedeploy env set 12 NODE_ENV production
ninedeploy domains add 12 api.example.com
ninedeploy system dashboard # live health boardThe honest pitch: you get the managed-platform experience and keep the bill and the data of a box you rent.
| Capability | NineDeploy | Raw Docker | Managed PaaS |
|---|---|---|---|
| Your data stays on your server | Always | Yes | Vendor cloud |
| Zero-downtime deploys | Blue-green | DIY scripts | Yes |
| Managed databases and backups | 11 engines, S3 | Manual | Metered |
| Automatic HTTPS and wildcard domains | ACME DNS-01 | Manual proxy | Yes |
| AI agents can operate it | 64 MCP tools | Shell access | Varies |
| Price at 50 services | $0, your hardware | $0, your weekends | Per seat, per GB |
| Lock-in | None, MIT | None | Proprietary |
Start with one host, then add nodes for workloads, databases or builds. The panel keeps its state in SQLite; Docker Swarm is an optional orchestrator for services that need rolling updates and replicas. Upgrades snapshot your data first and gate on a health endpoint.
It is not Kubernetes, and doesn't pretend to be.
NineDeploy
Self-hosted deployment platform
Serial: your-server-01. Made by OXOGNET OÜ, Estonia.
Finding these out during an incident is worse than reading them here. The architecture doc tracks each one against the code and marks it when it closes.
Agent transport has no TLS of its own.
It fails closed and uses sealed operations, but keep worker nodes on a private network or VPN.
Node capabilities depend on the agent version.
Updated nodes support Nixpacks and Railpack. Missing capabilities or disabled node switches give an explicit refusal. PM2 remains on the panel host.
Runtime support varies by placement.
Node HTTP/TCP readiness is opt-in. Node scale to zero is still being built; Swarm uses its configured replicas and native rolling updates. Read the support matrix for the current boundaries.
PM2 services have no blue-green window.
They stop, then start, with automatic rollback on failure.
One command, one admin account, one dashboard. The first account you create becomes the instance operator.
curl -fsSL https:/ / ninedeploy.com/ install.sh | bashRecommended for production on Linux with systemd. Provisions supported Node and Docker packages, verifies the release checksum, and prints a one-time first-admin setup token. Add --domain and --email for HTTPS from the first boot. Read the script