Bash deployment CLI

Ship Node apps to your server. No ceremony.

ShipNode deploys backends and static frontends over SSH, builds releases, flips the current symlink atomically, reloads PM2, verifies health, and rolls back when a release misbehaves.

curl -fsSL https://shipnode.dev/install -o shipnode-installer.sh && bash shipnode-installer.sh
Trace the deploy path
deploy@vps-ams-04 release healthy
$ shipnode init framework Express package manager pnpm app type backend config shipnode.conf created $ shipnode deploy rsync ./ -> /var/www/api/releases/20260428194612 install pnpm install --frozen-lockfile build pnpm run build symlink current -> releases/20260428194612 pm2 reload api --update-env health GET /health 200 OK 47ms deployed https://api.example.com
releases/20260428180603 current -> 20260428194612 shared/.env
Install command copied

Release path

Three commands with an audit trail.

ShipNode stays intentionally boring on the server: timestamped folders, a shared env file, an atomic symlink, PM2 for processes, and Caddy for HTTPS.

01

Detect

Reads package.json and lockfiles to infer Express, NestJS, Next.js, Astro, React, Vue, Svelte, npm, yarn, pnpm, or bun.

shipnode init
02

Prepare

Installs Node.js, PM2, Caddy, jq, and the matching package manager on Ubuntu or Debian. This is the one-time server pass.

shipnode setup
03

Release

Builds, syncs, creates a timestamped release, switches the current symlink, reloads PM2, and checks health before declaring victory.

shipnode deploy
/var/www/myapp zero downtime layout
current -> releases/20260428194612
releases/
  20260428180603/
  20260428194612/
shared/
  .env
  ecosystem.config.cjs
.shipnode/
  releases.json
  deploy.lock

Why it exists

No magic, just good server hygiene.

ShipNode is for developers who want a real server without rebuilding a deploy platform from shell history. It keeps the moving parts plain: SSH, rsync, releases, PM2, Caddy, health checks, and rollback.

Docker/Kubernetes

Great at scale, heavy when you just need a VPS release path.

PaaS platforms

Fast to start, but pricing and platform rules become part of your architecture.

Manual SSH

Transparent, but easy to forget a step under pressure.

ShipNode

Keeps the server visible and turns repeatable release hygiene into commands.

shipnode.conf production
APP_TYPE=backend
SSH_USER=deploy
SSH_HOST=203.0.113.10
SSH_PORT=22

REMOTE_PATH=/var/www/api
PM2_APP_NAME=api
BACKEND_PORT=3000
DOMAIN=api.example.com

ZERO_DOWNTIME=true
HEALTH_CHECK_PATH=/health
HEALTH_CHECK_RETRIES=3
KEEP_RELEASES=5

Library surface

A deploy tool made of readable shell modules.

The CLI is split into focused modules for validation, prompts, package managers, templates, database setup, users, releases, and commands. That keeps the tool small enough to inspect.

01

Zero-downtime releases

Timestamped directories and atomic symlink switching keep active traffic on the previous build until the new one is verified.

02

Health-gated deploys

Configurable endpoint checks decide whether the release survives or rolls back automatically.

03

PM2 and Caddy templates

Generated configs can be ejected, edited, and kept across future deploys.

04

Server hardening

SSH, firewall, fail2ban, app users, and sudo policies can be managed from the same CLI surface.

05

Profiles and CI

Deploy production, staging, or a custom config, then generate GitHub Actions workflows when you are ready.

06

Database and Redis setup

Optional PostgreSQL, MySQL, SQLite, and Redis provisioning prepares services on the target server.

Command map

Small verbs, practical control.

ShipNode does not hide the server. It gives you memorable commands for the tasks that normally scatter across SSH sessions, copied snippets, and half-finished notes.

Bootstrap

shipnode init Create shipnode.conf with framework-aware defaults
shipnode setup Install Node.js, PM2, Caddy, jq, and package managers
shipnode users-yaml Generate a team access manifest

Ship

shipnode deploy Build, sync, release, health-check
shipnode deploy --profile staging Use shipnode.staging.conf
shipnode rollback 2 Move current back two releases
shipnode unlock Clear a stale deploy lock

Operate

shipnode status Inspect PM2 and release state
shipnode logs Stream process logs
shipnode metrics Watch CPU and memory
shipnode doctor Run pre-flight diagnostics

Customize

shipnode eject Persist PM2 and Caddy templates
shipnode env Upload shared environment variables
shipnode ci github Generate a GitHub Actions workflow
shipnode harden Apply SSH, firewall, and fail2ban guidance

Detection matrix

Bring the stack you already picked.

ShipNode reads the local project, picks the right install/build/start commands, and lets config override the rare case where auto-detection is not enough.

Backends

ExpressNestJSFastifyKoaHonoAdonisJS

Full-stack

Next.jsNuxtRemixAstro

Frontends

ReactVueSvelteAngularSolidJS

Package managers

npmyarnpnpmbun

Start shipping

Install once. Deploy from the project folder.

curl -fsSL https://shipnode.dev/install -o shipnode-installer.sh && bash shipnode-installer.sh