Node.js - Getting Started Guide

Node.js - Getting Started Guide

Node.js is a JavaScript runtime for building server-side applications. This server comes with Node.js 22 LTS, npm, PM2 process manager, git and build-essential pre-installed. No setup wizard, no configuration - just SSH in and start deploying your applications.


Step 1 - Verify Node.js Works

Your server's IP address and root password are shown on the Server Details page in your client panel. Connect to your server via SSH:

ssh root@your.server.ip

Verify that Node.js and PM2 are installed:

node --version
npm --version
pm2 --version

If you placed the server behind a VyOS router on a private network, either configure port forwarding (ports 22, 80 and 443) to make your app accessible from the internet, or connect over a VPN and reach the server on its private IP.


Step 2 - Deploy Your First Application

Create a simple HTTP server to test that everything works:

mkdir ~/myapp && cd ~/myapp

cat > app.js << 'EOF'
const http = require('http');
const server = http.createServer((req, res) => {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello from Node.js ' + process.version + '\n');
});
server.listen(3000, () => console.log('Server running on port 3000'));
EOF

node app.js

Open http://your.server.ip:3000 in your browser. You should see the greeting message. Press Ctrl+C to stop the server.

Deploy from Git

cd /root
git clone https://github.com/your-username/your-project.git
cd your-project
npm install

Step 3 - Set Up Reverse Proxy and SSL (Optional)

To serve your app on port 80/443 with a domain name, install Nginx as a reverse proxy:

apt update && apt install -y nginx

cat > /etc/nginx/sites-available/myapp << 'EOF'
server {
    listen 80;
    server_name your-domain.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_cache_bypass $http_upgrade;
    }
}
EOF

ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
rm /etc/nginx/sites-enabled/default
nginx -t && systemctl reload nginx

Then enable free HTTPS with Let's Encrypt:

apt install -y certbot python3-certbot-nginx
certbot --nginx -d your-domain.com

Certbot will automatically configure SSL and set up auto-renewal.


PM2 - Process Manager

Running node app.js directly stops the app when you close the terminal or if it crashes. PM2 keeps your application running in the background, restarts it on crash, and auto-starts it after server reboot.

Basic commands:

# Start your application
pm2 start app.js --name myapp

# View running applications
pm2 list

# View logs
pm2 logs myapp

# Restart / stop / remove
pm2 restart myapp
pm2 stop myapp
pm2 delete myapp

Auto-start on reboot

PM2 is pre-configured to start on boot. After starting your apps, save the process list so they restart automatically after a server reboot:

pm2 save

Run pm2 save again whenever you add or remove applications.

Cluster mode

Run multiple instances of your app to use all available CPU cores:

# Start with one instance per CPU core
pm2 start app.js -i max --name myapp

# Or specify the number of instances
pm2 start app.js -i 2 --name myapp

Monitoring

View real-time CPU and memory usage:

pm2 monit

Post-Installation

Fail2Ban - Brute-Force Protection

Your server comes with Fail2Ban pre-configured to protect SSH from brute-force attacks.

Rule Max Attempts Ban Duration
SSH5 failed logins10 minutes

Useful commands:

# Check banned IPs
fail2ban-client status sshd

# Unban an IP
fail2ban-client set sshd unbanip 1.2.3.4

If you accidentally lock yourself out, connect via VNC console in your client panel and unban your IP.

Service Management

PM2 manages your Node.js apps. Nginx (if installed for reverse proxy) runs via systemd:

# PM2 daemon
pm2 resurrect              # restore saved process list
pm2 status                 # overview

# Nginx reverse proxy
systemctl status nginx
systemctl reload nginx
journalctl -u nginx -n 100

Native Modules

build-essential (gcc, g++, make) is pre-installed, so npm packages with native C/C++ addons compile without issues:

npm install bcrypt
npm install sharp
npm install sqlite3

Updates

# Update Node.js
apt update && apt install -y nodejs

# Update PM2
npm install -g pm2
pm2 update

# Update OS packages
apt update && apt upgrade -y

Software Included

Component Version
Ubuntu24.04 LTS
Node.js22.x LTS
npm10.x
PM26.x
git2.43
build-essentialgcc 13.3
Fail2Ban1.0.2

Troubleshooting

Problem Solution
App crashes and doesn't restart Use PM2 instead of node app.js: pm2 start app.js
App not running after reboot Run pm2 save after starting your apps to enable auto-start
Port already in use Check what's using it: ss -tlnp | grep :3000
npm install fails with build errors build-essential is pre-installed. Check the error - you may need apt install python3 for some packages
No space left on device Check disk: df -h /. Clean npm cache: npm cache clean --force
Blocked by Fail2Ban Use VNC console in your client panel to unban your IP
Forgot root password Use VNC console in your client panel to reset it


Was this article helpful?

mood_bad Dislike 0
mood Like 0
visibility Views: 59