Wo es läuft
Ein Container, eine Datenbank, ein Reverse Proxy davor. Wer Kurs 1 kennt, kennt das Bild schon — hier kommt nur ein Kasten hinzu.
Was vorher da sein muss
| Voraussetzung | Woher | Wenn es fehlt |
|---|---|---|
| Ein Server mit Docker | Kurs 1, Station 03 (bootstrap.sh) | Ohne Docker geht nichts — dort anfangen. |
| Ein Reverse Proxy mit Zertifikaten | kommt mit Coolify (Traefik) | Auch ein eigener Traefik oder Caddy geht — dann die Labels anpassen. |
| Eine Domain, die auf den Server zeigt | Ihr DNS-Anbieter, A-Eintrag | Ohne DNS kein Zertifikat — und ohne Zertifikat keine Webhook-Adresse, die jemand aufrufen darf. |
| Ein Postausgang (SMTP) | Ihr Mailanbieter, eigenes Konto für Abläufe | Ohne ihn kann kein Ablauf melden. Ein eigenes Postfach, nicht das des Chefs. |
ablauf.ihre-domain.de, nicht in ein Unterverzeichnis Ihrer Anwendung. Dann lässt es sich später umziehen, abschalten oder ersetzen, ohne dass jemand anderes betroffen ist.Zwei Entscheidungen, die jetzt fallen
PostgreSQL statt SQLite
n8n kann seine Daten auch in eine Datei schreiben. Das geht — bis der erste Ablauf gleichzeitig zweimal läuft. Eine Datenbank kostet einen Container und erspart eine Klasse von Fehlern.
Eine feste Fassung, kein „latest"
Mit latest ändert sich beim nächsten Neustart unangekündigt alles — auch die Knoten, aus denen Ihre Abläufe bestehen. Eine Nummer eintragen und bewusst aktualisieren.
WarumWarum die Datenbank im internen Netz hängt
Ein Docker-Netz mit internal: true hat keine Verbindung nach draußen — weder herein noch hinaus. Die Datenbank ist damit nur für Container erreichbar, die im selben Netz hängen, und das sind genau zwei: sie selbst und n8n.
Der Gewinn ist nicht theoretisch. Datenbanken, die versehentlich einen Port nach außen veröffentlichen, werden im Netz innerhalb von Stunden gefunden — automatisiert, nicht gezielt. Ein Container ohne Weg nach draußen kann das nicht, auch nicht durch einen Konfigurationsfehler.
n8n selbst hängt in zwei Netzen: im internen (für die Datenbank) und im Netz des Reverse Proxy (damit der es erreicht). Das ist die einzige Stelle, an der beide Welten sich berühren.
TiefeDasselbe ohne Coolify
Nichts an diesem Aufbau hängt an Coolify. Gebraucht wird nur irgendetwas, das Zertifikate hält und Anfragen weiterreicht. Drei Wege:
- Eigener Traefik: Die Labels in der
docker-compose.ymlbleiben, nur der Netzname und der Name des Zertifikatslösers ändern sich. - Caddy: Zwei Zeilen in der
Caddyfile(ablauf.example.de { reverse_proxy n8n:5678 }), Zertifikat kommt von selbst. Die Traefik-Labels entfallen ersatzlos. - nginx: Server-Block mit
proxy_pass, Zertifikat über certbot. Wichtig:proxy_set_header UpgradeundConnection, sonst bleibt die Oberfläche auf halbem Weg stehen — sie hält eine dauerhafte Verbindung.
Was in allen drei Fällen gleich bleibt: WEBHOOK_URL und N8N_EDITOR_BASE_URL müssen die öffentliche Adresse enthalten. n8n weiß sonst nicht, welche Adresse es in die Auslöser-Knoten schreiben soll — und dann steht dort localhost:5678, was niemand aufrufen kann.