Skip to content
Odinex Cloud
n8n on the marketplace

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 ed25519 if you don't have one).

Server size

UseTypeRAMPrice
Personal, up to ~50 active workflowss12 GB€4.99/mo
Team, webhooks under load, AI nodess24 GB€8.99/mo
Heavy: queue mode with workerss48 GB€17.99/mo

Option A: one-click image (2 minutes of work)

  1. Console → Servers → Create server. Location fra1, image n8n under Apps, type s1, your SSH key, name n8n-1, label app=n8n (the firewall below uses it).
  2. Wait for the first start: n8n migrates its database before it accepts requests, which takes 3 to 10 minutes on a small server.
  3. SSH in and read your address and password: ssh root@<server-ip>, then cat /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.
  4. Point n8n.yourdomain.com (A record) at the server's IPv4 address. Add an AAAA record for IPv6 if you like. Then run nexoran-app-domain n8n.yourdomain.com on the server: Caddy fetches a Let's Encrypt certificate and n8n's webhook base URL follows the new name.
  5. 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 .env
/opt/n8n/docker-compose.yml
services:
  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: {} }
/opt/n8n/Caddyfile
{$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

  1. 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).
  2. Turn on backups for the server (+20 % of the price, 7 daily copies kept). For Postgres-level backups add a nightly pg_dump to a volume.
  3. Set N8N_ENCRYPTION_KEY once 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-1

Cost

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.

Deploy n8n now · n8n on the marketplace · Firewalls