node_modules directory, 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.
Available versions
Available versions vary by host. Typical rotation:- Node 22. Current LTS.
- Node 20. Older LTS, still maintained.
- Node 18. EOL upstream, kept for legacy apps.
Set up an app
Click Create Application
On an empty account, you land on a list page with a + Create Application button.
Fill in the form
- Node.js version: pick from the dropdown.
- Application mode: Production or Development. Development sets
NODE_ENV=developmentand prints fuller errors. - Application root: directory under your home, e.g.
myapp. Created if it doesn’t exist. - Application URL: domain dropdown plus optional path. Use
/for the root or/apifor a sub-path. - Application startup file: defaults to
app.js. Set this to whatever file exports your handler. - Passenger log file: optional. Useful for catching boot errors.
Manage an app
The management page opens after creation and is reachable from the app list.| Button | What it does |
|---|---|
| Run NPM Install | Reads package.json and installs dependencies into the per-app node_modules. |
| Run JS Script | Runs a package.json script (e.g. build, prestart) under the activated Node env. |
| Stop App | Halts Passenger for this app. The URL returns 503. |
| Restart | Equivalent to touch tmp/restart.txt. Reloads the running app. |
| Edit | Reopens the form. Saving overwrites the .htaccess. |
| Destroy | Removes Passenger registration and the per-app node_modules directory. |
The Passenger contract
Passenger runs your code. Your code does not start an HTTP server.app.js
app.js
app.listen(). If you copied a tutorial that does, delete that line.
Reference: where things live
| What | Path |
|---|---|
| Activated env script | ~/nodevenv/<app-root>/<version>/bin/activate |
| Installed node_modules | ~/<app-root>/node_modules/ |
| Restart trigger | ~/<app-root>/tmp/restart.txt |
| Passenger config | ~/<app-root>/.htaccess (Selector-managed) |
| Boot log (if configured) | path you set in Passenger log file |
npm install. From SSH:
Common issues
App returns 503 on every request
App returns 503 on every request
Most often:
app.listen(PORT) is in the startup file. Remove it, swap to module.exports = app, then touch tmp/restart.txt to reload.Cannot find module 'X' after deploying
Cannot find module 'X' after deploying
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.Boot times out after 60 seconds
Boot times out after 60 seconds
Default Passenger startup timeout. Add to Common cause: the app loads a large dataset on boot, or a synchronous DNS lookup blocks startup.
.htaccess above the Selector-managed block:WebSockets close after a few seconds
WebSockets close after a few seconds
Passenger forwards
Upgrade: headers, but the LVE entry-process cap throttles long-lived connections. Plan around 20 to 30 simultaneous WS clients on a shared plan, or move to a Power plan.`npm install` runs out of memory
`npm install` runs out of memory
PMEM is ~1 GB. Large dependency trees (Next.js, Strapi) can OOM during install. Run 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.



