Express Hosting on Node.js 22 with Git Deploy
Deploy an Express 5 app on VeloxaHost: Node.js 22, npm ci and a restart on every Git deploy, a CI webhook for push-to-deploy, and HTTPS on your domain.
An Express app on VeloxaHost runs on a Node.js site: its own container
with Node.js 22, your app as the veloxa-app system service, and the site's
web server in front of it on your domain with a free Let's Encrypt
certificate. Requests are forwarded to your app on port 3000. Each Git
deploy pulls your code, installs dependencies and restarts the app.
Express 5 needs Node.js 18 or newer, so the site's Node.js 22 runs it, and Express 4 apps run too.
Deploy from Git
Prepare the app
Listen on the port in PORT and tell Express it sits behind one proxy on
the same machine:
const express = require("express");
const app = express();
app.set("trust proxy", "loopback");
app.get("/", (req, res) => res.send(`Hello over ${req.protocol}`));
app.listen(process.env.PORT || 3000);
With trust proxy set to loopback, req.protocol reads https from the
X-Forwarded-Proto header and req.ip is the visitor's address, not
127.0.0.1. Express's guide lists loopback as a preset for exactly this
case.
Give package.json a start script, such as "start": "node server.js",
and commit package-lock.json so deploys use npm ci.
Create and deploy the site
In the console, open Websites and click Add Website.
Enter your domain and pick Node.js under Hosting type.
Leave Start Command empty to run
npm start, or enter another command. It runs from/opt/app.Click Create Website. Setup takes a few minutes and serves a placeholder app until your first deploy.
Add the DNS records shown under DNS — point your domain here: an A record for the domain and for
www, and a TXT record that proves the domain is yours. HTTPS is issued once they resolve.In the Deploy from Git card, click Deploy and enter the Repository URL (https), Branch, an optional Subdirectory for a monorepo, and Auto-deploy: Manual / webhook only, Every hour or Every day.
Click Deploy Now. The deploy makes a shallow clone, replaces
/opt/appwith it but keepsnode_modules, runsnpm ciwhen there is a lockfile (otherwisenpm install) and restarts the app. Refresh to see it under Recent deploys.For push-to-deploy, save the CI Webhook URL as a CI secret and call it after your tests:
- name: Deploy to VeloxaHost run: curl -fsS -X POST "$VELOXAHOST_DEPLOY_HOOK" env: VELOXAHOST_DEPLOY_HOOK: ${{ secrets.VELOXAHOST_DEPLOY_HOOK }}One deploy runs per site at a time; a call during a deploy gets a
409.
Environment variables
The console has no environment form yet, and each deploy replaces files in
/opt/app, so a .env there would be lost. Open the console
(Advanced > Open Console) and run systemctl edit veloxa-app, then
add under [Service]:
Environment=NODE_ENV=production
Environment=DATABASE_URL=postgres://...
Then systemctl restart veloxa-app. Express's performance guide recommends
NODE_ENV=production set this way, through the init system. The deploy's
npm ci runs outside the service, so your devDependencies still install.
Supported versions
| Component | Version |
|---|---|
| Node.js | 22, from NodeSource's 22.x repository |
| Express | 5 (needs Node.js 18+) and 4 |
| npm | The one that ships with Node.js 22 |
Node.js 22 is in maintenance LTS until April 2027. It is the only version a Node.js site sets up; for another major, use a VPS.
Which plan fits
A typical Express API or server-rendered site fits Launch ($6.99/month:
1 vCPU, 1 GB RAM, 3 websites). Grow ($12.99/month: 2 vCPU, 4 GB RAM, 10
websites) gives room for heavier apps or several services. Each site can
use up to its plan's RAM and vCPU, with 5 GB of disk per site on Launch and
Grow and 2 GB on Scale and Business, which node_modules counts against.
Yearly billing is ten times the monthly price. See pricing.
Limits and when to use a VPS
- WebSockets and Socket.IO. Upgrades reach your app, but the platform closes a connection that is idle for five minutes, so send a ping or heartbeat more often than that. With one process there is nothing to balance across; real-time apps that need several instances belong on a VPS.
- One app process. Queue workers and schedulers (BullMQ, Agenda) need their own processes and usually Redis; run them on a VPS, or start from the Node.js (Docker) app.
- No database. Node.js sites include none. Use a database on a VPS, such as MongoDB or PostgreSQL.
- No build step. A deploy runs
npm ciand restarts. For TypeScript, add aprestartscript, as the Node.js hosting page shows. - Public repositories only, and the install must finish within five minutes.
Building a React front end with server rendering? See Next.js hosting.
FAQ
Which port should Express listen on?
process.env.PORT, which is 3000. The site's web server forwards your
domain to it and handles HTTPS, so your app speaks plain HTTP.
Why does Express think requests are plain HTTP?
Express does not trust proxy headers by default. Add
app.set("trust proxy", "loopback") and req.secure and req.protocol
follow the X-Forwarded-Proto header the site's web server sends.
Can I run TypeScript directly?
Build it. Add "prestart": "tsc" (or your build) to package.json; npm
runs it before npm start, including after each deploy.
How do I read my app's logs?
Your app's output goes to the service journal. In the console, run
journalctl -u veloxa-app -n 100.
Does it work with Express 4?
Yes. Node.js 22 runs both. Express 5 changed some routing syntax, so read its migration guide before you upgrade.
Express sites run on any managed hosting plan, from Launch at $6.99/month. Framework facts were checked on 2026-10-18 against: expressjs.com/en/starter/installing.html, expressjs.com/en/guide/behind-proxies.html, expressjs.com/en/advanced/best-practice-performance.html, github.com/nodejs/Release, registry.npmjs.org/express/latest.
Ready to deploy?
Start a free trial, or compare plans to match your team's scale.