Every Node.js deploy guide in 2026 starts the same way: write a Dockerfile, configure docker-compose, set up a multi-stage build, push to a registry, pull on the server, configure networking…
For a simple Express or Fastify app? That’s 30 minutes of infrastructure work for an app that took 5 minutes to build.
You don’t need Docker to deploy Node.js. Here are the alternatives - from zero-config to full control.
Why Developers Default to Docker (And Why They Shouldn’t Always)
Docker solves real problems: reproducible environments, dependency isolation, consistent deploys across machines. For production microservices at scale, Docker makes sense.
But most Node.js apps aren’t production microservices. They’re:
- Side projects
- MVPs and prototypes
- Internal tools
- API backends for a frontend
- Bots and automation scripts
For these, Docker adds complexity without proportional benefit. You’re maintaining a Dockerfile, dealing with image sizes, debugging container networking, and managing a registry - all for an app that runs fine with node index.js.
Method 1: Git Push Deploy (Zero Config)
The simplest path. Push your code, get a live URL.
# Install the CLI
curl -fsSL https://instapods.com/install.sh | sh
# Deploy from your project directory
instapods deploy my-app --preset nodejs
That’s it. No Dockerfile. No build configuration. The platform detects your package.json, installs dependencies, starts your app, and gives you a live URL with SSL.
What happens behind the scenes:
- Your code is uploaded to a real Linux server with Node.js 20 pre-installed
npm installruns your dependencies- Your app starts on the configured port (default: 3000)
- Nginx is configured as a reverse proxy with SSL
- A domain is assigned:
my-app.nbg1-1.instapods.app
Subsequent deploys update the code and restart:
instapods deploy my-app
Cost: $3/mo (Launch plan) or $7/mo (Build plan for more resources)
Setup time: Under 60 seconds
You manage: Nothing
SSH access: Yes - ssh instapod@my-app.nbg1-1.instapods.app
The SSH access is the key difference from platforms like Vercel or Railway. If something goes wrong, you can SSH in, check logs, inspect processes, and debug in real time. No “check the dashboard logs” limitation.
Method 2: Vercel / Netlify (Serverless)
For frontend-heavy Node.js apps (Next.js, Nuxt, SvelteKit), serverless platforms deploy without Docker:
# Vercel
npx vercel
# Netlify
npx netlify deploy --prod
The catch: These platforms run your Node.js code as serverless functions, not as a persistent process. That means:
- No WebSocket support (or limited)
- No persistent filesystem (SQLite won’t work)
- Cold starts on infrequent requests
- No background jobs or cron
- No SSH access
- Usage-based billing that can spike
If your app is a Next.js frontend with API routes, Vercel works great. If your app is an Express API with SQLite, a WebSocket server, or long-running background processes, serverless won’t work.
Cost: Free tier available. Pro starts at $20/mo. Bandwidth overage charges possible. Setup time: 2-5 minutes You manage: Nothing SSH access: No
Method 3: Railway / Render (Managed PaaS)
Railway and Render detect your Node.js app from package.json and deploy without a Dockerfile:
# Railway
railway up
# Render
# Connect your GitHub repo in the dashboard
Both platforms use buildpacks (similar to Heroku) to detect your runtime and build your app. No Dockerfile required.
The catch: Both use container-like isolation under the hood (even if you don’t write a Dockerfile). This means:
- Persistent filesystem is limited or ephemeral
- Railway: usage-based pricing, no SSH
- Render: free tier has cold starts (30-second spin-up), databases cost extra ($7/mo+)
- Neither gives you SSH access to the running instance
Cost: Railway ~$5-15/mo (usage-based). Render $7/mo (Starter) + database extra. Setup time: 5-10 minutes You manage: Nothing SSH access: No
Method 4: Raw VPS with PM2 (Full Control, No Docker)
For developers who want full control without Docker, a VPS with PM2 is the traditional approach:
# On your VPS
ssh root@your-server
# Install Node.js
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs
# Clone your app
git clone https://github.com/you/your-app.git /var/www/app
cd /var/www/app
npm install --production
# Start with PM2
npm install -g pm2
pm2 start index.js --name my-app
pm2 save
pm2 startup
Then you still need:
- Nginx as a reverse proxy (15-20 lines of config)
- Certbot for SSL (Let’s Encrypt)
- UFW for firewall rules
- Git hooks or CI for deploy automation
Total setup: 1-3 hours for someone who’s done it before.
Cost: $4-6/mo (Hetzner, DigitalOcean) Setup time: 1-3 hours You manage: Everything - OS updates, Node updates, nginx, SSL renewal, PM2, firewall, backups SSH access: Yes (it’s your server)
Comparison Table
| Method | Docker Required | Cost/mo | SSH | Persistent FS | Setup Time |
|---|---|---|---|---|---|
| Git push deploy (InstaPods) | No | $3-7 | Yes | Yes | 60 sec |
| Vercel/Netlify | No | $0-20+ | No | No | 2-5 min |
| Railway/Render | No | $5-15+ | No | Limited | 5-10 min |
| VPS + PM2 | No | $4-6 | Yes | Yes | 1-3 hours |
| Docker on VPS | Yes | $4-6 | Yes | Yes | 30-60 min |
The Docker option is included for comparison. Notice it’s the most expensive in time for the same cost as the VPS + PM2 approach. Docker adds build complexity without adding functionality for a single Node.js app.
When You Actually Need Docker
Docker earns its complexity in specific scenarios:
- Multiple services with different runtimes (Node + Python + Redis) on one server
- Team standardization where 10+ developers need identical environments
- CI/CD pipelines that build and push images to a registry
- Kubernetes deployments where container images are the unit of deployment
- Reproducibility requirements where “works on my machine” isn’t acceptable
For a single Node.js app? instapods deploy or pm2 start gets you to production faster with less overhead.
Getting Started
If your Node.js app has a package.json with a start script, you’re ready to deploy without Docker:
{
"scripts": {
"start": "node index.js"
}
}
The fastest path to a live URL:
instapods deploy my-app --preset nodejs
Your app is live with SSL, custom domain support, and SSH access. No Dockerfile. No container registry. No orchestration.