Guides
Self-host n8n on a VPS in Germany
Run your own n8n instance with HTTPS, a custom domain and daily backups on an NVMe server in Frankfurt for €4.99/month. One-click image or Docker Compose, both covered.
Updated
n8n Cloud starts at about €20/month and caps executions. A 2 GB server runs a personal n8n with hundreds of workflows for €4.99/month with no execution limit, and your data stays in Frankfurt. This guide gets you from nothing to https://n8n.yourdomain.com with automatic TLS and daily backups.
What you need
- An Odinex account with a few euros of credit (one hour of an s1 costs about one cent).
- A domain you control, with DNS you can edit.
- An SSH key on your computer (
ssh-keygen -t ed25519if you don't have one).
Server size
| Use | Type | RAM | Price |
|---|---|---|---|
| Personal, up to ~50 active workflows | s1 | 2 GB | €4.99/mo |
| Team, webhooks under load, AI nodes | s2 | 4 GB | €8.99/mo |
| Heavy: queue mode with workers | s4 | 8 GB | €17.99/mo |
Option A: one-click image (2 minutes of work)
- Console → Servers → Create server. Location
fra1, image n8n under Apps, types1, your SSH key, namen8n-1, labelapp=n8n(the firewall below uses it). - Wait for the first start: n8n migrates its database before it accepts requests, which takes 3 to 10 minutes on a small server.
- SSH in and read your address and password:
ssh root@<server-ip>, thencat /root/APP-INFO.txt. The owner account (admin@<your-host>) is created on first boot, so the setup page is never open to the internet. - Point
n8n.yourdomain.com(A record) at the server's IPv4 address. Add an AAAA record for IPv6 if you like. Then runnexoran-app-domain n8n.yourdomain.comon the server: Caddy fetches a Let's Encrypt certificate and n8n's webhook base URL follows the new name. - Open
https://n8n.yourdomain.com, sign in and change the owner email to your own under Settings → Personal.
The app lives in /opt/nexoran-app (Compose file and .env); the first-boot log is /var/log/nexoran-app.log.
Option B: Docker Compose from scratch (10 minutes)
Create an Ubuntu 24.04 server with the Docker CE image, then write the settings. The heredoc is unquoted on purpose, so the shell fills in the random key and password:
mkdir -p /opt/n8n && cd /opt/n8n
cat > .env <<EOF
DOMAIN=n8n.yourdomain.com
TZ=Europe/Berlin
N8N_ENCRYPTION_KEY=$(openssl rand -hex 32)
DB_PASSWORD=$(openssl rand -hex 16)
EOF
chmod 600 .envservices:
caddy:
image: caddy:2
restart: unless-stopped
ports: ["80:80", "443:443"]
environment:
- DOMAIN=${DOMAIN}
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
n8n:
image: n8nio/n8n:latest
restart: unless-stopped
environment:
- N8N_HOST=${DOMAIN}
- N8N_PROTOCOL=https
- WEBHOOK_URL=https://${DOMAIN}/
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
- GENERIC_TIMEZONE=${TZ}
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=db
- DB_POSTGRESDB_USER=n8n
- DB_POSTGRESDB_PASSWORD=${DB_PASSWORD}
volumes:
- n8n_data:/home/node/.n8n
depends_on: [db]
db:
image: postgres:16
restart: unless-stopped
environment:
- POSTGRES_USER=n8n
- POSTGRES_PASSWORD=${DB_PASSWORD}
- POSTGRES_DB=n8n
volumes:
- pg_data:/var/lib/postgresql/data
volumes: { caddy_data: {}, n8n_data: {}, pg_data: {} }{$DOMAIN} {
reverse_proxy n8n:5678
}docker compose up -d, point DNS at the server, open the URL and create the owner account straight away: until you do, anyone who opens the URL can.
Lock it down
- Create a firewall in the console: allow TCP 22 from your IP, TCP 80 and 443 from anywhere, drop the rest. Apply it by label
app=n8n(add the label to the server if you did not set it at creation). - Turn on backups for the server (+20 % of the price, 7 daily copies kept). For Postgres-level backups add a nightly
pg_dumpto a volume. - Set
N8N_ENCRYPTION_KEYonce and never change it: credentials are encrypted with it. Keep a copy somewhere safe; without it, stored credentials cannot be decrypted after a restore.
Updating
cd /opt/n8n && docker compose pull && docker compose up -d (for the one-click image, cd /opt/nexoran-app). Take a snapshot first if you skip versions.
Same thing with the CLI
odx server create --name n8n-1 --type s1 --image n8n --location fra1 --ssh-key laptop --label app=n8n
odx server ssh n8n-1Cost
s1 €4.99 + backups €1.00 + IPv4 €0.50 = €6.49/month, unmetered traffic. Billed hourly from a prepaid balance; delete the server and billing stops.