#1: Docker, Portainer und n8n installieren

Ich will mich jetzt nicht allzu lange mit einer Einführung aufhalten. Ich denke es gibt viele gute Videos zu den Themen, die ich hier besprechen werde. Ich möchte Euch hier gar nicht zeigen, wie man Tools wie Docker oder ähnliches benutzt. Viel mehr zeige ich hier ein paar konkrete Lösungsansätze, die ich so oder in abgewandelter Form auch tatsächlich in unserer Firma einsetze.

Für einen großen Teil der hier gezeigten Videos wird ein Setup aus Docker, Caddy, Portainer und n8n notwendig sein. Ich werde mich hier was die Installation und Konfiguration auf das wesentliche beschränken. Ich denke es gibt mehr als genug Tutorials und Videos zu jedem dieser Themen 😉

Subdomains & DNS einrichten

Da ich später Portainer und n8n über separate Subdomains aufrufen möchte und es manchmal ein wenig dauert bis Änderungen an Domains angewendet sind mache ich die Einstellung der Subdomains zuerst. Ich zeige das hier am Beispiel von GoDaddy, weil ich hier meine Domains registriert habe.

DNS Einträge erstellen

Ihr müsst in der Verwaltung Eurer Domain in de DNS Einstellungen gehen. Im Fall von GoDaddy nach dem Login einfach oben rechts auf Euren Namen klicken und dann Meine Produkte wählen. Anschließend könnt Ihr Eure Domain verwalten:

Domain verwalten

Jetzt entweder auf das Menü bei der Domain Karte klicken oder unten auf DNS.

Die DNS Einstellung ist denkbar einfach. Ihr müsst hier einen A-Record und lediglich das Prefix für die Subdomain und die IP-Adresse Eures Servers angeben. Den TTL Wert könnt Ihr so einstellen, wie es für Euch Sinn macht, ich nehme hier immer 600 Sekunden.

Domain verwalten

Installation von Docker

1
2
3
4
5
# Unter Arch Linux, Manjaro etc:
sudo pacman -S docker docker-compose

# Unter Debian, Ubuntu etc:
sudo apt-get update && apt-get install docker docker-compose
1
2
sudo groupadd docker # Optional: bei den meisten Distributionen wird die Gruppe bei der Installation angelegt
sudo systemctl enable --now docker

Berechtigungen und Ordner erstellen

Ich mache es gerne so, dass ich meinen Hauptbenutzer der docker Gruppe hinzufüge, dadurch muss ich beim ausführen von Docker-Befehlen nicht immer das Admin-Kennwort eingeben. Je nachdem welche Shell Ihr einsetzt ist der Befehl ein klein wenig anders. Wenn Ihr nicht wisst welche Shell Ihr nutzt wird das mit Sicherheit Bash sein:

Bash

1
sudo usermod -a -G docker "$(whoami)"

Oder Fish

1
sudo usermod -a -G docker (whoami)

Jetzt den Ordner erstellen wo Docker Konfigurationen etc. abgelegt werden sollen. Ich habe mich hier für den Ordner /opt/docker-services entschieden.

1
sudo mkdir -m 775 /opt/docker-services

Und nun die Berechtigungen einstellen:

Bash

1
sudo chown $(whoami):docker /opt/docker-services

Fish

1
sudo chown (whoami):docker /opt/docker-services

Repository für Caddy, Portainer und n8 klonen und anpassen

Um die Installation einfacher zu machen habe ich ein Repository vorbereitet wodurch eigentlich nur noch ein paar Werte angepasst werden müssen und wir dann direkt loslegen können:

1
git clone git@git.sr.ht:~m3tam3re/yt1-docker-caddy-portainer-n8n /opt/docker-services

Hier eventuell den letzten Teil durch den Ordner ersetzen in dem Du die Daten für Deine Docker Services ablegen möchtest. Das ganze sollte dann von der Struktur her so aussehen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
/opt/docker-services:
├── LICENSE
├── n8n
│   ├── docker-compose.yml
│   ├── DockerFile
│   └── README.md
├── portainer-caddy
│   ├── Caddyfile
│   └── docker-compose.yml
└── README.md

Installation von Caddy und Portainer

Caddy und Portainer sind die Basis für unser Setup. Dabei nutzen wir Caddy als Reverse-Proxy,der dafür zuständig Anfragen an jeweils entsprechenden Docker Container weiterzuleiten. Alternativ könnte man hier auch Traefik oder NGINX einsetzen, aber Caddy ist hier im Vergleich wesentlich einfacher zu konfigurieren.

Portainer ist ein Webinterface, dass die Verwaltung von Docker Containern sehr einfach macht. Portainer ist im Grunde optional und eine gute Alternative für alle, die ungern mit dem Terminal arbeiten.

Caddy installieren

Die Caddy Installation ist relativ einfach. Da mein Server Arch Linux als Betriebssystem hat wird Caddy über pacman installiert:

