From 9aea446beca50d601f1f3d8c091e806e303b9179 Mon Sep 17 00:00:00 2001 From: Eddy de Vink Date: Sun, 11 Oct 2026 22:52:13 +0200 Subject: [PATCH] Docs: AGENTS.md naar wuzapi-architectuur (1 sessie + multiplexer, poorten) --- AGENTS.md | 95 +++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 64 insertions(+), 31 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index cd1ca25..9a198db 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -2,6 +2,12 @@ ## 🚨 VERPLICHT: bridgestore is GEEN waarheid over bezorging +> Geldt ook hier (wuzapi-tijdperk): afhandeling/acks van de bridge zijn géén +> bezorgbewijs. Deze sectie beschrijft de bewezen wwebjs-fabricatie (historie, tot +> wuzapi-migratie 2026-10-11); de les blijft: alleen het apparaat van de ontvanger is +> waarheid. Bij wuzapi geldt: de `/chat/send/*`-respons `{"code":200}` bevestigt +> serverontvangst, niet zichtbaarheid op het doelapparaat. + De wwebjs-api **bridgestore is niet betrouwbaar** als bewijs dat een bericht bezorgd/gelezen is. Bevestigd 2026-09-24: een dienst-PNG werd 3× naar dezelfde ontvanger "verzonden" (success + message-ID), de store toonde 3 berichten **allemaal ack 3**, maar de ontvanger @@ -48,10 +54,13 @@ De bot draait op de **nextcloud** server (192.168.5.252) als **systemd service** | Poort | Service | Type | Beheer | |-------|---------|------|--------| -| **3001** | wwebjs-api | Docker container | WhatsApp bridge | +| **8082** | wuzapi | systemd service | WhatsApp bridge (whatsmeow, 1 sessie EdGpt) | +| **3007** | wuzapi-multiplexer | systemd service | Webhook router per chat-groep | | **3002** | dienst-bot | systemd service | Dienst opvragen bot (dit project) | -| **3003** | aankondigingen-webhook | systemd service | Losse webhook receiver (Eddy sessie) | +| **3003** | aankondigingen-webhook | systemd service | Losse webhook receiver (EBS-aankondigingen) | | **3004** | telegram-bot | systemd service | Telegram watchdog (dit project) | +| **3006** | ebs-merplus | systemd service | MerPlus→EBS aankondigingen doorstuurbot | +| ~~3001~~ | ~~wwebjs-api~~ | ~~Docker container~~ | **Vervangen door wuzapi (2026-10-11), container gestopt** | | ~~3000~~ | Forgejo | systemd service | **NIET onze service!** Niet aanraken. | ### dienst-bot @@ -82,51 +91,66 @@ ssh aiaiaiaiagent@nextcloud "journalctl -u dienst-bot --since today" ssh aiaiaiaiagent@nextcloud "journalctl -u telegram-bot --since today" ``` -## WhatsApp API (wwebjs-api) +## WhatsApp API (wuzapi) -De wwebjs-api draait als Docker container op nextcloud. +De WhatsApp-bridge is sinds **2026-10-11 wuzapi** (vroeger wwebjs-api op :3001, container +gestopt). wuzapi draait als systemd service op **:8082**. Volledige installatie/ +config/credentials staan in de vault ([[Wuzapi]] + [[Whatsapp rest-api]] historie). | Wat | Waarde | |-----|--------| -| Docker container | `wwebjs-api` | -| Image | `wwebjs-api-api` | -| URL | `http://192.168.5.252:3001` | -| Sessie dienst-bot | `EdGpt` | -| Sessie persoonlijk | `Eddy` | -| Webhook dienst-bot | `http://192.168.5.252:3002/webhook` | -| Webhook aankondigingen | `http://192.168.5.252:3003/webhook` (Eddy-sessie, niet dit project) | +| Systemd service | `wuzapi.service` | +| URL | `http://127.0.0.1:8082` | +| Binary | `/usr/local/bin/wuzapi` (SELinux `bin_t`) | +| Datadir | `/home/aiaiaiaiagent/wuzapi/` (.env + SQLite `dbdata/`) | +| Sessie | `EdGpt` (user id `09efd1be…`, een sessie voor heel nummer 31616173970) | +| User token | `EdGpt-BOhLAsGkIfVZnKVi` (vault) | +| Webhook | `http://127.0.0.1:3007/webhook` (multiplexer) | +| Events | Message | -### Docker commando's +> **1 sessie + multiplexer (besluit 2026-10-11):** wuzapi koppelt per user één +> whatsmeow-device. Twee users op hetzelfde nummer delen dezelfde `users.jid` en +> conflicts in `resolveDeviceStore` (events gingen willekeurig naar één van beide +> webhooks). Daarom: **1 sessie (EdGpt)** voor alle WhatsApp-verkeer van het nummer, en de +> **multiplexer** (:3007) routeert per chat-groep naar de juiste bot (zie hieronder). -```bash -ssh aiaiaiaiagent@nextcloud -docker ps --filter "name=wwebjs" # status -docker restart wwebjs-api # herstarten -docker logs wwebjs-api --tail 30 # logs -``` +### Multiplexer (`src/multiplexer.js`, systemd `wuzapi-multiplexer.service`) + +Ontvangt de wuzapi-webhook op :3007 en stuurt per chat-groep door: + +| Chat-groep | Naar | +|---|---| +| `120363407613652082@g.us` (Dienst opvragen) | dienst-bot :3002 | +| `120363429978048879@g.us` (Anonieme aankondigingen) | EBS-MerPlus :3006 | ### Sessie status ```bash -curl http://192.168.5.252:3001/session/status/EdGpt -# → {"success":true,"state":"CONNECTED","message":"session_connected"} +curl http://127.0.0.1:8082/session/status -H "Token: $TOKEN" +# → {"code":200,"data":{"LoggedIn":true,"Connected":true},...} ``` -## Wekelijkse container restart - -De wwebjs-api container wordt elke **zondag om 02:00** automatisch herstart om vastlopers te voorkomen. - -| Wat | Waarde | -|-----|--------| -| Timer | `docker-restart-wwebjs.timer` | -| Service | `docker-restart-wwebjs.service` | -| Commando | `docker restart wwebjs-api` | -| Volgende run | check: `systemctl list-timers --no-pager \| grep wwebjs` | +### Wuzapi-commando's ```bash -ssh aiaiaiaiagent@nextcloud "sudo systemctl list-timers --no-pager | grep wwebjs" +ssh aiaiaiaiagent@nextcloud +sudo -A systemctl status wuzapi # bridge status +sudo -A journalctl -u wuzapi --since today # logs +# Webhook-verzending zien: +sudo -A journalctl -u wuzapi | grep "Calling user webhook" +# Multiplexer routing (+ dienst-bot + MerPlus): +sudo -A journalctl -u wuzapi-multiplexer / -u dienst-bot / -u ebs-merplus --since today ``` +### wuzapi-API-knoppen (voor de bot) + +- Send text: `POST /chat/send/text` `{Phone, Body}` — header `Token:` (user token) +- Send image: `POST /chat/send/image` `{Phone, Image:"data:image/jpeg;base64,...", Caption?}` +- Send document: `POST /chat/send/document` `{Phone, Document, FileName, Caption?}` +- Mark read: `POST /chat/markread` `{Id:[...], Chat}` +- Admin (users/webhook-beheer): `Authorization:` header met admin-token (vault) +- Webhook-payload: `{type:"Message", event:{Info:{Chat:{User,Server}, Sender, IsFromMe, ID}, Message:{...}}, base64?, mimeType?, fileName?}` + ## Release-proces 1. Code wijzigen lokaal in `/Users/eddy/src/dienst_echo_whatsappgroep/` @@ -144,7 +168,10 @@ ssh aiaiaiaiagent@nextcloud "sudo systemctl list-timers --no-pager | grep wwebjs ```bash ssh aiaiaiaiagent@nextcloud "sudo systemctl restart dienst-bot" ssh aiaiaiaiagent@nextcloud "sudo systemctl restart telegram-bot" + ssh aiaiaiaiagent@nextcloud "sudo systemctl restart wuzapi-multiplexer" # als multiplexer.js wijzigde ``` + Voor EBS-MerPlus geldt dezelfde flow in zijn eigen repo (`~/whatsapp-scripts/EBS-MerPlus`, + service `ebs-merplus` :3006) — inclusive herstart. 5. Logs checken: ```bash ssh aiaiaiaiagent@nextcloud "journalctl -u dienst-bot --since '5 minutes ago'" @@ -155,6 +182,12 @@ ssh aiaiaiaiagent@nextcloud "sudo systemctl list-timers --no-pager | grep wwebjs De `.env` bevat alle instellingen (niet in git). Template staat in `.env.example`. +> **De secties hieronder (`Resilience maatregelen`, ack-tracking, RCA staged-ghost, +> Media-levering twee foutklassen, `dienst-media-test.js`) beschrijven de wwebjs-api- +> historie vóór de wuzapi-migratie van 2026-10-11.** Bewaard voor context/RCA; de +> huidige bridge is wuzapi (geen wwebjs-container meer). De staged-ghost-race en +> ack-fabricatie waren eigen aan de wwebjs-fork. + ## Resilience maatregelen (juni 2026) Deze maatregelen zijn toegevoegd na een incident met HTTP 500 van de wwebjs-api en een EADDRINUSE restart-loop.