SvelteKit needs one change before it runs on a container host: swap adapter-auto for adapter-node and add a start script. Then it's a normal git-push deploy.
Last updated
These are the defaults. Override any of them in Settings → Build.
npm install -D @sveltejs/adapter-node npm uninstall @sveltejs/adapter-auto
svelte.config.js:import adapter from '@sveltejs/adapter-node';
export default {
kit: { adapter: adapter() },
};package.json:"scripts": {
"start": "node build"
}adapter-node listens on 0.0.0.0 and reads PORT by default, so no code change is needed for the health check. Never use vite dev as the production start command, since it only binds localhost.
Add variables in the project's settings. They're available both while the app builds and while it runs, so build-time values (like framework-public keys) work without extra setup. See Environment variables.
ORIGIN to your public URL (for example https://<project-slug>.ethiodeploy.com, or your custom domain). Without it, form actions are rejected as cross-site POSTs behind the proxy.$env/static/* values and PUBLIC_ variables are baked in at build time. Set them before deploying. $env/dynamic/* is read at runtime..envfile isn't loaded in production. Use project env vars instead.Add a Postgres addon and DATABASE_URL is injected automatically. Read it from $env/dynamic/privateso it's resolved at runtime and not baked into the build. Run migrations from the Build command in Settings → Build.
<project-slug>.ethiodeploy.com. Every push to the default branch redeploys, and the old version keeps serving until the new one is healthy.Could not detect a supported production environment
Cause: The project still uses adapter-auto.
Fix: Switch to @sveltejs/adapter-node.
Cannot find module … index.js on start
Cause: There's no start script.
Fix: Add "start": "node build".
Cross-site POST form submissions are forbidden (403)
Cause: ORIGIN isn't set, so the request origin doesn't match.
Fix: Set ORIGIN to your public URL.
PUBLIC_ or static env values are empty
Cause: They weren't set when the app was built.
Fix: Add them in Settings and redeploy.
Client IP shows the proxy address
Cause: adapter-node isn't told which forwarded header to trust.
Fix: Set ADDRESS_HEADER (for example X-Forwarded-For) and XFF_DEPTH.
Still stuck? Check the deployment's build log in the dashboard, or see Troubleshooting.
Ready to deploy? Sign in with GitHub and pick your repo. No Dockerfile, no YAML.
See the full docs for custom domains, env vars, addons, and billing.