Steps
-
Get a Linux server with Docker
The n8n docs name no minimum memory for a self-hosted server. We would start with 2 GB of memory (our guidance, not an n8n figure); a long workflow that holds big lists in memory needs more. Install Docker with the official script.
$ curl -fsSL https://get.docker.com | sh -
Start n8n with a volume
The data folder
/home/node/.n8nholds the SQLite database and the encryption key, so it lives in a volume. GENERIC_TIMEZONE is the instance timezone, important for schedule nodes; the default is America/New_York. Set your own. We changed the official command in two places:-druns it in the background and--restart unless-stoppedbrings it back after a reboot.$ docker volume create n8n_data $ docker run -d --restart unless-stopped --name n8n \ -p 5678:5678 \ -e GENERIC_TIMEZONE="Europe/Berlin" \ -e TZ="Europe/Berlin" \ -e N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true \ -v n8n_data:/home/node/.n8n \ n8nio/n8n
-
Open it and create the first account
Open port 5678 of the server in a browser. On the first visit n8n asks you to create an account; that account owns the instance.
-
Give it an https address
Telegram, for one, calls webhooks only over https. Put a reverse proxy with a certificate in front of port 5678: n8n's own guide does it with Traefik in Docker Compose and an A record for your subdomain. Then restart the container with the address. N8N_WEBHOOK_URL (WEBHOOK_URL before n8n 2.30.0) tells n8n its public address; without it n8n builds the URL from N8N_PROTOCOL, N8N_HOST and N8N_PORT, which is wrong behind a reverse proxy. N8N_PROXY_HOPS is the number of reverse proxies n8n runs behind; the default is 0.
$ docker rm -f n8n $ docker run -d --restart unless-stopped --name n8n \ -p 127.0.0.1:5678:5678 \ -e N8N_WEBHOOK_URL=https://n8n.example.com/ \ -e N8N_PROXY_HOPS=1 \ -e GENERIC_TIMEZONE="Europe/Berlin" \ -e TZ="Europe/Berlin" \ -e N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true \ -v n8n_data:/home/node/.n8n \ n8nio/n8n
The data stays in the volume, so you lose nothing.
127.0.0.1keeps port 5678 closed to the outside: a published port is open on all network interfaces by default; put 127.0.0.1 first in the publish string to keep it local. -
Build a workflow that starts on a webhook
Add a Webhook node and set its method to POST. A production webhook is registered only when you publish the workflow; the test URL works while you listen for a test event in the editor. The production path is
/webhook/followed by the path you chose; the test path is/webhook-test/. -
Update when a new version comes out
Pull the image, then remove the container and run the same command again. The volume keeps your workflows and credentials.
$ docker pull n8nio/n8n $ docker rm -f n8n
Check that it works
Publish the workflow, then call its production address. A run appears in the Executions tab of n8n.
$ curl -X POST https://n8n.example.com/webhook/hello \
-H "Content-Type: application/json" -d '{"name":"test"}'Triggers on a computer that sleeps
The two triggers that start most workflows behave differently once the server sleeps.
| Trigger | Server that never sleeps | Uno computer, asleep |
|---|---|---|
| Webhook | Runs at once | The request wakes the computer, then the workflow runs. The first request waits for the wake-up |
| Schedule Trigger | Runs on time | Does not run: n8n sleeps with the computer |
The fix is to let the platform keep the clock. Uno has scheduled tasks: a command runs on your computer on a cron schedule, and Uno keeps the history and the log of every run. In short: a scheduled task that comes due wakes a sleeping computer and runs its command. Point that task at a Webhook node on the same computer, and n8n runs the workflow on time.
# every weekday at 9:00 UTC: wake the computer and call the workflow $ curl -s -H "Authorization: Bearer $UNO_API_KEY" -X POST \ https://console.uno.place/api/v1/scheduled-tasks \ -d '{"name":"n8n daily report","box_id":42,"cron_expr":"0 9 * * 1-5","timezone":"UTC", "command":"curl -fsS -X POST http://localhost:5678/webhook/daily-report"}'
The same line in the crontab of the computer would not help: a crontab entry inside a sleeping computer does not run and cannot wake it. If a workflow must run when nobody calls it and nothing wakes the computer, use a server that never sleeps.
The short way: n8n on an Uno computer
Docker comes on every plan. On Uno, a computer that serves HTTP on port 80 gets a real https address with a valid certificate; Uno handles the encryption, and you buy no domain. Publish n8n on port 80 (-p 80:5678), set N8N_WEBHOOK_URL to that address and N8N_PROXY_HOPS to 1, and the webhooks reach n8n. Or ask the agent in Uno Work to do these steps.
Plus: $20 a month
License and size
Without a license key n8n runs as the free Community edition. Its license, the Sustainable Use License, lets you use the software for your own internal business purposes or for non-commercial or personal use, and share it only free of charge for non-commercial purposes. Offering n8n to others for a fee is outside it; read the license before you build a product on it. The n8n docs warn that self-hosting n8n takes technical knowledge: setting up servers and containers, managing resources, and securing servers and applications.
What this does not do
- A workflow with a Schedule Trigger runs only after you save and publish it, and only while n8n is running. A sleeping computer is not running it.
- Small has 1 GB of memory and Plus has 4 GB. We would start with 2 GB of memory, so n8n belongs on Plus.
- An agent sets this up for you only from Plus: on Small the computer is a bare server for your own agent; Uno Work in the cloud starts with Plus. On Small you run the steps above yourself.
A computer for n8n, from $5 a month
Root and Docker on every plan. It sleeps when nothing calls it and wakes on a webhook.
Small
A Telegram bot, a VPN, a small backend
$5/ month
- 1 vCPU · 1 GB
- 15 GB disk
- 25 GB cloud storage
- 5 boosts a month
Plus
Agents that work with your laptop closed
$20/ month
- 4 vCPU · 4 GB
- 40 GB disk
- 100 GB cloud storage
- Uno Work in the cloud
Pro
A product in production, a second MacBook
$70/ month
- 16 vCPU · 16 GB
- 120 GB disk
- 300 GB cloud storage
- Speed of a MacBook Air M4
Max
A team and many agents at once
$200/ month
- 32 vCPU · 48 GB
- 300 GB disk
- 1,024 GB cloud storage
- 5 public IPv4
Add Uno AI to any plan: 40 h of AI work a month on Small, 100 h on Plus, unlimited on Max. Today: GLM-5.3 Flash and MiMo v2.6 Pro. Or sign in with your own Claude or ChatGPT.
Common problems
The webhook URL in the editor shows localhost or the wrong port
N8N_WEBHOOK_URL to the https address and N8N_PROXY_HOPS=1 behind one reverse proxy, then restart the container.The test URL works, the production URL answers 404
My scheduled workflow did not run last night
"JavaScript heap out of memory"
I lost my credentials after recreating the container
-v n8n_data:/home/node/.n8n; the encryption key lives in that folder.