Skip to main content
Updated: August 9, 2026
Matic Bončina
By Matic BončinaFounder
Proofread & verified
The cPanel Setup Node.js App tool registers a Node app under your account, gives it an isolated virtual environment for its dependencies, and hands the running process to Phusion Passenger. Each app picks its own Node version. You can run several apps under the same account on different paths or versions.
Check your plan first. The Noxity plan comparison lists Node.js under BONFIRE, BLAZE, and INFERMO. SPARK includes Git and FLAME adds SSH, but neither one lists the runtimes, so Setup Node.js App won’t appear in cPanel on those plans. See the plan comparison ↗.

Available versions

Thirteen interpreters are enabled on our shared servers, from Node 6 through Node 24: The dropdown opens on 10.24.1, which reached end of life in 2021. Change it before you create anything: pick 24 unless a dependency pins you lower.

Set up an app

1

Open Setup Node.js App

From cPanel home, scroll to Software and click Setup Node.js App.
2

Click Create application

On an empty account the Web applications tab reads “No applications found”, with a Create application button beside it.
3

Fill in the form

  • Node.js version: pick from the dropdown. It opens on 10.24.1, so change it.
  • Application mode: Development or Production. cPanel describes it as “Adds value for NODE_ENV variable” and it starts on Development.
  • Application root: directory under your home, e.g. myapp. Required. Created if it doesn’t exist.
  • Application URL: domain dropdown plus optional path. Use / for the root or /api for a sub-path.
  • Application startup file: the file that exports your handler. The field starts empty, so fill it in yourself.
  • Environment variables: add them one at a time with Add variable.
4

Save

Click Create. Passenger starts the app in the background.The Selector scaffolds the application root for you: a public/ directory, a tmp/ directory holding restart.txt, and a working starter app.js. Replace app.js with your own code when you deploy.

Manage an app

The management page opens after creation and is reachable from the app list. There’s no separate Edit button. The management page is the form: change a field in place, then click Save.
Destroy is not reversible. It unregisters the app and deletes ~/nodevenv/<app-root>/, so every installed dependency goes with it. Your code is left alone: the application root and everything in it stays on disk, which also means creating an app with the same root again won’t start from scratch.
The Environment variables editor sits below the buttons, so you can add or change config after the app exists. Restart for new values to take effect.

Passenger owns the port

Passenger starts your process and forwards each request to it. In Node it hooks the first http.Server that calls listen() and moves it onto a Unix socket, so the port number you pass is ignored. That means the ordinary shape works unchanged:
app.js
Leaving app.listen(3000) in place is fine, and it’s what most Node projects already do. Exporting the server instead also works if your project is written that way:
app.js
If you want the shortest proof, look at the starter file the Selector writes into a brand new application root:
app.js
That is cPanel’s own working example, and it calls listen().
Older guides tell you to delete the listen() call before deploying behind Passenger. You don’t need to. Reverse port binding has handled this for years, and the port argument is discarded.

Reference: where things live

Touching the restart trigger reloads the app on the next request rather than instantly. The activate script is what Run NPM Install sources before running npm install. From SSH:

Common issues

The process isn’t running. Usually it crashed on boot: a missing dependency, a syntax error, or a startup file naming a path that doesn’t exist. Check Application startup file points at a real file, click Run NPM Install, then Restart.Don’t go deleting app.listen() on the strength of an old tutorial. Passenger ignores the port you pass, so that line is not what’s breaking it.
package.json is in the application root, but node_modules was built on a different machine or against a different Node version. Click Run NPM Install so it installs against the per-app env.
Passenger gives an app 90 seconds to start, then kills the process and logs an error. A large dataset loaded on boot, or a synchronous DNS lookup, is usually what pushes past it.Move that work out of the startup path, or open a ticket if your app genuinely needs longer.
Every open socket holds an entry process for as long as it lives. Entry processes cap how many requests you can serve at once: 100 on BONFIRE, 150 on BLAZE, 210 on INFERMO. A WebSocket-heavy app runs into that ceiling long before it runs out of memory.Budget your concurrent socket count against your plan’s number, and move to a higher tier if you need more headroom.
Memory is 6 GB on BONFIRE, 8 GB on BLAZE, and 12 GB on INFERMO, shared with everything else on the account. A large dependency tree, Next.js or Strapi say, can still spike past what’s free during install.Run the install over SSH with --prefer-offline --no-audit, or build on a dev machine and rsync node_modules and code over.

Recipes

Deploy Next.js

Server-rendered Next.js with a custom server.

Deploy Express

REST API behind Passenger.

Need a hand?

Open a ticket

Best for anything that needs an account check or a config change on our end.

Live chat

Faster for quick questions during business hours.