A Node application serving its own HTTP — Next.js, Nuxt, Express or anything else that listens on a port
A Node application serving its own HTTP — Next.js, Nuxt, Express or anything else that listens on a port. Replaces PHP-FPM and nginx rather than joining them: it is the web server as well as the application. In front of it is the platform's proxy, which terminates TLS, routes the hostname and compresses responses; behind it, whatever the project chose.
The container runs as vallic with the release at /var/www/html/current (WEB_ROOT), read-only, and the release's own node_modules/.bin on PATH. The release keeps node_modules: for a Node application they are the runtime, not a build input, so the build's last step prunes what production does not need.
vallic.yaml at the root of the repository:
version: 1
type: nodejs
runtime:
node: '24'
build:
steps:
- name: Dependencies
run: npm ci
- name: Build
run: npm run build
- name: Production dependencies only
run: npm prune --omit=dev
cache:
- node_modules
- .next/cache
start: npm start
port: 3000
health:
path: /
timeout: 30
npm start is next start, which serves the .next directory the build produced and listens on PORT. Both start and port are the defaults, so they can be left out; they are written here so the file says what runs. Next.js binds HOSTNAME, which the platform sets to 0.0.0.0, and NODE_ENV is production.
Uploads and anything else written at runtime go under /mnt/files (VALLIC_PUBLIC_DIR, VALLIC_PRIVATE_DIR), which outlive the release; the release itself is read-only. Environment variables — a database URL, an API key — are set on the environment in the console and reach the process as ordinary environment variables, not as an .env file in the checkout.
| Version | Status |
|---|---|
26.10 |
Supported, and the default |
24.21 |
Supported |
22.23 |
Supported |
26.8 |
Deprecated — still runs, but move to something newer |
24.20 |
Deprecated — still runs, but move to something newer |
A deprecated version still runs and is still what some sites are on. It is listed so you can move before it goes, rather than finding out on the morning a build stops resolving it.
Pin the version, not the build: name 26.10 and the platform matches it to the
current build, so a security rebuild reaches you without anybody editing a
repository.
In vallic.yaml — what each one does is on Service settings:
services:
- nodejs:
version: '26.10'
environment:
NODE_OPTIONS: …
Anything not on this list refuses the deploy, naming the variable — rather than being accepted and quietly ignored.