Blog

June 18, 2026

How to self-host n8n with Spunto

Run your own n8n instance as a Spunto deployment, with persistent workflows, a custom domain, and zero exposed ports.

n8n is a great fit for Spunto's Ship side: it's a single long-running web service, it needs its data to persist across restarts, and you'll usually want it reachable at your own domain. This guide walks through deploying it as a custom service in a Spunto deployment.

If you haven't connected a server yet, see Adding a Node first — deployments need at least one online node to run on.

In the dashboard, go to [Your Org]DeploymentsNew deployment. Give it a name, e.g. automation. This creates the deployment shell — services are added next.

Spunto dashboard Deployments page showing the automation deployment, Running
The automation deployment, once n8n is up

From the deployment page, click Add serviceCustom imageConfigure custom service, and fill in:

FieldValue
Namen8n
Imagen8nio/n8n:latest
Expose HTTPenabled, port 5678
Volumename data, target /home/node/.n8n — keeps workflows, credentials, and execution history across deploys
Configure service form filled in with n8n's image, exposed port 5678, and a data volume mounted at /home/node/.n8n
The custom service form — name, image, exposed port, and the persistent data volume

n8n has its own login screen, so leave the service's auth mode as public — Spunto's private/allow-list mode is for internal tools that have no auth of their own.

N8N_HOST=n8n.example.com
N8N_PROTOCOL=https
N8N_PORT=5678
WEBHOOK_URL=https://n8n.example.com/
GENERIC_TIMEZONE=Europe/Paris

Set N8N_HOST and WEBHOOK_URL to whatever domain you'll verify in step 4 — n8n uses them to generate correct webhook URLs for your workflows.

Click Deploy. The first deploy pulls n8nio/n8n:latest, creates the data volume, and starts the container on your deployment's private network (mp-dep-{deploymentId}). Watch progress and logs live in the service cockpit.

Once it's running, n8n is reachable at the auto-assigned subdomain shown on the service page — useful for a first check before wiring up your own domain.

n8n service overview showing Running status, the n8nio/n8n:latest image, container id, auto-assigned access URL, and the data volume
n8n running, with the data volume mounted at /home/node/.n8n

Here's the full path a request takes once you're live: your domain hits Traefik, which terminates TLS and forwards to the n8n container — and the data volume sits outside that container, so it's untouched the next time you deploy:

deployn8n.example.comyour DNS, CNAMETraefikauto TLS (Let's Encrypt)n8n containerreplaced on every deploydata volumesurvives deploys

  1. In the service settings, set Custom domain to n8n.example.com
  2. Add the DNS records:
    • CNAME n8n.example.com cname.spunto.net (or your self-hosted instance's domain)
    • the one-time TXT _spunto-challenge.n8n.example.com record shown in the dashboard
  3. Click Verify domain
n8n service settings with the Custom domain field set to n8n.example.com
Setting the custom domain — the DNS instructions and verify button appear once it's saved

Traefik provisions a TLS certificate automatically on first request (Let's Encrypt HTTP-01) — no manual cert management.

Tip

Only one service can hold a verified custom domain at a time. If you're moving n8n.example.com from another service, verify it on the new service to take over routing.

Bump the image tag (or keep :latest and just re-deploy) and click Deploy again. Spunto force-pulls the new image, stops the old container, and starts a fresh one — your workflows and credentials survive because they live on the data volume, not in the container.

If you want a safety net before upgrades touch real data, give the service a preDeployCommand that runs a quick health or backup script before the swap — see Deployments → Pre-deploy hooks.

Workers (Spunto's Build side) are for development — they're meant to be stopped, rebuilt, and thrown away as you iterate. A deployment service is the right home for anything that needs to stay up: it survives project rebuilds, gets its own custom domain, and is what the Run tooling (logs, stats, jobs) treats as a production target rather than a dev sandbox.