Detect
Reads package.json and lockfiles to infer Express, NestJS, Next.js, Astro, React, Vue, Svelte, npm, yarn, pnpm, or bun.
shipnode init Bash deployment CLI
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 $ 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 Release path
ShipNode stays intentionally boring on the server: timestamped folders, a shared env file, an atomic symlink, PM2 for processes, and Caddy for HTTPS.
Reads package.json and lockfiles to infer Express, NestJS, Next.js, Astro, React, Vue, Svelte, npm, yarn, pnpm, or bun.
shipnode init Installs Node.js, PM2, Caddy, jq, and the matching package manager on Ubuntu or Debian. This is the one-time server pass.
shipnode setup Builds, syncs, creates a timestamped release, switches the current symlink, reloads PM2, and checks health before declaring victory.
shipnode deploy current -> releases/20260428194612
releases/
20260428180603/
20260428194612/
shared/
.env
ecosystem.config.cjs
.shipnode/
releases.json
deploy.lock Why it exists
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.
Great at scale, heavy when you just need a VPS release path.
Fast to start, but pricing and platform rules become part of your architecture.
Transparent, but easy to forget a step under pressure.
Keeps the server visible and turns repeatable release hygiene into commands.
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
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.
Timestamped directories and atomic symlink switching keep active traffic on the previous build until the new one is verified.
Configurable endpoint checks decide whether the release survives or rolls back automatically.
Generated configs can be ejected, edited, and kept across future deploys.
SSH, firewall, fail2ban, app users, and sudo policies can be managed from the same CLI surface.
Deploy production, staging, or a custom config, then generate GitHub Actions workflows when you are ready.
Optional PostgreSQL, MySQL, SQLite, and Redis provisioning prepares services on the target server.
Command map
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.
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 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 shipnode status Inspect PM2 and release state shipnode logs Stream process logs shipnode metrics Watch CPU and memory shipnode doctor Run pre-flight diagnostics 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
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.
Start shipping
curl -fsSL https://shipnode.dev/install -o shipnode-installer.sh && bash shipnode-installer.sh