1
sudo pacman -Syu caddy

In Ubuntu oder anderen Debian basierten Distributionen ist die Installation ein klein wenig umständlicher:

1
2
3
4
5
6
7
8
9
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https

curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo tee /etc/apt/trusted.gpg.d/caddy-stable.asc

curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list

sudo apt update

sudo apt install caddy

Eigentlich wird Caddy nach der Installation automatisch gestartet, falls nicht einfach nochmal:

1
caddy start

Sollte Caddy schon laufen kommt hier ein Fehler. Den könnt Ihr einfach ignorieren.

Caddy und Portainer einrichten

Ich hatte ja ganz oben unter der Überschrift Subdomains & DNS einrichten darüber gesprochen, dass ich Portainer und n8n über separate Subdomains aufrufen möchte. Damit das funktioniert müssen wir Caddy als Reverse-Proxy konfigurieren. Dazu bearbeiten wir das Caddyfile. In meinem Setup habe ich die Domain ca.m3tam3re.com für Portainer eingeplant und io.m3tam3re.com für n8n. Das Caddyfile sieht dann so aus:

1
2
3
4
5
6
ca.m3tam3re.com {
    reverse_proxy localhost:9000
}
io.m3tam3re.com {
    reverse_proxy localhost:5678
}

Wie man sieht ist die Caddy Konfiguration denkbar einfach. Hier solltet Ihr natürlich Eure eigenen Domains verwenden 😄

Conatiner Stack starten

Jetzt können wir die Container erstellen und starten. Dazu erstmal das Verzechnis wechseln wo sich die Datei docker-compose.yml aus dem Repository befindet:

1
cd /opt/docker-services/portainer-caddy

Da ich in der docker-compose.yml ein externes Netzwerk angelegt habe muss das Netzwerk web noch angelegt werden:

1
docker network create web

Jetzt den Container Stack starten:

1
docker-compose up -d

Wenn Ihr jetzt docker ps eingebt sollte das ungefähr so aussehen:

1
2
CONTAINER ID   IMAGE                           COMMAND                  CREATED          STATUS          PORTS                                                          NAMES
f4b9f9302962   portainer/portainer-ce:latest   "/portainer -H unix:…"   4 minutes ago   Up 4 minutes   8000/tcp, 9443/tcp, 127.0.0.1:9000->9000/tcp   portainer-caddy-portainer-1

Caddy Konfiguration für den Container Stack laden

Das Caddyfile, dass wir zuvor angepasst haben kann jetzt von caddy geladen werden:

1
caddy reload

Eventuell Caddy Berechtigungen einstellen

Je nachdem wie das Betriebssystem konfiguriert ist kann es sein, dass Caddy erst die Berechtigung braucht um die Ports 80 und 443 an sich zu binden. Wenn Ihr caddy reload im Terminal ausführt wird Caddy das als Fehler ausgeben.

1
tcp :443: bind: permission denied

Die Berechtigung setzt Ihr wie folgt:

Bash

1
sudo setcap CAP_NET_BIND_SERVICE=+eip $(which caddy)

Fish

1
sudo setcap CAP_NET_BIND_SERVICE=+eip (which caddy)

Also nochmal:

1
caddy reload

Das schöne an Caddy ist übrigens, dass ich in verschiedenen Ordnern Caddyfiles mit unterschiedlichen Einstellungen haben kann und per caddy reload einfach laden kann ohne Neustart des Serverdienstes.

Grundeinrichtung von Portainer

Da jetzt alles laufen sollte 🚀 könnt Ihr jetzt Portainer im Browser ausfrufen. In meinem Fall ist das ca.m3tam3re.com.

Ihr solltet jetzt Eure Administrator Daten für Portainer setzen können:

Portainer - Admin Konto erstellen

Wenn Ihr Euer Admin-Konto eingerichtet habt werden Ihr auch direkt angemeldet und wir sind jetzt startklar für 🚀 n8n 🚀.

Portainer - erstes Login

Installation von n8n

Jetzt wo das grundsätzliche Setup fertig ist können wir endlich unseren ersten Container starten. Ich zeige hier zwei Möglichkeiten, welche Ihr davon nehmt ist Euch überlassen.

1. Mit docker-compose über das Terminal

Auch wenn wir gerade Portainer installiert haben, habe ich das Repository so vorbereitet, dass das ganze auch ohne Portainer einfach einzurichten ist. Also los geht’s:

Umgebungsvariablen anpassen

Zuerst müssen wir in den Ordner n8n unseres Repositories wechseln:

1
cd ../n8n

Das Verzeichnis sollte so aussehen.

1
2
3
4
/opt/docker-services/n8n
├── docker-compose.yml
├── DockerFile
└── .env

Öffnet die Datei .env und passt die Werte entsprechend an. Bei mir sieht das z.B. so aus:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# TLD - Deine Hauptdomain auf der n8n laufen wird
DOMAIN_NAME=m3tam3re.com

