---
title: "How To Install CloudPanel and Host Node.js Apps"
description: "Step-by-step guide to installing CloudPanel on a VPS and deploying Node.js applications like Strapi with PM2 for automatic restarts."
date: 2026-07-01
categories: ["vps"]
tags: ["cloudpanel","node","tutorials"]
---

import Button from "../../components/widgets/Button.astro";
import YouTubeEmbed from "../../components/widgets/YouTubeEmbed.astro";
import { Picture } from "astro:assets";
import cloudpanelNodeSite from "../../assets/images/23/sanity_node.jpeg";

[CloudPanel](https://www.cloudpanel.io/) is a free hosting panel you install on a VPS. It runs on Nginx and supports PHP, Node.js, Python, and static sites through a clean web UI. No licensing fees, no per-site limits.

This guide walks you through installing CloudPanel on a fresh VPS and deploying a Node.js application (we'll use Strapi as the example) with PM2 for process management.

## What CloudPanel offers

- File Manager
- IP and bot blocking
- Varnish Cache and Redis
- SSH/FTP access
- Firewall
- Cron jobs
- Vhost editor
- Remote backup with Rclone
- Free Let's Encrypt certificates
- Cloudflare integration
- User management
- System resource usage graphs
- Multiple PHP versions
- MySQL and MariaDB support
- Node.js and Python support
- Nginx web server

## Minimum requirements

- 1 CPU core (2+ recommended for production)
- 2 GB RAM (4 GB+ recommended for production)
- 10 GB disk space

> If you want to monitor server resources like CPU, memory, and disk space, check: [How To Monitor Server and Docker Resources](https://www.bitdoze.com/sever-monitoring/)

CloudPanel has direct cloud integrations with [DigitalOcean](https://go.bitdoze.com/do), [Vultr](https://go.bitdoze.com/vultr), [Hetzner](https://go.bitdoze.com/hetzner), [Hostinger](https://go.bitdoze.com/hostinger-vps), AWS, and Google Cloud. These integrations let you create and manage snapshots from the CloudPanel UI.

This article uses Hetzner with Ubuntu 24.04. If you're choosing a provider, check the [DigitalOcean vs Vultr vs Hetzner](https://www.wpdoze.com/digitalocean-vs-vultr-vs-hetzner/) comparison.

If you want to monitor CPU usage and get automatic email alerts when load is high: [Monitor CPU Usage and Send Email Alerts in Linux](https://www.bitdoze.com/monitor-cpu-usage-and-send-email-alerts-in-linux/)

## Video walkthrough

<YouTubeEmbed
  url="https://www.youtube.com/embed/5KndMFz-VKQ"
  label="How To Install CloudPanel and Host Node.js Apps"
/>

If you want a web panel that also works as a reverse proxy, check this course:

<Button
  link="https://webdoze.net/courses/cloudpanel-setup/"
  text="CloudPanel Setup Course"
/>

> You can also check [Setup CloudPanel with Docker and Dockge](https://www.bitdoze.com/cloudpanel-setup-dockge/) to use CloudPanel as a reverse proxy for Docker containers and [CloudPanel Remote Backups](https://www.bitdoze.com/cloudpanel-remote-backups/).

> Looking for free self-hosted apps? Check [toolhunt.net self hosted section](https://toolhunt.net/sh/).

## 1. Install CloudPanel

After your VPS is created, SSH in and run the commands below.

### 1.1 Update the OS

```bash
apt update && apt -y upgrade && apt -y install curl wget sudo
```

### 1.2 Install CloudPanel

CloudPanel supports Ubuntu 24.04/22.04 and Debian 13/12/11. The installer hash below is current as of mid-2026. Always check the [CloudPanel install docs](https://www.cloudpanel.io/docs/v2/getting-started/hetzner-cloud/installation/installer/) for the latest hash and available database options.

For **Hetzner with MariaDB 11.4**:

```bash
curl -sS https://installer.cloudpanel.io/ce/v2/install.sh -o install.sh; \
echo "6eac061df80f08b75224fcd7fce2f115e201696d8a6122e31abf7259a813b462  install.sh" | \
sha256sum -c && sudo CLOUD=hetzner DB_ENGINE=MARIADB_11.4 bash install.sh
```

For **Hetzner with MySQL 8.4**:

```bash
curl -sS https://installer.cloudpanel.io/ce/v2/install.sh -o install.sh; \
echo "6eac061df80f08b75224fcd7fce2f115e201696d8a6122e31abf7259a813b462  install.sh" | \
sha256sum -c && sudo CLOUD=hetzner DB_ENGINE=MYSQL_8.4 bash install.sh
```

Available database options depend on your OS. Check the docs for MySQL 8.0, MariaDB 10.11, and other combinations. For non-Hetzner providers, change the `CLOUD=` value or omit it entirely.

### 1.3 Access CloudPanel admin

Access the admin panel at `https://serverIpAddress:8443`. You'll get a self-signed certificate warning -- click through it.

**Important:** Create the admin user immediately. There's a short window after install where bots could create the user first. For extra security, restrict port 8443 to your IP via firewall until you've set the admin password.

### 1.4 Create an admin subdomain

To access CloudPanel securely with a proper SSL certificate, create a subdomain (e.g., `admin.yourdomain.com`) and point it to your VPS IP. If you use Cloudflare, add an A record under DNS.

Then go to **Settings** in the CloudPanel admin and add the subdomain there to secure the admin area.

<Button link="https://go.bitdoze.com/do" text="DigitalOcean $100 Free" />
<Button link="https://go.bitdoze.com/vultr" text="Vultr $100 Free" />
<Button link="https://go.bitdoze.com/hetzner" text="Hetzner €⁠20 Free" />
<Button link="https://go.bitdoze.com/hostinger-vps" text="Hostinger VPS" />

## 2. Deploy a Node.js app on CloudPanel

We'll deploy Strapi, a popular open-source headless CMS built on Node.js. The same process works for any Node.js application.

### 2.1 Add a Node.js site in CloudPanel

Click **Add Site** and choose **Create a Node.js Site**. Fill in your domain, select a Node.js version (22 LTS is recommended), set the app port, and create your site user credentials.

<Picture
  src={cloudpanelNodeSite}
  alt="CloudPanel add Node.js site"
/>

### 2.2 Point the domain to CloudPanel

Add an A record in your DNS (e.g., Cloudflare) pointing your domain or subdomain to the VPS IP. Enable the Cloudflare proxy if you want CDN benefits.

### 2.3 Generate the SSL certificate

Go to **SSL/TLS** for your site in CloudPanel and generate a Let's Encrypt certificate so the site works over HTTPS.

### 2.4 Install Strapi

SSH in as the **site user** (not root):

```bash
sudo su - <your-site-username>
cd htdocs && rm -rf www.yourdomain.com
npx create-strapi@latest www.yourdomain.com --skip-cloud
```

The CLI will ask a few questions (TypeScript or JavaScript, database choice, etc.). For a quick start, accept the defaults -- Strapi v5 uses SQLite by default.

If you prefer to use MySQL or MariaDB (which CloudPanel already has running), pass the database flags:

```bash
npx create-strapi@latest www.yourdomain.com --skip-cloud \
  --dbclient=mysql \
  --dbhost=127.0.0.1 \
  --dbport=3306 \
  --dbname=strapi_db \
  --dbusername=strapi_user \
  --dbpassword=your_password
```

You'll need to create the database and user first in CloudPanel under **Databases**.

### 2.5 Build Strapi for production

```bash
cd htdocs/www.yourdomain.com/
NODE_ENV=production npm run build
```

### 2.6 Start Strapi

```bash
NODE_ENV=production npm start
```

You'll see output like:

```
 Project information

┌────────────────────┬──────────────────────────────────────────┐
│ Time               │ ...                                      │
│ Launched in        │ 1047 ms                                  │
│ Environment        │ production                               │
│ Process PID        │ 121469                                   │
│ Version            │ 5.x.x (node v22.x.x)                    │
│ Database           │ sqlite                                   │
└────────────────────┴──────────────────────────────────────────┘

 Create your first administrator by going to:
 http://0.0.0.0:1337/admin
```

### 2.7 Create the admin user

Visit `https://www.yourdomain.com/admin` and fill in your admin credentials to set up the Strapi dashboard.

<Button link="https://go.bitdoze.com/do" text="DigitalOcean $100 Free" />
<Button link="https://go.bitdoze.com/vultr" text="Vultr $100 Free" />
<Button link="https://go.bitdoze.com/hetzner" text="Hetzner €⁠20 Free" />
<Button link="https://go.bitdoze.com/hostinger-vps" text="Hostinger VPS" />

## 3. Enable auto-start with PM2

A Node.js app won't restart on its own after a server reboot. PM2 handles that.

### 3.1 Install PM2

For a complete PM2 guide, check [Manage Applications with PM2](https://www.bitdoze.com/pm2-manage-apps/).

```bash
npm install pm2@latest -g
```

### 3.2 Start the app and save the config

```bash
pm2 start npm --name strapi-app -- start
pm2 save
```

### 3.3 Add a cron job to restore PM2 on reboot

Get the current PATH:

```bash
echo $PATH
```

Edit the user crontab:

```bash
crontab -e
```

Add these lines, replacing the PATH value with your actual output:

```bash
PATH=/home/your-site-user/.nvm/versions/node/v22.x.x/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
@reboot pm2 resurrect &> /dev/null
```

Verify it was saved:

```bash
crontab -l
```

Reboot the server and confirm the app comes back:

```bash
pm2 status
```

You should see the status as **online**:

```
┌─────┬───────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id  │ name          │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
├─────┼───────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0   │ strapi-app    │ default     │ 5.x.x   │ fork    │ 1521     │ 50s    │ 0    │ online    │ 0%       │ 56.7mb   │ bit…     │ disabled │
└─────┴───────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
```

## Conclusions

This is how you install CloudPanel on a VPS and host Node.js apps like Strapi. The panel handles Nginx configuration, SSL certificates, and database management through a web interface, while PM2 keeps your Node.js process alive across reboots.

CloudPanel has been reliable in my experience. It's free, actively maintained, and covers most use cases for developers who want a simple server management panel without the overhead of cPanel or Plesk.

<Button link="https://go.bitdoze.com/do" text="DigitalOcean $100 Free" />
<Button link="https://go.bitdoze.com/vultr" text="Vultr $100 Free" />
<Button link="https://go.bitdoze.com/hetzner" text="Hetzner €⁠20 Free" />
<Button link="https://go.bitdoze.com/hostinger-vps" text="Hostinger VPS" />