Molixa Forge

Solutions / Node.js

Node.js Hosting Panel for VPS

Deploy Node.js apps to any Linux VPS with nvm managed versions, PM2 cluster mode sized to your vCPUs, an Nginx reverse proxy wired for HTTP and WebSockets, and zero downtime reloads on every push. Works for Next.js, Nest, Remix, Nuxt, Express, Fastify, Hono, and plain Node scripts.

Molixa Forge installs nvm per user, pins the Node version per site, drops in a PM2 ecosystem file, and terminates SSL at the edge. You push to main, we do the rest. Free tier covers one server and one site end to end. Pair it with our Git push deployments and you have a complete pipeline from commit to live in under a minute.

nvm, not apt

Node 18, 20, and 22 coexist on the same box. Pin per site from a dropdown. No server rebuild, no version conflicts.

PM2 cluster by default

instances: max gives you one worker per vCPU with round robin load balancing. Memory aware auto restart built in.

Zero downtime reloads

pm2 reload brings workers down one at a time. New code picks up new requests, in flight requests finish on the old code.

Version management

Node versions with nvm, pinned per site

One server can run Node 18 for your old API, Node 20 for your staging app, and Node 22 for a new service. Switching a site to a different version is a dropdown change that takes effect on the next deploy.

  • nvm installs per user so no app can change the global Node version and break a neighbour.
  • A .nvmrc file in your repo is respected automatically. No matching file? Pick a version in the panel.
  • Every active LTS line is available the day it ships. Node 18, 20, and 22 are ready today.
  • Weekly security builds pull in patch releases. Your pinned version stays current without a server rebuild.
  • Want Bun on the same host? Flip the Bun runtime toggle on a site and we install it without touching your Node setup.

Process management

PM2 cluster mode, sized to your vCPUs

Your ecosystem.config.js is generated with exec_mode set to cluster and instances set to max. PM2 forks one worker per vCPU and round robin balances traffic across them. Crashes restart the worker, not the whole app.

One worker per vCPU

Single core VPS runs one worker. An 8 core box runs eight workers sharing load. Scale the count from the panel without a restart.

Memory aware restart

Set max memory per site. PM2 restarts any worker that drifts past it before the OOM killer can touch your box. Event logged to the timeline every time.

Graceful reload on deploy

pm2 reload drains one worker at a time. No dropped requests, no 502s, no please reload flash for your users.

Log rotation built in

pm2 logrotate writes daily log files, keeps the last 14, gzips older ones. The dashboard tails the current file live in your browser.

Crash recovery

PM2 restarts a worker after a crash, backs off on repeated failures, and pings your alert channel if a worker refuses to come up.

Monorepo friendly

pnpm and Yarn workspaces work out of the box. Point us at the start command (pnpm --filter web start) and we drive it through PM2 the same way.

Reverse proxy

Nginx reverse proxy with WebSocket support

Your Node app binds to a local port. Nginx fronts it, handles TLS with a free Let's Encrypt cert, gzips responses, and passes the right headers for WebSockets. You never edit the vhost file by hand.

Socket.io with sticky sessions, raw ws, long polling fallback, and server sent events all work with the default config. If you run a mix of HTTP routes and a WebSocket endpoint on the same port, Nginx sends them to the same upstream and your Node server does the rest.

  • Upgrade and Connection headers preset for ws and wss.
  • proxy_read_timeout raised so long lived sockets do not drop at 60 seconds.
  • HTTP/2 and HTTP/3 for fast first byte on TLS. Brotli gzip for text responses.
  • client_max_body_size tuned for file uploads. Override per site without leaving the panel.
  • Free SSL from Let's Encrypt with auto renewal 30 days before expiry.

Environment

Encrypted env vars and secret injection

Edit env values in the dashboard, encrypted at rest with AES 256. At deploy time we write the site's .env file into the release directory before starting the process. No plaintext secrets in git, no Vault to run.

Encrypted at rest

Values are stored encrypted in the control plane and only decrypted on the target server during a deploy. Keys are scoped to the site.

Hot reload on change

pm2 reload with update env picks up new values without a full restart. Rotate a secret and the next deploy applies it across every worker.

Redis session store

One click install of Redis on the server. Bind to localhost, get an auth key, paste the URL into express session or iron session. Sessions share across workers.

