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 withpg_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
--webpackto the build script (step 1). - The pipeline passed but the URL returns 502. The port is wrong.
next startlistens 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.