Language Frankfurt, Germany
Connect a repository with a package.json and Nodion builds it with its Node.js buildpack: it installs your dependencies from the lockfile, runs your build script and starts the server with your start script. Express, Fastify, Hono and other Node.js servers work this way, and so do Bun projects. The app runs in Frankfurt, next to a managed PostgreSQL database if you need one.
package.json without a static frontend frameworkstart script, else node server.js, index.js or app.jsPORT for the web process and sends traffic there. Read it and bind to 0.0.0.0. Fastify listens on localhost by default, so pass host: '0.0.0.0' to listen. server.js const express = require("express");
const app = express();
app.get("/", (req, res) => res.send("ok"));
const port = process.env.PORT || 3000;
app.listen(port, "0.0.0.0"); package-lock.json, yarn.lock, pnpm-lock.yaml or bun.lock; the build fails without one. Nodion runs the start script directly, so npm hooks such as prestart do not run. Without a start script, known frameworks such as Nuxt get their own default; everything else starts with node server.js, index.js or app.js, and finally node .. Dev dependencies are removed after the build, so tools you need at runtime, such as tsx or a migration CLI, belong in dependencies. package.json "scripts": {
"start": "node server.js"
} build script and none of server.js, app.js, index.js, src/server.js, src/index.js or src/app.js exists, Nodion treats the repository as a static site and does not start your server. A TypeScript server that tsc compiles into dist/ looks exactly like that. Add an index.js next to package.json that loads the compiled server (the snippet needs "type": "module"; in CommonJS write require("./dist/server.js")), and point the start script at the compiled file, for example node dist/server.js, not at a dev tool. index.js import "./dist/server.js"; DATABASE_URL. A release: line in a Procfile runs once per build, after the build and before the new version starts; if it fails, the running version stays live. Procfile release: npm run migrate / answers with a 2xx or 3xx status. If your API answers 404 on /, add a route such as /health and set it as the health check path in the app settings. vite in dependencies or devDependencies, Nodion builds the repository as a static site and ships only the build output, even if a server.js exists. The same goes for Angular, Gatsby, Create React App and Eleventy. For a Node.js server that also builds a Vite frontend, use a Dockerfile.bun.lock, Nodion installs your dependencies and runs the build with Bun. The app still starts through the start script, so the script has to call Bun, for example "start": "bun run index.ts"; without one, Nodion starts the app with node. The entry file rule above applies to Bun projects too.web: node server.js and worker: node worker.js in a Procfile; without a web: line, the first Procfile entry other than release: becomes the default command. Then add a process named worker without a port on the Processes tab. Valkey in the same region gives your queue a REDIS_URL.DATABASE_URL, REDIS_URL or CLICKHOUSE_URL. release: line runs with every new build. Dockerfile apps, and redeploys or rollbacks to an earlier image, use a release command set on the app itself, which also takes precedence over the Procfile line. On static sites a release step runs in an image that holds only the built files. Nodion found a build script but none of the entry files server.js, app.js or index.js (also checked under src/), or a static frontend framework such as Vite in package.json. Add an index.js next to package.json that loads your compiled server; with Vite in the same package.json, use a Dockerfile.
Node.js 24, unless you choose one. Nodion reads .node-version, .nvmrc and engines.node, in that order. A range resolves to the newest matching release, so "node": ">=20" gets Node.js 26; write 24 into .nvmrc to stay on 24.
Yes. Nodion picks the package manager from the lockfile (pnpm-lock.yaml, yarn.lock, bun.lock or package-lock.json) and installs exactly the versions it lists. Bun projects also need a start script that calls bun.
In the EU Central region in Frankfurt, Germany. Build, registry, the app and its databases, volumes, buckets, logs and metrics stay in that region, and Nodion's API and control plane are hosted in Germany. Nodion GmbH is based in Stuttgart.
Nodion provides the basis for it: Nodion GmbH is based in Stuttgart, Germany, in the Frankfurt region the app, its databases and volumes run in Germany, and you conclude the data processing agreement (DPA) under Art. 28 GDPR electronically in the dashboard. Whether your setup complies also depends on how you configure and use the app.
An app instance starts at 1 EUR per month. The setup in the cost box costs 3.50 EUR per month: App 2 EUR, PostgreSQL 1.50 EUR. Prices are net and billed per second, and you pick bigger sizes or more instances whenever you need them.
Yes. Every app gets a default hostname with HTTPS. Add your own domain on the app's Domains tab; the TLS certificate is issued and renewed automatically.
Earn up to 15 € in credit when signing up.
or with email
Product news, no spam. Unsubscribe anytime.
Successfully subscribed.