Deploy flow

Zero downtime reloads on every push

Push to main, the webhook fires, we pull the branch into a time stamped release directory, install dependencies, build, then swap the current symlink and reload PM2. In flight requests finish on the old code. New ones hit the new code.

01  Pull and install

We detect your package manager from the lockfile. pnpm lock gets pnpm install frozen lockfile, yarn gets yarn install, npm gets npm ci. Build logs stream to the dashboard.

02  Symlink swap

Shared storage and .env are symlinked into the new release. The current symlink flips atomically to the new directory. Five releases are kept for one click rollback.

03  pm2 reload update env

Workers reload one at a time, picking up new env values. Your health endpoint is checked before a worker takes traffic. Old workers drain, then exit.

TypeScript

TypeScript builds, no extra config

Point us at your start command. If it runs tsc or tsx in the build step, we pick it up. dist/main.js for Nest, .next for Next.js, build for Remix, .output for Nuxt are all auto detected from framework fingerprints in package.json.

Source maps ship to the release directory so crash stack traces line up with your TypeScript sources. Type check failures fail the deploy loudly. No silent fallback to broken code in prod.

Bun runtime

Bun support on a per site toggle

Flip the Bun runtime switch on any site. We install Bun for that user, pin the version, and run bun run start instead of node. Hono, Elysia, and Bun.serve all work. PM2 still drives the process so you keep cluster mode and log rotation.

bun.lockb is detected automatically so installs use Bun's fast resolver. Mix and match on the same server: one site on Node 22, another on Bun 1.1, both behind the same Nginx.

Every platform feature

See the full list of what the panel ships today, from SSL to backups to team roles.

Browse features

Git push deployments

How the webhook, build, and symlink swap actually work end to end for any stack.

Deployment details

RunCloud alternative

Side by side look at pricing, Node.js support, and the AI assistant that RunCloud does not ship.

Read the comparison

Ready to price it out? Free covers one server and one Node.js site end to end. Pro at $12 per month unlocks unlimited sites, unlimited team seats, and the AI assistant. See the full plan breakdown on the pricing page.

FAQ

Node.js hosting questions

Should I run Node.js with PM2 or systemd on my VPS?

PM2 is the better pick for most Node apps on a VPS hosting panel like Molixa Forge. It forks workers across every vCPU, restarts on crashes, reloads with zero downtime, and writes rotating logs that the dashboard tails in real time. Systemd works, but you lose cluster mode and have to wire up log rotation and memory limits yourself.

How do I set a memory limit per Node.js app so it does not kill the VPS?

In the site settings you pick a max memory in megabytes. PM2 watches RSS per worker, and when a worker drifts past that number it restarts. In cluster mode the replacement warms up before traffic hits it, so requests never drop. You see every restart in the Molixa timeline with the memory number attached.

Can I scale a Node.js cluster up and down without restarting the app?

Yes. Change the instance count in the panel and PM2 scales workers one at a time. New workers come up, get health checked, and start taking traffic before old ones drain. The whole change takes a few seconds and clients never see an error. Go from 2 workers to 8 on an 8 vCPU box with one click.

Does the Nginx reverse proxy handle socket.io and plain WebSockets?

Yes. Every Node.js site gets an Nginx vhost with Upgrade and Connection headers set for WebSockets out of the box. Socket.io with sticky sessions works, raw ws works, and long polling fallback works. You do not edit the Nginx config by hand. Toggle the websocket flag on the site and we write the right proxy block.

Do you support Bun as a runtime alternative to Node.js?

Yes. Flip the Bun runtime toggle on a site and we install Bun for that user, pin the version, and run your app with bun run start instead of node. Hono, Elysia, and plain Bun.serve all work. The same PM2 process file drives it, so you still get cluster mode, log rotation, and zero downtime reloads.

How often do you update the Node.js LTS versions available in nvm?

We ship a new Node LTS line within a week of its official release, and we keep every active LTS available in the per site dropdown. Node 18, 20, and 22 are all installable today. Security patches for each line are pulled in on a weekly build, so the version you pick stays current without a server rebuild.

Run Node on your VPS the easy way

One push to main, cluster workers up, Nginx fronting it, SSL live. Free tier covers one server and one site.

Node.js Hosting Panel for VPS | Molixa Forge · Molixa Forge