Für die Installation nehmen wir ein frisches Ubuntu 24.04, installieren Docker und verwenden die Container von n8n, PostgreSQL und den Nginx Proxy Manager:
# apt install -y ca-certificates curl gnupg
# install -m 0755 -d /etc/apt/keyrings
# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | tee /etc/apt/sources.list.d/docker.list
# apt-get update
# apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# systemctl enable docker --now
Verzeichnisse für den Stack:
# mkdir -p /opt/n8n-stack/nginx/data /opt/n8n-stack/nginx/letsencrypt
# cd /opt/n8n-stack
Im Ordner legen wir einen docker-compose.yml an:
services:
n8n-db:
image: postgres:15
container_name: n8n-db
restart: unless-stopped
environment:
- POSTGRES_DB=n8n
- POSTGRES_USER=n8n
- POSTGRES_PASSWORD=SehrGeheimesPasswort
volumes:
- n8n_db_data:/var/lib/postgresql/data
networks:
- n8n-network
n8n:
image: n8nio/n8n:latest
container_name: n8n
restart: unless-stopped
environment:
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=n8n-db
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=n8n
- DB_POSTGRESDB_USER=n8n
- DB_POSTGRESDB_PASSWORD=SehrGeheimesPasswort
- N8N_HOST=n8n.max-it.de
- WEBHOOK_URL=https://n8n.max-it.de/
- N8N_PROTOCOL=https
- GENERIC_TIMEZONE=Europe/Berlin
volumes:
- n8n_data:/home/node/.n8n
networks:
- n8n-network
depends_on:
- n8n-db
nginxproxymanager:
image: jc21/nginx-proxy-manager:latest
container_name: nginxproxymanager
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "81:81"
volumes:
- ./nginx/data:/data
- ./nginx/letsencrypt:/etc/letsencrypt
networks:
- n8n-network
volumes:
n8n_data:
n8n_db_data:
networks:
n8n-network:
driver: bridge
Wir starten mit docker compose up -d
und verfolgen den Prozess:
[+] Running 64/64
✔ n8n-db Pulled 40.2s
✔ 59e22667830b Pull complete 18.7s
✔ 5f89f15368a7 Pull complete 18.8s
✔ 0bb403f9f337 Pull complete 19.3s
✔ 8a87db2cd315 Pull complete 19.5s
✔ 646b3426f78e Pull complete
...
[+] Running 6/6
✔ Network n8n-stack_n8n-network Created 0.1s
✔ Volume "n8n-stack_n8n_data" Created 0.0s
✔ Volume "n8n-stack_n8n_db_data" Created 0.0s
✔ Container nginxproxymanager Started 1.5s
✔ Container n8n-db Started 1.3s
✔ Container n8n Started 0.9s
Anschließend ist ein Login auf n8n.max-it.de:81 auf dem Proxy Manager möglich und wir loggen uns mit admin@example.com
und changeme
ein und ändern die Daten.
Ein wunderschöner Screen begrüßt uns nach dem Login:

Wir wechseln zu Hosts -> Proxy Hosts und fügen einen neuen Host hinzu.
Domain Name ist n8n.max-it.de (respektive die eigene Domain), 127.0.0.1 und Port 5678.
Im Tab SSL Request a new SSL Certificate auswählen und Force SSL aktivieren. Bitte prüfen ob FQDN aufgelöst und Port 80 von außen erreicht werden kann!

Die IP Localhost war erst mal nicht richtig, wir müssen die Adresse des Container herausfinden. Hierzu wechseln wir wieder auf die Console und prüfen die Container ID:
root@host:/opt/n8n-stack# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9d3f61cc159d n8nio/n8n:latest "tini -- /docker-ent…" 14 minutes ago Up 14 minutes 5678/tcp n8n
6a81b7fd554b postgres:15 "docker-entrypoint.s…" 14 minutes ago Up 14 minutes 5432/tcp n8n-db
625dcdd85601 jc21/nginx-proxy-manager:latest "/init" 14 minutes ago Up 14 minutes 0.0.0.0:80-81->80-81/tcp, [::]:80-81->80-81/tcp, 0.0.0.0:443->443/tcp, [::]:443->443/tcp nginxproxymanager
Anschließend holen wir uns alle Info und tragen die korrekte IP ein (hier 172.18.0.4):
root@host:/opt/n8n-stack# docker inspect 9d3f61cc159d
...
"NetworkSettings": {
"Bridge": "",
"SandboxID": "6eb278eb258154f2f8ca9e3ee22945c9b1825617ff19390112fafa357012ad29",
"SandboxKey": "/var/run/docker/netns/6eb278eb2581",
"Ports": {
"5678/tcp": null
},
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "",
"Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "",
"IPPrefixLen": 0,
"IPv6Gateway": "",
"MacAddress": "",
"Networks": {
"n8n-stack_n8n-network": {
"IPAMConfig": null,
"Links": null,
"Aliases": [
"n8n",
"n8n"
],
"MacAddress": "46:20:45:27:65:d9",
"DriverOpts": null,
"GwPriority": 0,
"NetworkID": "9c4f9c4ada273d066d2bb39a35639d0fcd4d671a0717862d3cee37fc395f1d26",
"EndpointID": "ea9791925a47b5670dfce12166b0428f44ec9280a8e75985e1a0ecf2b7e0bf25",
"Gateway": "172.18.0.1",
"IPAddress": "172.18.0.4",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"DNSNames": [
"n8n",
"9d3f61cc159d"
]
}
}
...
Schön begrüßt uns n8n:

Zugangsdaten erstellen und los geht …
