376 lines
13 KiB
Plaintext
376 lines
13 KiB
Plaintext
---
|
|
title: "#1: Docker, Portainer und n8n installieren"
|
|
date: 2022-03-28
|
|
draft: false
|
|
series: ["YouTube", "n8n"]
|
|
categories: ["Tutorials"]
|
|
tags: ["docker", "n8n", "caddy", "portainer", "installation", "tutorial"]
|
|
---
|
|
|
|
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:
|
|
|
|

|
|
|
|
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.
|
|
|
|

|
|
|
|
#vata=# Installation von Docker
|
|
|
|
```bash
|
|
# 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
|
|
```
|
|
|
|
```sh
|
|
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**
|
|
|
|
```sh
|
|
sudo usermod -a -G docker "$(whoami)"
|
|
```
|
|
|
|
Oder **Fish**
|
|
|
|
```sh
|
|
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.
|
|
|
|
```sh
|
|
sudo mkdir -m 775 /opt/docker-services
|
|
```
|
|
|
|
Und nun die Berechtigungen einstellen:
|
|
|
|
**Bash**
|
|
|
|
```sh
|
|
sudo chown $(whoami):docker /opt/docker-services
|
|
```
|
|
|
|
**Fish**
|
|
|
|
```sh
|
|
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:
|
|
|
|
```sh
|
|
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:
|
|
|
|
```sh
|
|
/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:
|
|
|
|
```sh
|
|
sudo pacman -Syu caddy
|
|
```
|
|
|
|
In Ubuntu oder anderen Debian basierten Distributionen ist die Installation ein klein wenig umständlicher:
|
|
|
|
```sh
|
|
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:
|
|
|
|
```
|
|
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](#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:
|
|
|
|
```json
|
|
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:
|
|
|
|
```sh
|
|
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:
|
|
|
|
```sh
|
|
docker network create web
|
|
```
|
|
|
|
Jetzt den Container Stack starten:
|
|
|
|
```sh
|
|
docker-compose up -d
|
|
```
|
|
|
|
Wenn Ihr jetzt **docker ps** eingebt sollte das ungefähr so aussehen:
|
|
|
|
```sh
|
|
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:
|
|
|
|
```sh
|
|
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.
|
|
|
|
```sh
|
|
tcp :443: bind: permission denied
|
|
```
|
|
|
|
Die Berechtigung setzt Ihr wie folgt:
|
|
|
|
**Bash**
|
|
|
|
```sh
|
|
sudo setcap CAP_NET_BIND_SERVICE=+eip $(which caddy)
|
|
```
|
|
|
|
**Fish**
|
|
|
|
```sh
|
|
sudo setcap CAP_NET_BIND_SERVICE=+eip (which caddy)
|
|
```
|
|
|
|
Also nochmal:
|
|
|
|
```sh
|
|
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:
|
|

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

|
|
|
|
## 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:
|
|
|
|
```sh
|
|
cd ../n8n
|
|
```
|
|
|
|
Das Verzeichnis sollte so aussehen.
|
|
|
|
```sh
|
|
/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:
|
|
|
|
```sh
|
|
# 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:
|
|
|
|
```sh
|
|
mkdir n8n-data
|
|
```
|
|
|
|
**Bash:**
|
|
|
|
```sh
|
|
chown $(whoami):docker n8n-data
|
|
```
|
|
|
|
**Fish:**
|
|
|
|
```sh
|
|
chown (whoami):docker n8n-data
|
|
```
|
|
|
|
Das war es auch schon. Jetzt können wir den Stack starten:
|
|
|
|
```sh
|
|
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:
|
|
|
|
```sh
|
|
cd ../n8n
|
|
```
|
|
|
|
```sh
|
|
mkdir n8n-data
|
|
```
|
|
|
|
**Bash:**
|
|
|
|
```sh
|
|
chown $(whoami):docker n8n-data
|
|
```
|
|
|
|
**Fish:**
|
|
|
|
```sh
|
|
chown (whoami):docker n8n-data
|
|
```
|
|
|
|
#### Den n8n Stack in Portainer erstellen
|
|
|
|

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

|
|
|
|
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
|
|
|
|

|
|
|
|
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:
|
|
|
|

|
|
|
|
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 😄
|
|
|
|

|
|
|
|
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.
|