Framework Frankfurt, Germany

Deploy Astro on Nodion

Nodion recognizes Astro by astro in package.json and runs your build with its Node.js buildpack. By default it serves dist/ as a static site; when your config sets output: 'server', it starts the Node.js server with node ./dist/server/entry.mjs instead. Either way, your site runs in Frankfurt.

Deploy to Nodion ›

from 1 EUR / month

Up to 15 € credit when signing up

Detected by
astro in package.json
Start
static files from dist/, or node ./dist/server/entry.mjs
Node.js
22, 24 (default), 26
Region
EU Central (Frankfurt)

Deploy Astro step by step

  1. Commit the lockfile and build Commit your lockfile; the build fails without one. Nodion runs your build script and serves dist/ with a static web server. No Node.js server runs, so a static Astro site needs no adapter. package.json
    "scripts": {
      "dev": "astro dev",
      "build": "astro build"
    }
  2. Mark build variables A static build reads all its variables during astro build, so tick Build for them on the Environment tab. In server mode, the same goes for PUBLIC_* variables, which end up in the browser code.
  3. For SSR: add the Node adapter Run npx astro add node or install @astrojs/node yourself, use it in standalone mode and set output: 'server' (or 'hybrid' on Astro 4). Nodion only starts a server when astro.config.mjs, .js or .ts contains that setting; it does not read astro.config.mts. Keep astro and @astrojs/node in dependencies, because dev dependencies are removed after the build. astro.config.mjs
    import { defineConfig } from "astro/config";
    import node from "@astrojs/node";
    
    export default defineConfig({
      output: "server",
      adapter: node({ mode: "standalone" }),
    });
  4. Let the server listen on all interfaces The standalone server reads PORT, which Nodion sets, and HOST. Set HOST to 0.0.0.0 on the Environment tab so that the server accepts connections from outside the instance, including the health check. Nodion starts node ./dist/server/entry.mjs unless package.json has a start script; if yours runs astro dev, remove it.
  5. Create the app and push In the dashboard, create an application from your GitHub, GitLab, Bitbucket or Gitea repository in the region EU Central. Every push builds a new release, and traffic moves to it once / answers with a 2xx or 3xx status.

Good to know

  • On-demand pages need output: 'server'Nodion decides by the output setting, not by the adapter. A project that keeps the default static output and renders single pages on demand with export const prerender = false is not run as a server. Set output: 'server' instead, and mark the pages that should stay static with export const prerender = true.
  • Your 404 pageFor paths that do not exist, the static server answers with your index.html. To show the page Astro builds from src/pages/404.astro instead, add a static.toml with fallback = "404.html". Only do this for static output: a static.toml always makes Nodion serve the project as static files.

What Nodion runs for you

  • Deploys without downtime Push to your branch and Nodion builds a new release. Traffic switches once the new instances answer their health check; a failed release leaves the running one in place. Apps with a local volume restart instead, because the disk belongs to one instance.
  • Databases next to the app Managed PostgreSQL, pgvector, MySQL, Valkey and ClickHouse in the same region. Attached databases arrive as DATABASE_URL, REDIS_URL or CLICKHOUSE_URL.
  • Previews per pull request Turn on previews and pull requests from your repository get their own app with its own URL and fresh, empty databases, created automatically or by hand. Forks and bot pull requests are skipped.
  • Workers, cron jobs and scaling Run workers as extra processes of the same app, schedule jobs on the Cron tab, and scale every process to up to 16 instances.
  • Release step With buildpacks, a Procfile 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.
  • Logs and metrics Build, release and runtime logs plus CPU, memory, disk and network metrics for every instance in the dashboard.
  • Domains and HTTPS A default hostname with HTTPS from the first deploy; your own domains get certificates automatically.

Further reading

Astro on Nodion: questions and answers

Does Nodion run Astro as a static site or as a server?

As a static site by default, served from dist/. With output: 'server' in astro.config.mjs, .js or .ts, Nodion runs the Node.js server that @astrojs/node builds.

Which adapter do I need for Astro SSR on Nodion?

@astrojs/node with mode: 'standalone'. It builds a server that Nodion starts with node ./dist/server/entry.mjs; set HOST to 0.0.0.0 so it accepts outside connections.

Why is my Astro SSR app served as static files?

Nodion only looks for output: 'server' (or 'hybrid') written in astro.config.mjs, astro.config.js or astro.config.ts. A config in astro.config.mts, an output value read from a variable, or a static.toml in the project keeps it static.

Where does my Astro app run?

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.

Can I use Astro in line with the GDPR?

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.

How much does it cost to run Astro on Nodion?

An app instance starts at 1 EUR per month. The setup in the cost box costs 2 EUR per month: App 2 EUR. Prices are net and billed per second, and you pick bigger sizes or more instances whenever you need them.

Can I use my own domain for my Astro app?

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.

Give your agent a cloud.

Earn up to 15 € in credit when signing up.

Continue with GitHub

or with email

Stay in the loop.

Product news, no spam. Unsubscribe anytime.