DocsNuxt

Nuxt

Deploy a Nuxt 3 app on Ruust: built with Nitro, server-side rendered, and served on HTTPS from an always-on Egg.

Ruust detects a Nuxt app from the nuxt dependency in your package.json. It runs nuxt build, which uses Nitro to emit a self-contained Node server under .output, and starts it with node .output/server/index.mjs. Server-side rendering works out of the box, because your Egg is a real long-running server rather than a set of functions.

Deploy it

  1. Push your app to a Git repo.
  2. In the dashboard, choose New Egg and connect the repo.
  3. Pick a size and a region, then lay the Egg. Ruust builds and hatches it on HTTPS.

The port

Nitro reads two environment variables at start-up: PORT and HOST. Ruust sets PORT, but Nitro defaults HOST to localhost, so you must set HOST=0.0.0.0 on the Egg. Binding to localhost is the top reason an Egg builds but never hatches, because Ruust cannot reach a server that only listens on the loopback interface.

text
HOST=0.0.0.0
Set HOST on the Egg so Nitro binds to all interfaces. PORT is provided by Ruust.

Start command

On the Nixpacks path, the Nixpacks build runs node .output/server/index.mjs by default after nuxt build (this is the Nixpacks preset, not a Ruust-side command). To pin it yourself, add a Procfile at the repo root with a web: line.

text
web: node .output/server/index.mjs
A Procfile at the repo root pins the start command. The `web:` line is honoured by the Nixpacks buildpack, which bakes it into the image at build time, not by Ruust itself, and is ignored when you supply your own `Dockerfile`.

Environment variables

Set server-side variables (database URLs, API keys) on the Egg; they are available at build and run time, encrypted at rest, and never printed in logs. Changing a run-time env var takes effect automatically: Ruust bumps an env hash in desired state and rolls the container on the next reconcile, so no manual redeploy is needed. Anything the browser needs must be prefixed NUXT_PUBLIC_ so Nuxt exposes it through the runtime config, and it is baked in at build time. A build-baked NUXT_PUBLIC_ var needs a fresh build to change (a new commit or deploy that actually rebuilds the image), which a plain redeploy does not do because a redeploy reuses the existing image.

Custom domains

Every Egg gets a ruust.run URL immediately, in the form <name>.<region>.ruust.run. To serve your own domain, add it under the Egg and point the DNS record we show you; Ruust issues and renews TLS automatically. See Custom domains.