Deploy an app built with v0

v0 exports a Next.js app (App Router, TypeScript, Tailwind). It runs on Salus as a long-lived Node.js server, built with buildpacks from your repository. It needs two settings: a build flag, and the port Next.js listens on.

This guide was tested on Salus with a Next.js 16 app laid out as v0 exports it, at the root of its repository.

Before you begin

  • A Salus account. Start free.
  • GitHub or GitLab connected to your Salus organization. See Git Management.
  • The v0 project pushed to a GitHub repository, with the app at the root.

Build with webpack

Next.js 16 builds with Turbopack by default, and Turbopack stops at the way Salus buildpacks install node_modules. Build with webpack instead, in package.json:

{
  "scripts": {
    "build": "next build --webpack",
    "start": "next start"
  }
}

The app behaves the same; only the bundler changes. To keep Turbopack, build from a Dockerfile instead, where it works.

Deploy on port 3000

next start listens on port 3000, and Salus doesn’t pass a PORT variable, so set the port to 3000. Ask your coding agent, once it’s connected to Salus:

Deploy this repository to Salus in the Production environment.
It's a Next.js app listening on port 3000. Give me the URL when it's live.

In the console, create the project from the repository as a server-side application and set the port to 3000. See Configure an Environment.

Move the variables, and replace Vercel-only storage

Add every variable the app reads (API keys, NEXT_PUBLIC_ values) to the Salus project. NEXT_PUBLIC_ variables are read when the app builds, so make those build-time variables; the rest are runtime variables, with keys marked as secrets. See Environment Variables.

If the app uses Vercel’s storage, keep or replace it:

  • Postgres: create a database on Salus, link it to the project, and point the app at SALUS_DATABASE_<NAME>_CONNECTION_STRING. The data doesn’t move with the app; copy it with pg_dump.
  • KV and Blob: Salus has no key-value store or file storage today. Keep using the provider’s service with its tokens as runtime secrets, or store the data in PostgreSQL.
  • Vercel Analytics does nothing outside Vercel; remove it or keep it, either works.

Troubleshooting

  • The build fails with “Symlink node_modules could not be resolved”. That’s Turbopack: add --webpack to the build script (step 1).
  • The pipeline passed but the URL returns 502. The port is wrong. next start listens on 3000 unless your start script sets another port; make the release configuration match, and redeploy.
  • A NEXT_PUBLIC_ value is missing in the browser. It was added as a runtime variable. Add it as a build-time variable and redeploy.
  • The app keeps restarting. Check its logs. New deployments start with 128 MB, which was enough for a small app in testing; raise the memory if the logs show it running out.