Skip to content

Start

Installation

Three ways up: one-click, Docker, or from source.

curl -fsSL https://ninedeploy.com/install.sh | bash

The installer provisions Node and Docker where supported, generates secrets, builds the panel and starts a hardened systemd service. Readiness is gated on /health. The panel binds to 127.0.0.1:3000 by default; use a local browser, SSH tunnel or HTTPS ingress to create the first account, which becomes the instance operator.

Docker

curl -fsSL https://ninedeploy.com/install.sh | bash -s -- --docker

The same installer supports container mode with --docker. It preserves secrets and the data volume during upgrades. For a manual image installation:

docker run -d --name ninedeploy \
  -v /var/run/docker.sock:/var/run/docker.sock \
  --group-add "$(getent group docker | cut -d: -f3)" \
  -v ninedeploy-data:/data \
  -p 127.0.0.1:3000:3000 \
  -e NINEDEPLOY_DATA_DIR=/data \
  -e NINEDEPLOY_DB_PATH=/data/ninedeploy.db \
  -e NINEDEPLOY_JWT_SECRET="$(openssl rand -hex 32)" \
  -e NINEDEPLOY_PUBLIC_URL=https://panel.example.com \
  ghcr.io/ninedeploy/ninedeploy:latest

All state (SQLite, repos, logs, backups, master keys) persists in the volume; database migrations apply automatically on boot. PM2 services require bare-metal mode; Docker containers and templates work in both modes.

From source

git clone https://github.com/ninedeploy/ninedeploy.git
cd ninedeploy
corepack enable
pnpm install
cp .env.example .env
pnpm build
pnpm dev        # API + built dashboard on :3000
pnpm dev:web    # optional Vite dashboard in a second shell on :5173

Upgrades

Re-run the same install command to upgrade. Bare-metal upgrades snapshot the database and master key before rebuilding and gate readiness on /health. Docker installs pin their image tag, so re-run with --docker to move to a new release. Read release-specific upgrade and rollback notes first; update node agents for new capabilities.

The canonical guides live in the repository's docs folder.