> ## Documentation Index
> Fetch the complete documentation index at: https://help.noxity.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Virtual Containers

> Run a Node.js, Python, or Ruby app inside your cPanel account, isolated by CloudLinux LVE and served by Phusion Passenger.

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

<CardGroup cols={3}>
  <Card title="Node.js" icon="node" href="/web-hosting/virtual-containers/nodejs">
    Node 18, 20, 22 LTS. NPM Install, Run JS Script, Application Mode toggle.
  </Card>

  <Card title="Python" icon="python" href="/web-hosting/virtual-containers/python">
    alt-python 3.7 to 3.11. Virtualenv, WSGI entry point, Pip Install.
  </Card>

  <Card title="Ruby" icon="gem" href="/web-hosting/virtual-containers/ruby">
    mod\_passenger, Bundler, Rails-friendly. One Ruby version per server.
  </Card>
</CardGroup>

## 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.

<Warning>
  **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.
</Warning>

## 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

| Limit                   | Typical value | Hits you when                                  |
| ----------------------- | ------------- | ---------------------------------------------- |
| Memory (PMEM)           | \~1 GB        | Large `npm install` trees, `pandas` or `numpy` |
| Entry processes (EP)    | 20 to 30      | High concurrent connection counts              |
| Total processes (NPROC) | \~100         | Worker-heavy apps (Sidekiq, Celery)            |
| Passenger startup       | 60 s default  | Cold-boot Django or Rails on the first request |

Exact values depend on your plan tier. See the [cPanel overview](/web-hosting/overview) for the plan matrix. {/* TODO: confirm exact PMEM/EP/NPROC values per plan once published */}

## Common deployment recipes

Step-by-step guides in the Knowledge Base:

<CardGroup cols={2}>
  <Card title="Deploy Next.js" icon="react" href="/how-to/virtual-containers/nodejs/nextjs">Server-rendered Next.js on the Node.js Selector.</Card>
  <Card title="Deploy Express" icon="diagram-project" href="/how-to/virtual-containers/nodejs/express">REST API on Express with Passenger.</Card>
  <Card title="Deploy Django" icon="layer-group" href="/how-to/virtual-containers/python/django">Django app, virtualenv, static files.</Card>
  <Card title="Deploy Flask" icon="flask" href="/how-to/virtual-containers/python/flask">Lean Flask service via `passenger_wsgi.py`.</Card>
  <Card title="Deploy Rails" icon="train" href="/how-to/virtual-containers/ruby/rails">Rails app, Bundler, asset precompilation.</Card>
</CardGroup>

## Need a hand?

<CardGroup cols={2}>
  <Card title="Open a ticket" icon="life-ring" href="https://members.noxity.io/submitticket.php">
    Best for anything that needs an account check or a config change on our end.
  </Card>

  <Card title="Live chat" icon="messages" href="https://noxity.io/contact">
    Faster for quick questions during business hours.
  </Card>
</CardGroup>

<div className="mt-8">
  <Accordion title="Sources" icon="book-bookmark">
    * [CloudLinux LVE Manager ↗](https://docs.cloudlinux.com/cloudlinuxos/lve_manager/)
    * [CloudLinux command-line tools ↗](https://docs.cloudlinux.com/cloudlinuxos/command-line_tools/)
    * [cPanel Application Manager ↗](https://docs.cpanel.net/cpanel/software/application-manager/)
    * [Phusion Passenger walkthroughs ↗](https://www.phusionpassenger.com/library/walkthroughs/start/)
  </Accordion>
</div>
