Files
Homelab--Bratonein-Kontroll…/Kapitel 19/Free Rohtext.md

1002 lines
40 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Kapitel 18 WAHA (WhatsApp HTTP API)
## Einleitung
WhatsApp ist ob man es mag oder nicht der meistgenutzte Messenger der westlichen Welt.
Für viele Creator:innen, Communities oder Teams ist er daher ein unvermeidlicher Teil der Kommunikationsstruktur
egal ob für Zuschauer:innenKontakt, EventAnkündigungen oder automatisierte Benachrichtigungen.
**WAHA** (WhatsApp HTTP API) ist ein selbstgehosteter Dienst, der ein zentrales Problem löst:
WhatsApp lässt sich im Gegensatz zu Telegram, Discord oder Signal **nicht über offene APIs** ansprechen
automatisierte Nachrichten oder Integrationen sind offiziell nur über die MetaCloud möglich und mit hohen Hürden verbunden.
WAHA umgeht diese Beschränkung, indem es das **WebInterface von WhatsApp** lokal emuliert.
So kannst du Nachrichten senden und empfangen ohne Drittanbieter, ohne Cloud, direkt aus deinem eigenen Netzwerk.
In diesem Kapitel richtest du WAHA als dedizierten **LXC-Container** in deinem UCC ein.
Du verbindest den Dienst mit einem separaten WhatsAppKonto und ermöglichst so den automatisierten Empfang und Versand von Nachrichten
z.B. zur Trigger-Auslösung in Workflows, als Rückkanal für Zuschauer:innen oder zur Weiterleitung interner Systemereignisse.
👉 **Screenshot geeignet:** UCC-Dashboard mit markiertem WAHAContainer, neben n8n und NPM
> [!NOTE]
> WAHA simuliert ein WhatsAppWebInterface und benötigt daher ein physisches Gerät mit aktiver WhatsAppInstallation.
> Diese Lösung eignet sich **nicht für produktive Massenkommunikation** oder den Ersatz offizieller WhatsAppBusinessAPIs,
> sondern für individuelle, datensparsame Anwendungsfälle z.B. private Rückkanäle, automatisierte Antworten,
> Kontaktformulare, Zustellbenachrichtigungen oder InfoTrigger im StreamingKontext.
WAHA arbeitet vollständig lokal, speichert keine Nachrichten extern und lässt sich direkt mit Diensten wie **n8n**,
**WebhookEmpfängern** oder benutzerdefiniertem Backend verbinden.
So entsteht eine WhatsAppSchnittstelle, die exakt das tut, was du brauchst nicht mehr und nicht weniger.
👉 **Screenshot geeignet:** Browseransicht WAHAWebinterface mit QRCode für WhatsAppVerknüpfung
---
## Voraussetzungen & Ressourcen
WAHA ist leichtgewichtig, benötigt aber eine stabile Umgebung für das Webinterface, die Protokollierung und die EchtzeitVerarbeitung eingehender Nachrichten.
Im Hintergrund laufen HeadlessBrowserprozesse, SocketVerbindungen und eine kleine HTTPAPI alles innerhalb eines Containers.
Um Störungen bei der Kommunikation zu vermeiden, sollte die Umgebung klar definiert und zuverlässig sein.
### Container-Ressourcen
* **CPU:** 2 vCPU
Erforderlich für parallele Prozesse wie WebSocketVerbindungen, Headless-Browser (z.B. Chromium) und API-Handling.
* **RAM:** 2 GB
Ausreichend für den stabilen Betrieb von WAHA, inklusive temporärer Pufferspeicherung eingehender und ausgehender Daten.
* **Speicherplatz:** 10 GB
Deckt das Betriebssystem, Logs, temporäre Browserdaten und gespeicherte Sessions ab.
Reicht im Dauerbetrieb vollständig aus, auch mit mehreren Verbindungen.
* **Netzwerk:** Statische IP oder DHCP-Reservierung
Notwendig für saubere Proxy-Integration und externe Webhook-Zugriffe.
* **Betriebssystem:** Debian 12 (Bookworm)
Schlank, stabil und optimal geeignet für den Einsatz von Docker und Headless-Browsern in Containerumgebungen.
👉 **Screenshot geeignet:** Ressourcenübersicht beim Erstellen des WAHA-LXC (vCPU 2 | RAM 2 GB | Storage 10 GB | Debian 12)
### Technische Voraussetzungen
Vor der Einrichtung sollte dein UCC folgende Voraussetzungen erfüllen:
* **Proxmox VE** ist aktiv und bereit zur Containererstellung.
Der WAHA-Container wird wie gewohnt direkt über die Proxmox-Oberfläche angelegt.
* **Nginx Proxy Manager (NPM)** ist installiert und erreichbar.
WAHA wird später über eine eigene Subdomain bereitgestellt.
* **DNS- oder DynDNS-Eintrag** für `waha.deinedomain.tld` ist vorhanden.
Dieser wird für das SSL-Zertifikat und die WhatsApp-Webverbindung benötigt.
* **Internetverbindung** im Container ist stabil.
WAHA benötigt Zugriff auf WhatsAppServer (Webschnittstelle) und lädt initial alle Pakete über offizielle Repositories.
* **SSH-Zugriff** auf den Container ist möglich, z.B. per:
```bash
ssh root@<IP-des-Containers>
```
Ersetze `<IP-des-Containers>` durch die tatsächliche Adresse deines WAHALXC.
> [!IMPORTANT]
> Der Container sollte auf einem Host mit stabiler Netzwerkverbindung laufen.
> Kurze Unterbrechungen führen zu Sessionabbrüchen und trennen die WhatsAppVerbindung
> in diesem Fall muss der QRCode erneut gescannt werden.
👉 **Screenshot geeignet:** Proxmox-Interface mit markiertem WAHA-LXC in der Containerliste
---
## Schritt-für-Schritt-Anleitung
### Schritt 1 Container vorbereiten und System aktualisieren
Starte den frisch erstellten WAHAContainer in Proxmox und öffne die Konsole entweder direkt über das Webinterface oder per SSH.
Zuerst werden alle Systempakete auf den aktuellen Stand gebracht:
```bash
apt update && apt upgrade -y
```
Nach Abschluss den Container neu starten:
```bash
reboot
```
Anschließend erneut per SSH anmelden:
```bash
ssh root@<IP-des-Containers>
```
> [!NOTE]
> Ein aktuelles System ist Pflicht.
> WAHA benötigt moderne Pakete für Netzwerk, TLS und Headless-BrowserSupport.
> Veraltete Images führen häufig zu Abbrüchen bei der WebSocketVerbindung oder zu Inkompatibilitäten beim Start.
👉 **Screenshot geeignet:** Proxmox-Konsole mit erfolgreichem Abschluss von `apt upgrade` (alle Pakete aktuell)
### Schritt 2 Docker installieren und vorbereiten
WAHA läuft vollständig in Docker-Containern.
Damit die Umgebung stabil funktioniert, installierst du zunächst alle benötigten Pakete für Docker und Docker Compose.
```bash
apt install -y ca-certificates curl gnupg lsb-release
```
Nun wird das offizielle Docker-Repository hinzugefügt und die aktuelle Engine installiert:
```bash
mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/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/debian $(lsb_release -cs) stable" \
| tee /etc/apt/sources.list.d/docker.list > /dev/null
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```
Prüfe anschließend, ob Docker korrekt installiert wurde:
```bash
docker --version
docker compose version
```
Die Ausgabe sollte in etwa so aussehen:
```
Docker version 26.1.x
Docker Compose version v2.29.x
```
> [!NOTE]
> WAHA nutzt Docker Compose als bevorzugte Installationsmethode.
> Manuelle Setups ohne Compose werden von der Community zwar unterstützt,
> sind aber deutlich fehleranfälliger und erschweren spätere Updates.
👉 **Screenshot geeignet:** Terminalausgabe mit sichtbarer Docker- und Compose-Version nach erfolgreicher Installation
### Schritt 3 Verzeichnisstruktur und Konfiguration anlegen
WAHA wird zentral in einem eigenen Verzeichnis unter `/opt/waha` betrieben.
Dort liegen später sowohl die Docker-Compose-Datei als auch Konfiguration, Logs und persistente Daten.
So bleibt das System klar strukturiert und leicht sicherbar.
Erstelle zunächst das Hauptverzeichnis und wechsle hinein:
```bash
mkdir -p /opt/waha
cd /opt/waha
```
Lege anschließend die Unterordner für Konfiguration, Logs und Daten an:
```bash
mkdir -p config logs data
```
👉 **Screenshot geeignet:** Terminal mit ausgeführtem `ls -l /opt/waha` (alle drei Unterordner sichtbar)
Nun folgt die grundlegende **`.env`-Datei**, in der alle wichtigen Parameter definiert sind.
Öffne sie im Editor:
```bash
nano /opt/waha/.env
```
Füge folgenden Inhalt ein:
```
# Basis-Konfiguration
TZ=Europe/Berlin
WAHA_PORT=3000
WAHA_DATA_PATH=/opt/waha/data
# Sicherheit
WAHA_SECRET=$(openssl rand -hex 32)
# Logging
WAHA_LOG_LEVEL=info
# Admin-Zugang (optional)
WAHA_ADMIN_USER=admin
WAHA_ADMIN_PASSWORD=changeMe123!
```
Speichern (STRG + O, Enter) und schließen (STRG + X).
> [!NOTE]
> Die Datei `.env` wird von Docker Compose automatisch eingelesen.
> Sie enthält sensible Daten wie Passwörter und Schlüssel daher sollten die Berechtigungen auf root beschränkt bleiben.
👉 **Screenshot geeignet:** geöffnete `.env`-Datei mit markierten Variablen (Port, Log-Level, Admin-Zugang)
Jetzt folgt die eigentliche **`docker-compose.yml`**-Datei.
Sie definiert den WAHA-Dienst und die dazugehörigen Volumes.
```bash
nano /opt/waha/docker-compose.yml
```
Füge folgenden Inhalt ein:
```yaml
version: "3.9"
services:
waha:
image: devlikeapro/whatsapp-http-api:latest
container_name: waha
restart: unless-stopped
env_file:
- .env
ports:
- "3000:3000"
volumes:
- ./data:/app/data
- ./config:/app/config
- ./logs:/app/logs
```
Speichern und schließen.
> [!TIP]
> Diese Struktur entspricht der aktuellen offiziellen Empfehlung des WAHA-Projekts.
> Alle Daten liegen lokal, Updates erfolgen über Image-Pulls, und ein Neustart setzt die laufende Session nicht zurück,
> solange der `/opt/waha/data`-Ordner erhalten bleibt.
👉 **Screenshot geeignet:** Terminalansicht mit geöffneter `docker-compose.yml` und markiertem Dienst `waha`
### Schritt 4 Container starten und erste Verbindung prüfen
Mit der vorbereiteten `.env`- und `docker-compose.yml`-Datei kannst du WAHA jetzt starten.
Alle erforderlichen Komponenten werden automatisch geladen und im Hintergrund ausgeführt.
Starte den Dienst mit:
```bash
docker compose up -d
```
Während des ersten Starts lädt Docker das WAHA-Image von **devlikeapro/whatsapp-http-api** herunter und initialisiert die Datenstruktur im Ordner `/opt/waha/data`.
Überprüfe anschließend den Status:
```bash
docker compose ps
```
Die Ausgabe sollte in etwa so aussehen:
```
NAME IMAGE STATUS PORTS
waha devlikeapro/whatsapp-http-api:latest Up 1 minute 0.0.0.0:3000->3000/tcp
```
👉 **Screenshot geeignet:** Terminalausgabe von `docker compose ps` mit aktivem Container *Up*
Wenn der Container läuft, öffne im Browser:
```
http://<IP-des-Containers>:3000
```
Du solltest die WAHA-Weboberfläche sehen.
Beim ersten Start wird dir ein **QR-Code** angezeigt, über den du dein WhatsApp-Konto mit der Instanz verbindest.
> [!NOTE]
> Dieser QR-Code muss mit der WhatsApp-App auf deinem Smartphone gescannt werden genauso wie bei WhatsApp Web.
> Nach erfolgreicher Kopplung bleibt die Session aktiv, solange der Container läuft und die Daten erhalten bleiben.
👉 **Screenshot geeignet:** Browseransicht mit WAHA-QR-Code zur WhatsApp-Verknüpfung
Wenn du den QR-Code gescannt hast, sollte in der WAHA-Weboberfläche der Status **„Connected“** erscheinen.
Damit ist die Verbindung zwischen deinem WhatsApp-Konto und dem UCC erfolgreich hergestellt.
Prüfe den Status auch über die API:
```bash
curl http://localhost:3000/api/sessions
```
Die Ausgabe sollte bestätigen, dass eine aktive Session existiert.
> [!TIP]
> Wenn der QR-Code nicht erscheint oder sich die Seite nach dem Scannen nicht aktualisiert,
> überprüfe die Browserkonsole und Containerlogs:
> ```bash
> docker compose logs -f waha
> ```
> In den meisten Fällen liegt die Ursache an einer blockierten WebSocket-Verbindung oder einem temporären Timeout beim Start.
👉 **Screenshot geeignet:** Browserfenster mit WAHA-Status „Connected“ und sichtbarer API-URL
### Schritt 5 Integration in Nginx Proxy Manager (NPM)
Damit WAHA sicher und bequem erreichbar ist, wird der interne Port **3000** jetzt über den **Nginx Proxy Manager** veröffentlicht.
So erhältst du eine verschlüsselte HTTPS-Verbindung und kannst die API später direkt aus n8n oder anderen Diensten ansprechen.
#### Proxy-Host anlegen
1. Öffne das Dashboard des **Nginx Proxy Manager**.
2. Klicke auf **Add Proxy Host**.
3. Trage folgende Werte ein:
| Feld | Wert |
|------|------|
| **Domain Names** | `waha.deinedomain.tld` |
| **Scheme** | `http` |
| **Forward Hostname / IP** | `<IP-des-WAHA-Containers>` |
| **Forward Port** | `3000` |
| **Block Common Exploits** | aktivieren |
| **Websockets Support** | aktivieren |
Wechsle anschließend in den Reiter **SSL** und aktiviere:
- **Request a new SSL Certificate**
- **Force SSL**
- **HTTP/2 Support**
- **HSTS Enabled**
Klicke danach auf **Save**.
> [!NOTE]
> Der Proxy Manager erzeugt automatisch ein gültiges Lets-Encrypt-Zertifikat.
> Achte darauf, dass die Domain bereits korrekt auf deinen Server zeigt sonst schlägt die Zertifikatsprüfung fehl.
👉 **Screenshot geeignet:** NPM-Dashboard mit geöffnetem Proxy-Host `waha.deinedomain.tld`
#### Verbindung prüfen
Öffne im Browser:
```
https://waha.deinedomain.tld
```
Wenn alles funktioniert, siehst du erneut das WAHA-Webinterface diesmal über eine gesicherte HTTPS-Verbindung.
Das **Schloss-Symbol** im Browser bestätigt das aktive SSL-Zertifikat.
> [!TIP]
> Sollte der Browser keine Verbindung herstellen, überprüfe im NPM-Dashboard IP-Adresse und Port.
> In vielen Fällen hilft ein einfacher Neustart des Containers:
> ```bash
> docker compose restart
> ```
👉 **Screenshot geeignet:** Browserfenster mit WAHA-Interface unter `https://waha.deinedomain.tld` (Schloss-Symbol sichtbar)
### Schritt 6 Erste API-Tests und Nachrichten senden
Nach erfolgreicher Verbindung kannst du jetzt prüfen, ob die API korrekt arbeitet und Nachrichten über dein WhatsApp-Konto gesendet werden können.
WAHA stellt dafür eine einfache HTTP-Schnittstelle bereit, die direkt getestet werden kann.
#### Verbindung prüfen
Zuerst prüfen wir, ob die Session korrekt verbunden ist:
```bash
curl https://waha.deinedomain.tld/api/sessions
```
Die Ausgabe sollte in etwa so aussehen:
```json
[
{
"name": "default",
"status": "connected",
"owner": "+491701234567",
"platform": "android",
"createdAt": "2025-10-19T17:00:00.000Z"
}
]
```
> [!NOTE]
> Wenn der Status „disconnected“ oder „pairing“ lautet, wurde die Verbindung unterbrochen.
> In diesem Fall muss der QR-Code neu gescannt werden.
> WAHA zeigt diesen automatisch an, wenn du die Weboberfläche erneut öffnest.
👉 **Screenshot geeignet:** Terminalausgabe von `curl /api/sessions` mit sichtbarem Status *connected*
#### Testnachricht senden
Nun kannst du eine einfache Textnachricht verschicken.
Ersetze im folgenden Beispiel die Telefonnummer durch eine reale WhatsApp-Nummer (mit internationaler Ländervorwahl, **ohne Pluszeichen oder Leerzeichen**):
```bash
curl -X POST https://waha.deinedomain.tld/api/sendText \
-H "Content-Type: application/json" \
-d '{
"chatId": "491701234567@c.us",
"text": "Testnachricht aus dem UCC gesendet über WAHA 🦉"
}'
```
Wenn alles korrekt eingerichtet ist, erhält das Zielgerät die Nachricht innerhalb weniger Sekunden.
> [!TIP]
> Verwende für interne Tests eine eigene Nummer oder ein separates Gerät.
> So verhinderst du, dass der Hauptaccount bei ungewöhnlichen Automatisierungen gesperrt wird.
> WhatsApp erkennt zu häufige automatisierte Aktionen und kann den Account temporär blockieren.
👉 **Screenshot geeignet:** WhatsApp-Chatfenster auf Smartphone mit empfangener Testnachricht „Testnachricht aus dem UCC gesendet über WAHA 🦉“
#### Nachrichten empfangen
Eingehende Nachrichten werden standardmäßig per Webhook weitergegeben.
Diese Funktion nutzt du später für die Integration mit n8n.
Um zu prüfen, ob eingehende Nachrichten erkannt werden, rufe die API-Events ab:
```bash
curl https://waha.deinedomain.tld/api/messages
```
Du erhältst eine Liste der zuletzt empfangenen Nachrichten.
> [!NOTE]
> Wenn keine Nachrichten erscheinen, prüfe die Containerlogs:
> ```bash
> docker compose logs -f waha
> ```
> Eine stabile Internetverbindung des Smartphones ist zwingend erforderlich,
> da WAHA auf WhatsApp Web basiert und eine permanente Synchronisation erwartet.
👉 **Screenshot geeignet:** Terminalausgabe mit empfangener JSON-Nachricht unter `/api/messages`
### Schritt 7 Dauerbetrieb und Neustart-Verhalten prüfen
Damit WAHA nach einem Neustart des Containers oder Hosts automatisch wieder verfügbar ist,
prüfst du jetzt das Neustart-Verhalten und sicherst die Session-Daten dauerhaft ab.
Zuerst prüfen, ob in der `docker-compose.yml` der Neustart-Modus korrekt gesetzt ist:
```bash
grep restart /opt/waha/docker-compose.yml
```
Die Ausgabe sollte enthalten:
```
restart: unless-stopped
```
> [!NOTE]
> Dieses Flag sorgt dafür, dass der Container automatisch wieder startet,
> sobald Docker nach einem Reboot oder Fehler neu hochfährt.
> Ein zusätzlicher systemd-Dienst ist nicht erforderlich.
👉 **Screenshot geeignet:** Terminalausgabe mit sichtbarem Eintrag `restart: unless-stopped`
Führe jetzt einen kontrollierten Neustart des Containers durch:
```bash
reboot
```
Nach dem Reboot erneut einloggen und prüfen, ob der Dienst automatisch gestartet wurde:
```bash
docker compose ps
```
Die Ausgabe sollte wieder den Status **Up** anzeigen.
> [!TIP]
> Wenn der Container nicht automatisch startet, überprüfe, ob Docker Compose beim Systemstart aktiviert ist.
> Der folgende Befehl zeigt den Status:
> ```bash
> systemctl status docker
> ```
> Docker sollte aktiv („active (running)“) sein.
👉 **Screenshot geeignet:** Terminalausgabe von `docker compose ps` nach Neustart (Containerstatus *Up*)
Prüfe anschließend, ob die WhatsApp-Session erhalten geblieben ist:
```bash
curl https://waha.deinedomain.tld/api/sessions
```
Die Session sollte weiterhin als **connected** angezeigt werden.
Falls der Status „pairing“ oder „disconnected“ erscheint, wurde die Session im RAM statt auf der Festplatte gespeichert.
> [!IMPORTANT]
> WAHA speichert Sitzungsdaten im Volume `/opt/waha/data`.
> Stelle sicher, dass dieser Ordner persistent gemountet ist.
> Nur so bleibt die Kopplung nach einem Neustart erhalten.
👉 **Screenshot geeignet:** Browseransicht WAHA-Interface nach Neustart mit Statusanzeige *Connected*
Damit ist der Dauerbetrieb von WAHA gewährleistet.
Der Container startet automatisch, hält die Verbindung dauerhaft aktiv
und bleibt über die Proxy-Domain `https://waha.deinedomain.tld` sicher erreichbar.
### Schritt 8 Automatische WhatsApp-Benachrichtigung beim Streamstart
In diesem Schritt kombinierst du **n8n** und **WAHA**, um beim Start deines Streams automatisch eine WhatsApp-Nachricht an deine Community oder dein Team zu senden.
Damit wird WAHA aktiv eingesetzt und zeigt, wie sich dein UCC mit Streaming-Ereignissen verbinden lässt.
👉 **Screenshot geeignet:** n8n-Dashboard mit Workflow „Streamstart → WAHA Nachricht senden“
#### Ziel des Workflows
Sobald dein Stream (z. B. auf Twitch) live geht, löst **n8n** den Workflow aus und sendet über die WAHA-API eine WhatsApp-Nachricht in eine definierte Gruppe oder an einen Einzelkontakt.
Beispielnachricht:
> „🎬 Der Stream ist live! Schau jetzt rein auf twitch.tv/Bratonien_TV ✨“
#### Voraussetzungen
* **n8n** ist eingerichtet, läuft stabil und ist über HTTPS erreichbar.
* **WAHA** ist verbunden, über `https://waha.deinedomain.tld` erreichbar und mit deinem WhatsApp-Konto gekoppelt.
* Du hast eine WhatsApp-Gruppe oder einen Kontakt, den dein Account direkt anschreiben darf.
* Der **Twitch-Trigger** (Community-Node) ist installiert. Siehe im **n8n-Kapitel** den Abschnitt „Wichtige Community-Nodes“.
Falls der Node fehlt, installiere ihn in n8n: *Settings → Community Nodes → Install → @n8n-nodes/twitch*.
👉 **Screenshot geeignet:** WAHA-Oberfläche mit Status *Connected* und sichtbarer WhatsApp-Nummer
#### Workflow in n8n erstellen
Öffne dein n8n-Dashboard und erstelle einen neuen Workflow mit zwei Nodes:
**Node 1 Twitch Trigger** und **Node 2 HTTP Request → WAHA Nachricht senden**.
Verbinde die Nodes linear sobald der Stream startet, sendet WAHA die Nachricht.
### Node 1 Twitch Trigger
**Zweck:** Erkennt, wenn dein Twitch-Kanal live geht, und startet den Workflow.
**Node-Typ:** Twitch Trigger
**Name:** Stream Start
**Parameter:**
- **Event:** `Stream started`
- **Channel Name:** `<dein_Twitch_Kanalname>`
- **Authentication:** OAuth 2 (Twitch-Account)
> [!NOTE]
> Der Twitch-Trigger ist ein **Community-Node** und muss installiert/aktiviert sein.
> Er überwacht die Twitch-API in Intervallen und triggert den Workflow automatisch, sobald dein Kanal live ist.
👉 **Screenshot geeignet:** geöffneter Node „Twitch Trigger“ mit Event *Stream started* und aktivem OAuth-Token
### Node 2 HTTP Request → WAHA Nachricht senden
**Zweck:** Sendet über die WAHA-API eine vorbereitete Nachricht an eine definierte WhatsApp-Chat-ID.
**Node-Typ:** HTTP Request
**Name:** WAHA Streambenachrichtigung
**Parameter:**
- **Method:** `POST`
- **URL:**
```
https://waha.deinedomain.tld/api/sendText
```
- **Header Parameter:**
- `Content-Type`: `application/json`
- **Body Parameter:**
```json
{
"chatId": "49XXXXXXXXXXX@c.us",
"text": "🎬 Der Stream ist live! Schau jetzt rein auf twitch.tv/Bratonien_TV ✨"
}
```
#### Chat-ID ermitteln
Damit WAHA weiß, wohin die Nachricht gesendet werden soll, benötigst du die **Chat-ID** des Zielkontakts oder der WhatsApp-Gruppe.
Die ID wird automatisch generiert, sobald du mit dieser Person oder Gruppe mindestens einmal über WAHA interagiert hast.
1. Öffne die WAHA-Weboberfläche (`https://waha.deinedomain.tld`).
2. Scanne den QR-Code, falls noch nicht verbunden, und öffne WhatsApp auf deinem Smartphone.
3. Sende von deinem WhatsApp-Konto **eine Nachricht an dich selbst** oder an die gewünschte Gruppe (z. B. „Test“).
4. Gehe in WAHA auf den Reiter **Logs** oder öffne die API im Browser:
```
https://waha.deinedomain.tld/api/messages
```
5. Suche in der Ausgabe nach `chatId`.
Typische Formate sind:
- Einzelchat: `49XXXXXXXXXXX@c.us`
- Gruppe: `1234567890-987654321@g.us`
Diese ID kopierst du exakt (inklusive Suffix `@c.us` oder `@g.us`) in das Feld `chatId` deines HTTP Request-Nodes.
> [!TIP]
> Bei Gruppen-ID empfiehlt es sich, eine Testnachricht in die Gruppe zu schicken und dann direkt die ID aus der API-Antwort zu übernehmen.
> Achte auf die korrekte Schreibweise bereits ein falsches Zeichen führt zu einem 404- oder 400-Fehler.
👉 **Screenshot geeignet:** WAHA-Log oder API-Ausgabe mit markiertem `chatId`-Eintrag (Beispiel: `49XXXXXXXXXXX@c.us`)
#### Verbindung zwischen den Nodes
Verbinde **Node 1 (Twitch Trigger)** mit **Node 2 (WAHA Nachricht senden)** über den Main-Output.
Sobald der Stream startet, führt n8n automatisch den HTTP-Request aus und WAHA sendet die Nachricht.
👉 **Screenshot geeignet:** n8n-Canvas mit verbundener Kette „Twitch Trigger → WAHA Nachricht senden“
#### Testlauf
1. Öffne die WAHA-Weboberfläche (`https://waha.deinedomain.tld`) und prüfe den Status **Connected**.
2. Starte auf Twitch testweise einen Stream (z. B. über OBS).
3. n8n erkennt den Streamstart und führt den HTTP-Request aus.
4. Innerhalb weniger Sekunden erscheint die WhatsApp-Nachricht in deiner Testgruppe oder bei deinem Kontakt.
👉 **Screenshot geeignet:** WhatsApp-Chat mit eingegangener Nachricht „Der Stream ist live! Schau jetzt rein…“
> [!NOTE]
> Dieser Workflow nutzt nur das **Senden** via WAHA. Er vermeidet automatisierte Antworten auf eingehende Nachrichten und bleibt damit näher an den WhatsApp-Richtlinien.
> Verwende ausschließlich eigene Gruppen oder interne Chats; WhatsApp kann übermäßige Automation als Missbrauch einstufen.
#### Anpassungsmöglichkeiten
* **Dynamischer Nachrichtentext:**
```json
"text": "🎥 Live: {{$json[\"title\"]}} schau jetzt vorbei!"
```
* **Mehrere Plattformen:**
Ergänze weitere Trigger (z. B. YouTube Live) und leite alle auf denselben WAHA-Send-Node.
* **Fallback:**
Falls WAHA nicht erreichbar ist, kann n8n alternativ eine Discord-Nachricht oder E-Mail senden.
👉 **Screenshot geeignet:** geöffneter Node „WAHA Nachricht senden“ mit markiertem JSON-Body und Variablenfeld
---
## Troubleshooting & Tipps
Auch wenn WAHA grundsätzlich stabil arbeitet, kann es in der Kombination mit n8n und Twitch-Triggern zu Verbindungs- oder Authentifizierungsproblemen kommen.
Die folgenden Punkte helfen, typische Fehler schnell zu erkennen und dauerhaft zu vermeiden.
### Verbindung zu WAHA unterbrochen
**Symptom:**
In n8n erscheint der Fehler `ECONNREFUSED` oder `Request failed with status 502`.
In der Weboberfläche steht WAHA auf *Disconnected*.
**Ursachen & Lösungen:**
1. **Sitzung abgelaufen:**
WhatsApp verlangt, dass das verknüpfte Hauptgerät mindestens alle 14 Tage online ist.
Öffne WhatsApp auf dem Handy und prüfe, ob der gekoppelte Web-Client aktiv bleibt.
Scanne bei Bedarf den QR-Code in der WAHA-Weboberfläche erneut.
2. **Container neu gestartet ohne persistente Daten:**
Wenn das Volume `/opt/waha/data` nicht dauerhaft eingebunden ist, verliert WAHA beim Neustart seine Sitzung.
Prüfe in Proxmox oder in der `pct config`, ob das Datenverzeichnis korrekt gemountet ist.
3. **Proxy oder Zertifikatfehler:**
Wenn WAHA über den Nginx Proxy Manager eingebunden ist, prüfe das Zertifikat und die Weiterleitung.
Fehlerhafte HTTPS-Konfigurationen führen oft zu 502-Antworten in n8n.
👉 **Screenshot geeignet:** WAHA-Weboberfläche mit Status *Disconnected* und QR-Code-Anzeige
### n8n sendet keine Nachricht
**Symptom:**
Der Workflow läuft durch, aber in WhatsApp erscheint keine Nachricht.
**Ursachen & Lösungen:**
1. **Falsche Chat-ID:**
Prüfe im WAHA-Log oder in der API-Ausgabe, ob die Chat-ID korrekt ist (`@c.us` für Einzelchat, `@g.us` für Gruppen).
Bereits ein fehlendes Zeichen führt zu HTTP 400-Fehlern.
2. **WAHA nicht erreichbar:**
Wenn WAHA über HTTPS läuft, aber das Zertifikat abgelaufen oder falsch ausgestellt ist,
blockiert n8n den Request. Teste mit `curl -k https://waha.deinedomain.tld/api/status`.
3. **HTTP-Node nicht auf JSON gesetzt:**
Der Body-Type des HTTP-Requests muss `application/json` sein.
Andernfalls interpretiert WAHA die Daten als leer und sendet nichts.
👉 **Screenshot geeignet:** n8n-Log mit fehlgeschlagenem HTTP-Request und sichtbarem Fehlercode
### Twitch-Trigger reagiert nicht
**Symptom:**
Der Workflow startet nicht, obwohl der Stream online ist.
**Ursachen & Lösungen:**
1. **Node nicht installiert oder deaktiviert:**
Prüfe unter *Settings → Community Nodes*, ob der Twitch-Trigger aktiviert ist.
Falls nicht, installiere ihn wie im n8n-Kapitel beschrieben.
2. **OAuth abgelaufen:**
In den Node-Details steht „Invalid credentials“.
Öffne die Authentifizierung erneut, melde dich mit Twitch an und speichere die Verbindung.
3. **Rate-Limit erreicht:**
Die Twitch-API erlaubt nur eine begrenzte Anzahl an Abfragen pro Stunde.
Wenn du mehrere Workflows mit demselben Account nutzt, plane die Trigger-Intervalle zeitversetzt.
👉 **Screenshot geeignet:** n8n-Node „Twitch Trigger“ mit sichtbarer Fehlermeldung „Invalid credentials“
### Allgemeine Stabilität
**Empfehlungen:**
1. **WAHA regelmäßig neu starten:**
Ein Neustart einmal pro Woche verhindert Sitzungsfehler durch veraltete Tokens.
```
systemctl restart waha
```
2. **Logs aktiv prüfen:**
WAHA protokolliert alle API-Zugriffe in `/opt/waha/logs/`.
Prüfe dort auf wiederholte 401- oder 403-Fehler sie weisen auf Authentifizierungsprobleme hin.
3. **Ressourcen beobachten:**
Wenn die OCR- oder KI-Komponenten parallel laufen, kann die CPU-Last ansteigen.
Überwache den Container mit `htop` oder Netdata und erhöhe bei Bedarf die CPU-Zuteilung.
👉 **Screenshot geeignet:** Terminalausgabe von `systemctl status waha` mit aktivem Dienststatus
> [!TIP]
> Halte die Containerumgebung möglichst statisch.
> WAHA arbeitet am zuverlässigsten, wenn IP, Hostname und Mountpfade unverändert bleiben.
> Vermeide Neustarts während laufender Streams oder Workflows.
### Fehlermeldung „Invalid session“ oder „pairing required“
**Symptom:**
WAHA meldet „Invalid session“ oder zeigt in der Weboberfläche erneut den QR-Code an.
**Ursachen & Lösungen:**
1. **Sitzung durch WhatsApp zurückgesetzt:**
Wenn du dein WhatsApp-Konto auf dem Smartphone abmeldest oder neu installierst, werden alle aktiven Web-Sitzungen ungültig.
Lösung: In WAHA auf *Reconnect* klicken und den QR-Code erneut mit WhatsApp scannen.
2. **Gerätewechsel oder Backup-Wiederherstellung:**
Nach einem Gerätewechsel (z. B. neues Smartphone) verliert WhatsApp alle Web-Verbindungen.
In diesem Fall muss die Kopplung in WAHA komplett neu hergestellt werden.
3. **Zugriff über mehrere Instanzen:**
Wenn du dasselbe Konto parallel in zwei WAHA-Instanzen nutzt, kommt es zu Session-Konflikten.
Nur eine aktive Verbindung pro Konto ist möglich.
👉 **Screenshot geeignet:** WAHA-Weboberfläche mit QR-Code und Meldung *pairing required*
### API-Antworten mit Fehlercode 401 oder 403
**Symptom:**
Der HTTP-Request in n8n schlägt fehl, und im Log erscheint `401 Unauthorized` oder `403 Forbidden`.
**Ursachen & Lösungen:**
1. **Falscher API-Endpunkt:**
Achte auf die exakte URL. Sie muss mit `/api/sendText` enden und per HTTPS erreichbar sein.
Tipp: `curl -k https://waha.deinedomain.tld/api/status` sollte eine JSON-Antwort liefern.
2. **Authentifizierung deaktiviert:**
Wenn du in WAHA Authentifizierung aktiviert hast, muss n8n im Header den Token mitsenden:
```
Authorization: Bearer <DEIN_API_TOKEN>
```
Den Token legst du in WAHA unter *Settings → API Tokens* an.
3. **CORS- oder Proxy-Fehler:**
Wenn n8n über HTTPS läuft, WAHA aber per HTTP, blockiert der Browser Cross-Origin-Requests.
Beide Systeme sollten über HTTPS erreichbar sein, idealerweise mit gültigen Zertifikaten.
👉 **Screenshot geeignet:** n8n-HTTP-Node mit sichtbarem Fehlercode 401 im Ausgabefeld
### Wiederholte Timeouts oder keine Antwort
**Symptom:**
Der Request läuft durch, aber n8n zeigt „timeout after 60000ms“.
**Ursachen & Lösungen:**
1. **Container ausgelastet:**
Wenn mehrere OCR- oder KI-Container gleichzeitig laufen, kann der WAHA-Prozess blockiert werden.
Beobachte mit `htop`, ob CPU oder RAM ausgelastet sind.
2. **DNS-Auflösung fehlerhaft:**
n8n erreicht `waha.deinedomain.tld` nicht, weil Pi-hole oder Unbound Anfragen blockieren.
Teste innerhalb des n8n-Containers:
```
curl -v https://waha.deinedomain.tld/api/status
```
3. **Zu kurze Timeout-Zeit:**
Setze im HTTP-Request-Node unter *Options → Timeout* einen höheren Wert, z. B. `120000` (2 Minuten).
👉 **Screenshot geeignet:** n8n-Log mit Timeout-Eintrag im Workflow-Ausführungsfenster
### Sicherheit und Schutz vor Sperrung
**Empfehlungen:**
1. **Keine Massenversendungen:**
WhatsApp erkennt zu häufige automatisierte Nachrichten als Spam.
Sende nur seltene, manuell ausgelöste oder durch Events getriggerte Nachrichten.
2. **Business-Konto verwenden:**
Für produktive Kommunikation empfiehlt sich ein **WhatsApp Business-Konto**,
da private Konten durch Automatisierung eher gesperrt werden können.
3. **Regelmäßige Backups:**
Sichere `/opt/waha/data` regelmäßig per Kopia oder rsync, damit Sitzungen und Logs erhalten bleiben.
4. **Trennung von Test- und Produktiv-Instanzen:**
Teste neue Workflows in einer separaten WAHA-Instanz, um dein Hauptkonto zu schützen.
👉 **Screenshot geeignet:** WAHA-Einstellungen mit aktivem WhatsApp-Business-Account
> [!TIP]
> Vermeide Intervall-Trigger mit hoher Frequenz.
> Eine Abfrage alle 10 15 Minuten genügt, um Stream- oder Statusänderungen zu erkennen, ohne die API zu überlasten.
### Logs und Fehlersuche im Detail
Wenn ein Workflow nicht wie erwartet funktioniert, liefern die Logs von WAHA und n8n meist alle nötigen Hinweise.
Durch gezieltes Prüfen lässt sich schnell feststellen, ob der Fehler auf der Seite von WhatsApp, WAHA oder n8n liegt.
**WAHA-Logs prüfen:**
```bash
tail -f /opt/waha/logs/app.log
```
Die Datei enthält alle eingehenden und ausgehenden Requests.
Achte auf Einträge mit `"sendText"` und `"statusCode"`.
Ein erfolgreicher Versand endet mit `"statusCode":200`.
> [!TIP]
> Wenn keine Einträge erscheinen, erreicht der Request aus n8n den WAHA-Container gar nicht.
> In diesem Fall stimmt entweder die URL nicht oder der Reverse Proxy blockiert die Verbindung.
**n8n-Logs prüfen:**
```bash
docker logs -f n8n
```
oder bei LXC-Installation:
```bash
journalctl -u n8n -f
```
Hier sind insbesondere Fehlermeldungen wie `ECONNRESET`, `ENOTFOUND` oder `ETIMEDOUT` relevant sie deuten auf Verbindungsprobleme hin.
👉 **Screenshot geeignet:** Terminal mit `tail -f /opt/waha/logs/app.log` und sichtbarer API-Antwort `statusCode:200`
### Neustart und Wiederherstellung
Falls WAHA nicht mehr reagiert oder der Status dauerhaft *Disconnected* bleibt, kann ein sauberer Neustart helfen.
Dabei darf das Sitzungs-Volume **nicht** gelöscht werden, sonst ist die Kopplung verloren.
**Empfohlener Neustart:**
```bash
systemctl stop waha
sleep 3
systemctl start waha
```
**Container neu starten (Proxmox):**
```bash
pct restart <CTID>
```
Wenn nach dem Neustart wieder der QR-Code angezeigt wird, war das Volume `/opt/waha/data` nicht persistent eingebunden.
Passe die Mounts im Proxmox-GUI oder in der `pct config` an, um dauerhafte Speicherung sicherzustellen.
👉 **Screenshot geeignet:** Proxmox-Konsole mit `pct restart` und erfolgreichem Reconnect in der WAHA-Oberfläche
### Netzwerk- und Portprobleme
**Symptom:**
n8n kann WAHA über `https://waha.deinedomain.tld` nicht erreichen.
**Lösungsansätze:**
1. **Proxy-Fehler:**
Prüfe im Nginx Proxy Manager, ob Port 3000 (Standardport von WAHA) korrekt weitergeleitet wird.
Bei aktivem SSL muss „Websockets Support“ eingeschaltet sein.
2. **Firewall:**
Stelle sicher, dass interne Firewalls oder iptables-Regeln den Zugriff zwischen den Containern erlauben.
3. **DNS-Auflösung:**
Wenn interne Domains verwendet werden, kontrolliere Pi-hole oder Unbound.
Teste den Hostname direkt aus dem n8n-Container:
```bash
ping waha.deinedomain.tld
```
👉 **Screenshot geeignet:** Nginx Proxy Manager-Proxy-Host mit aktivierter Websocket-Option
### Fehlerhafte API-Aufrufe erkennen
Wenn die API in WAHA falsche oder unvollständige Requests erhält, werden sie im Log mit `"statusCode":400` oder `"Invalid parameters"` protokolliert.
**Typische Ursachen:**
- Der Body enthält ungültige JSON-Syntax.
- `chatId` oder `text` fehlen.
- Der Content-Type wurde nicht korrekt auf `application/json` gesetzt.
**Prüfung mit curl:**
```bash
curl -X POST https://waha.deinedomain.tld/api/sendText \
-H "Content-Type: application/json" \
-d '{"chatId": "49XXXXXXXXXXX@c.us", "text": "Testnachricht"}'
```
Wenn die Antwort `{ "success": true }` lautet, funktioniert die API korrekt.
👉 **Screenshot geeignet:** Terminalausgabe erfolgreicher curl-Test mit `success: true`
### Typische Ursachen für instabile Automatisierungen
1. **Nicht persistente Tokens:**
Wenn n8n beim Neustart die OAuth-Verbindungen zu Twitch oder WAHA verliert, speichere sie in Vaultwarden und binde sie als Umgebungsvariablen ein.
2. **Zeitliche Überschneidung:**
Läuft der Workflow zu oft (z. B. durch fehlerhaften Twitch-Trigger), sperrt Twitch API-Requests temporär.
3. **Nicht synchronisierte Systemzeiten:**
Prüfe, ob beide LXC-Container (n8n und WAHA) dieselbe Zeitzone und NTP-Synchronisation verwenden:
```bash
timedatectl
```
👉 **Screenshot geeignet:** Ausgabe `timedatectl` mit synchronisierter Systemzeit
> [!TIP]
> Wenn du WAHA und n8n auf unterschiedlichen Hosts betreibst, verwende nach Möglichkeit interne DNS-Namen statt öffentlicher Domains.
> Das vermeidet SSL-Handshake-Fehler und verkürzt Latenzzeiten bei automatisierten Workflows.
### Nachricht kommt an, aber ohne Text oder mit fehlerhaften Sonderzeichen
**Symptom:**
Die WhatsApp-Nachricht wird gesendet, erscheint auf dem Empfängergerät aber leer oder enthält fehlerhafte Umlaute und Sonderzeichen.
**Ursachen & Lösungen:**
1. **Zeichensatzfehler im Request:**
n8n sendet den Text standardmäßig im UTF-8-Format, aber wenn Sonderzeichen nicht richtig escaped werden, verwirft WhatsApp sie teilweise.
Achte darauf, dass das Textfeld im HTTP-Request-Node korrekt maskiert ist:
```bash
{"text": "Hallo! Vielen Dank für deine Nachricht. 😊"}
```
und nicht als einfacher String ohne Anführungszeichen.
2. **Markdown- oder Steuerzeichen im Text:**
Entferne Zeilenumbrüche, Anführungszeichen oder unsichtbare Formatierungszeichen, die aus Copy-&-Paste stammen können.
3. **Problem bei Emojis oder Symbolen:**
Wenn Emojis nicht dargestellt werden, prüfe, ob dein Container locale-Unterstützung hat:
```bash
locale
```
Sollte `LANG` oder `UTF-8` fehlen, installiere sie nach:
```bash
apt install locales && dpkg-reconfigure locales
```
👉 **Screenshot geeignet:** WhatsApp-Chat mit empfangener Nachricht ohne Textinhalt und markiertem fehlerhaften Emoji
### Workflow ausgeführt, aber als „Fehlgeschlagen“ markiert
**Symptom:**
Die Nachricht wurde korrekt versendet, n8n zeigt in der Ausführung jedoch den Status *Failed* oder *Error* an.
**Ursachen & Lösungen:**
1. **WAHA liefert keine korrekte JSON-Antwort:**
Einige WAHA-Versionen antworten nur mit `true` oder leerem Body, was n8n als Fehler interpretiert.
Setze im HTTP-Request-Node unter *Options → Ignore Response Code* den Haken auf **true**,
damit der Workflow auch bei leeren Antworten als erfolgreich gilt.
2. **Falscher Erfolgscode:**
Manche Instanzen geben `201` oder `204` zurück statt `200`.
Passe in den Node-Einstellungen unter *Continue On Fail* die Behandlung entsprechend an.
3. **n8n-Retry aktiv:**
Wenn der Node mehrfach neu ausgeführt wird, kann das Logging einen Fehlerstatus behalten,
obwohl die Nachricht bereits verschickt wurde.
👉 **Screenshot geeignet:** n8n-Execution-Log mit Status *Failed* trotz erfolgreich gesendeter WhatsApp-Nachricht
> [!TIP]
> Prüfe in solchen Fällen immer zuerst den tatsächlichen Chatverlauf.
> Wenn die Nachricht angekommen ist, kann der „Fehler“ meist ignoriert werden oder durch Anpassung der Response-Einstellungen dauerhaft vermieden werden.
---
## Ergebnis
Nach Abschluss dieses Kapitels läuft in deinem UCC ein vollständig funktionsfähiges System für automatisierte WhatsApp-Nachrichten.
WAHA übernimmt die Verbindung zu WhatsApp, während n8n die Logik und Steuerung bereitstellt.
Beide Komponenten sind fest in deine bestehende Infrastruktur integriert und arbeiten stabil über den Nginx Proxy Manager.
Dein aktuelles Setup umfasst:
- **WAHA-Container** simuliert das WhatsApp-Webinterface und stellt eine lokale API bereit
- **n8n-Container** erstellt und steuert Workflows, die Nachrichten automatisch auslösen
- **Nginx Proxy Manager** sorgt für sicheren HTTPS-Zugriff
- **Persistente Datenspeicherung** unter `/opt/waha/data` Sitzungen bleiben erhalten
- **Funktionierende Integration** mit Twitch (Community Node) als Beispiel für Event-gesteuerte Automatisierung
👉 **Screenshot geeignet:** n8n-Dashboard mit aktivem Workflow und WAHA-Container im Proxmox-Interface
Damit hast du eine stabile Grundlage geschaffen, um WhatsApp in deine eigene Automatisierungsumgebung einzubinden ohne Cloud-Abhängigkeit oder externe Dienste.
WAHA erlaubt dir, Nachrichten direkt über deine Infrastruktur zu senden und zu empfangen, vollständig unter eigener Kontrolle.
> [!TIP]
> Im Premium-Kapitel bauen wir dieses System zu einem interaktiven Beispiel aus:
> Ein smarter WhatsApp-Bot reagiert automatisch auf Zuschauerfragen wie
> *„Wann ist der nächste Stream?“* oder *„Wie kann ich mitmachen?“*
> Dafür kombinieren wir WAHA, n8n und einen KI-Agenten zu einem intelligenten Kommunikations-Workflow,
> der deinen Stream-Betrieb automatisiert unterstützt.