# Deploy SolidStart to your own VPS with Node.js Deploy a SolidStart app to your own VPS: ox reads the Node version from package.json, runs the build, starts it under systemd and adds HTTPS with Caddy. To deploy SolidStart to a VPS with ox, add the repo as a project and deploy it, with no Dockerfile and no ox.toml. ox reads `package.json`, runs `npm install --include=dev` and `npm run build`, then starts `npm run start` under systemd behind Caddy with HTTPS. Run `ox check` in your repo to see the same plan before the first deploy. **Tested on a real server.** A SolidStart app deployed and served on a real Ubuntu server in ox's test lab, and the plan below is what `ox check` prints for a minimal one. ox reads `package.json`, builds the plan on the card, and starts `npm run start` on your server. ## What ox detects in a SolidStart repo This is the plan `ox check` prints for a minimal a SolidStart app, with no ox.toml. Each row says where its value came from: a file in the repo, or ox's default. | Field | Value | Source | | --- | --- | --- | | `app.start` | `npm run start` | `detected:package.json` | | `build.install` | `npm install --include=dev` | `detected:package.json` | | `build.commands[0]` | `npm run build` | `detected:package.json` | | `tools.node` | `24` | `default` | ## The ox.toml for SolidStart None is needed: the plan above comes from the repo alone. Write one to serve your own domain or to change what ox detected. This one passes `ox check` against the same repo: `[app]` keeps the detected start command and build. ox.toml, optional: ```toml domains = ["www.example.com"] [app] ``` ## Check and deploy SolidStart Add the repo as a project, then check and ship it from a terminal: Check, deploy and read the logs: ```sh ox check # in the repo: the plan above, offline ox new --server # add the repo as a project ox deploy --wait # stream the deploy, exit with its result ox logs --follow # the app's own logs ``` ## Variables to set for SolidStart None before the first deploy: `ox check` asks for no variable. Add your own on the dashboard's Variables tab or with `ox vars set KEY`. ox provides these to the app itself: `PORT`, `HOST`, `OX_ENV`, `OX_PROJECT`, `OX_RELEASE`, `OX_DATA_DIR`, `PUBLIC_URL`, `PUBLIC_HOST`, `PUBLIC_SCHEME` and `PUBLIC_PORT`. ## If the SolidStart deploy fails - `build 1/1: npm run build: exit status 1`: Your build failed. The lines above it are the build's own output; run the same command on your computer, fix it, and push. [More](https://console.t63.sorv.dev/docs/troubleshooting#build-failed). - `the app on http://127.0.0.1:8001/ did not answer within 120s: Get "http://127.0.0.1:8001/": dial tcp 127.0.0.1:8001: connect: connection refused`: The app started but never answered on the port ox gave it. Listen on `127.0.0.1` at `$PORT`; the lines above the message are the app's own output. [More](https://console.t63.sorv.dev/docs/troubleshooting#health-check-failed). - `web of shop on main keeps crashing: it restarted 5 times in the last 10 minutes. The Logs tab shows why.`: The release went live and then kept dying. Read the Logs tab for the error and deploy a fix, or roll back. [More](https://console.t63.sorv.dev/docs/troubleshooting#crash-loop). Visitors never see a failed deploy: the old release serves until the new one is healthy. ## Next steps - [The Node.js guide](https://console.t63.sorv.dev/docs/guides/node): start scripts, migrations, PostgreSQL and Redis. - [The `[app]` keys](https://console.t63.sorv.dev/docs/config#app): start, health check, memory and the rest. - [Add a custom domain](https://console.t63.sorv.dev/docs/operate/domains); Caddy gets its certificate. - [Read the logs](https://console.t63.sorv.dev/docs/operate/logs) live, search them, or download them. - [Set variables and secrets](https://console.t63.sorv.dev/docs/operate/variables) on the dashboard or with `ox vars`. ## SolidStart FAQ ### Do I need a Dockerfile or an ox.toml to deploy SolidStart to a VPS? No. ox does not use Docker, and `ox check` on a SolidStart repo with no ox.toml prints `Ready to deploy.` Write an ox.toml only to change what ox detected. ### What does ox install on the server for SolidStart? Only what the plan names: `node 24` (ox's default). Your app's own dependencies are installed by the build into the release folder, not system-wide. ### Why does ox use Node.js 22 here? Because this repo's `package.json` asks for it in `engines`, and the version your repo pins wins over ox's default of Node.js 24. ## Related guides - [**Qwik City** Deploy a Qwik City app with its Express adapter to your own VPS: ox finds the adapter, builds it, runs npm run serve under systemd, and Caddy serves HTTPS.](https://console.t63.sorv.dev/docs/guides/qwik) - [**NestJS** Deploy a NestJS API to your own VPS: ox installs from package-lock.json, runs nest build and start:prod under systemd, and sets up PostgreSQL for the app.](https://console.t63.sorv.dev/docs/guides/nestjs) The [Stacks page](https://console.t63.sorv.dev/docs/guides) lists every stack, and the ones ox does not deploy yet. Last updated 2026-10-09. The page as HTML: https://console.t63.sorv.dev/docs/guides/solidstart