Docs: AGENTS.md naar wuzapi-architectuur (1 sessie + multiplexer, poorten)

This commit is contained in:
Eddy de Vink 2026-10-11 22:52:13 +02:00
commit 9aea446bec

View file

@ -2,6 +2,12 @@
## 🚨 VERPLICHT: bridgestore is GEEN waarheid over bezorging ## 🚨 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 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" 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 (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 | | 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) | | **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) | | **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. | | ~~3000~~ | Forgejo | systemd service | **NIET onze service!** Niet aanraken. |
### dienst-bot ### dienst-bot
@ -82,51 +91,66 @@ ssh aiaiaiaiagent@nextcloud "journalctl -u dienst-bot --since today"
ssh aiaiaiaiagent@nextcloud "journalctl -u telegram-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 | | Wat | Waarde |
|-----|--------| |-----|--------|
| Docker container | `wwebjs-api` | | Systemd service | `wuzapi.service` |
| Image | `wwebjs-api-api` | | URL | `http://127.0.0.1:8082` |
| URL | `http://192.168.5.252:3001` | | Binary | `/usr/local/bin/wuzapi` (SELinux `bin_t`) |
| Sessie dienst-bot | `EdGpt` | | Datadir | `/home/aiaiaiaiagent/wuzapi/` (.env + SQLite `dbdata/`) |
| Sessie persoonlijk | `Eddy` | | Sessie | `EdGpt` (user id `09efd1be…`, een sessie voor heel nummer 31616173970) |
| Webhook dienst-bot | `http://192.168.5.252:3002/webhook` | | User token | `EdGpt-BOhLAsGkIfVZnKVi` (vault) |
| Webhook aankondigingen | `http://192.168.5.252:3003/webhook` (Eddy-sessie, niet dit project) | | 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 ### Multiplexer (`src/multiplexer.js`, systemd `wuzapi-multiplexer.service`)
ssh aiaiaiaiagent@nextcloud
docker ps --filter "name=wwebjs" # status Ontvangt de wuzapi-webhook op :3007 en stuurt per chat-groep door:
docker restart wwebjs-api # herstarten
docker logs wwebjs-api --tail 30 # logs | Chat-groep | Naar |
``` |---|---|
| `120363407613652082@g.us` (Dienst opvragen) | dienst-bot :3002 |
| `120363429978048879@g.us` (Anonieme aankondigingen) | EBS-MerPlus :3006 |
### Sessie status ### Sessie status
```bash ```bash
curl http://192.168.5.252:3001/session/status/EdGpt curl http://127.0.0.1:8082/session/status -H "Token: $TOKEN"
# → {"success":true,"state":"CONNECTED","message":"session_connected"} # → {"code":200,"data":{"LoggedIn":true,"Connected":true},...}
``` ```
## Wekelijkse container restart ### Wuzapi-commando's
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` |
```bash ```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 ## Release-proces
1. Code wijzigen lokaal in `/Users/eddy/src/dienst_echo_whatsappgroep/` 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 ```bash
ssh aiaiaiaiagent@nextcloud "sudo systemctl restart dienst-bot" ssh aiaiaiaiagent@nextcloud "sudo systemctl restart dienst-bot"
ssh aiaiaiaiagent@nextcloud "sudo systemctl restart telegram-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: 5. Logs checken:
```bash ```bash
ssh aiaiaiaiagent@nextcloud "journalctl -u dienst-bot --since '5 minutes ago'" 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 `.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) ## Resilience maatregelen (juni 2026)
Deze maatregelen zijn toegevoegd na een incident met HTTP 500 van de wwebjs-api en een EADDRINUSE restart-loop. Deze maatregelen zijn toegevoegd na een incident met HTTP 500 van de wwebjs-api en een EADDRINUSE restart-loop.