Skip to main content
A Virtual Container hosts one Node.js, Python, or Ruby app inside your cPanel account. Each app runs in a sandboxed virtualenv, sits inside your account’s CloudLinux LVE limits, and is served by Phusion Passenger. Three runtimes, same UI shape. Pick a version, set the application root, hit Restart.

Pick your runtime

Node.js

Node 18, 20, 22 LTS. NPM Install, Run JS Script, Application Mode toggle.

Python

alt-python 3.7 to 3.11. Virtualenv, WSGI entry point, Pip Install.

Ruby

mod_passenger, Bundler, Rails-friendly. One Ruby version per server.

How the container is built

Two CloudLinux primitives handle the isolation. LVE caps CPU, memory, I/O, IOPS, entry processes, and process count for your cPanel user, using Linux cgroups under the hood. CageFS gives every user their own filesystem view of /usr, /etc, and /proc, so other users on the server are invisible. The app itself is not a separate container. It’s a process tree inside your existing user sandbox, started and supervised by Phusion Passenger. Apache talks to Passenger over a Unix socket, Passenger forks your runtime, and the runtime handles each request.
Don’t bind to a port in your code. Passenger drives the runtime. A Node app calling app.listen(3000), or a Python WSGI app starting its own server, refuses to boot or returns 503.Export a handler instead. The runtime page for each language shows the exact shape.

What every container ships with

  • Per-app sandbox under ~/nodevenv/<app>/<ver>/, ~/virtualenv/<app>/<ver>/, or a per-app gem path for Ruby.
  • Run [Package Manager] Install button. Triggers npm install, pip install -r requirements.txt, or bundle install inside the activated env.
  • Environment variables editor for secrets and runtime config.
  • Application Mode (Node, Python) flips NODE_ENV between Production and Development.
  • Restart button. Same effect as touch tmp/restart.txt from SSH.
The Selector writes the .htaccess for you (PassengerAppRoot, PassengerAppType, PassengerStartupFile, runtime path). Don’t hand-edit those lines. The cPanel form is the source of truth and overwrites them on every save.

Limits to plan around

LimitTypical valueHits you when
Memory (PMEM)~1 GBLarge npm install trees, pandas or numpy
Entry processes (EP)20 to 30High concurrent connection counts
Total processes (NPROC)~100Worker-heavy apps (Sidekiq, Celery)
Passenger startup60 s defaultCold-boot Django or Rails on the first request
Exact values depend on your plan tier. See the cPanel overview for the plan matrix.

Common deployment recipes

Step-by-step guides in the Knowledge Base:

Deploy Next.js

Server-rendered Next.js on the Node.js Selector.

Deploy Express

REST API on Express with Passenger.

Deploy Django

Django app, virtualenv, static files.

Deploy Flask

Lean Flask service via passenger_wsgi.py.

Deploy Rails

Rails app, Bundler, asset precompilation.

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.