# Die Subdomain für n8n
SUBDOMAIN=io

# DOMAIN_NAME und SUBDOMAIN bestimmen in Kombination wie n8n erreichbar sein wird
# im oben stehende Beispiel wäre das: https://n8n.deine-domain-hier.com

# Der Benutzername für die Anmeldung - BITTE ÄNDERN!
N8N_BASIC_AUTH_USER=admin

# Das Kennwort für die Anmeldung - BITTE ÄNDERN!
N8N_BASIC_AUTH_PASSWORD=gehtDichNixAn0815

# Hier kannst Du die Zeitzone setzen, das ist z.B. für CRON Aufgaben wichtig
# Wenn nicht gesetzt wird New York gesetzt
GENERIC_TIMEZONE=Europe/Berlin

# Erlaubt das Importieren und Nutzen von internen Modulen in Funktions-Nodes
NODE_FUNCTION_ALLOW_BUILTIN=*

# Erlaubt das Importieren und Nutzen von externen Modulen in Funktions-Nodes
NODE_FUNCTION_ALLOW_EXTERNAL=*

Da n8n in dieser Konstellation Probleme mit den Berechtigungen bei regulären Docker Volumes bekommt müssen wir noch einen Ordner für die permanente Speicherung der Daten von n8n anlegen:

1
mkdir n8n-data

Bash:

1
chown $(whoami):docker n8n-data

Fish:

1
chown (whoami):docker n8n-data

Das war es auch schon. Jetzt können wir den Stack starten:

1
docker-compose up -d

2. n8n über Portainer einrichten

Ordner für die permanente Speicherung von Daten anlegen

Zuerst müssen wir auch bei dieser Variante in den Ordner n8n unseres Repositories wechseln:

1
cd ../n8n
1
mkdir n8n-data

Bash:

1
chown $(whoami):docker n8n-data

Fish:

1
chown (whoami):docker n8n-data

Den n8n Stack in Portainer erstellen

Portainer - n8n Stack erstellen

Wenn Ihr auf Add stack geklickt habt bekommt Ihr das Konfigurationsfenster für den Stack angezeigt:

Portainer - n8n Stack konfigurieren

Hier gibt es eigentlich nur ein paar Dinge einzustellen:

  1. Den Namen für den Stack festlegen
  2. Den Inhalt der Datei n8n/docker-compose.yml in den Webeditor kopieren oder die Datei über den Upload Tab hochladen
  3. Die Datei n8n/.env hochladen

Portainer - n8n Umgebungsvariablen setzen

Ihr braucht die Datei .env nicht vorher anpassen. Portainer erlaubt Euch hier zuvor die Werte anzupassen. Jetzt mit einem Klick auf Deploy the stack den Stack starten.

n8n einrichten

Endlich geschafft 🚀 😄. Ich muss zugeben, dass mir auch so langsam die Puste ausgeht. Das alles einmal aufzuschreiben dauert doch sehr viel länger als ich dachte 🤣.

Jetzt könnt Ihr die Domain für n8n aufrufen. In meinem Beispiel ist das io.m3tam3re.com und den admin Account einrichten:

n8n - Admin erstellen

Jetzt könnt Ihr Euch anmelden und landet auf der Seite für die Workflowerstellung. Wer möchte kann hier einfach einmal in den Templates stöbern. n8n bietet jede Menge fertige Vorlagen für die Automatisierng von Aufgaben 😄

n8n - Templates

Das war’s 🚀

Abschluss

Noch ein paar abschließende Kommentare 😄:

  1. In vielen Videos wird derzeit sehr oft die Kombination Docker und Traefik gezeigt und angepriesen. Traefik ist ein großartiges Programm und ich würde es bedenkenlos jedem empfehlen. Der Grund warum ich aber hier stattdessen Caddy verwende ist, dass Caddy sehr viel einfacher zu konfigurieren ist und auch viele Dinge einfacher macht. Z.B. werden über Caddy automatisch gültige SSL-Zertifikate für die Domains erstellt, was bei Traefik für jede Domain konfiguriert werde muss. Im Produktiveinsatz macht es natürlich Sinn Caddy als Service zu starten und die Konfiguration über die REST-Api von Caddy vorzunehmen. Für dieses und auch noch folgende Beispiele ist die hier gezeigte Einstellung aber vollkommen ausreichend 😄

  2. Ich setze ganz bewusst das Image n8n-debian ein. Ich weiß, dass Alpine-basierte Container wesentlich kleiner sind, aber es kommt hier gerade nicht auf den Speicherplatz an. Mit dem Debian Image habe ich Zugriff auf eine riesige Datenbank von Binaries die ich im Handumdrehen installieren und nutzen kann. Würde ich den Alpine Container nehmen müsste ich wahrscheinlich so einiges aus dem Quellcode kompilieren, weil es sehr viel weniger Pakete gibt.

0%