Komunikační brána MenuBot

SMS běží přes SMSGate Android. Nejnovější požadavek mění směr WhatsAppu: připravit oficiální Meta Cloud API pro vlastní účet s co nejmenším schvalováním. Meta účet, číslo ani token nejsou připojené; aktivní číslo v WhatsApp aplikaci se nesmí převést bez výslovného rozhodnutí. Hovory jsou odložené.

Orientační přímé ceny pro české číslo (+420), stav 29. 10. 2026

  • SMSGate Android app/API: zdarma; SMS se řídí tarifem operátora na SIM.
  • WhatsApp Business App: zdarma pro ruční práci; nemá serverové Cloud API ani automatický webhook.
  • Meta Cloud service odpovědi: prvních 1 000 doručených zpráv měsíčně na jedno firemní číslo zdarma, potom €0,0175 za zprávu.
  • Meta Cloud utility a authentication šablony: €0,0175 za doručenou zprávu.
  • Meta Cloud marketing šablony: €0,0712 za doručenou zprávu.
  • Příchozí zprávy uživatel→firma jsou zdarma. Meta účtuje jen doručené zprávy firmy; sazby se mohou měnit a existují zvláštní bezplatná okna.

Sazby Meta jsou k 1. 10. 2026 pro Rest of Central & Eastern Europe. Bezplatná aplikace WhatsApp Business není automatická alternativa k Cloud API. Neoficiální automatizaci WhatsApp Web nepoužívat.

Další kroky – přesné pořadí při návratu k práci

A. Serverové kroky bez telefonu – nic neposílají

  1. **Zpřístupnit aktuální dokumentaci.** Nejnovější úpravy `mbsmd.md` a `api-manual.md` jsou zatím v pracovním stromu; po synchronizaci ověřit veřejný index s novým cache-bust parametrem. Před API testem porovnat i nasazení `api.php`, `sdk/php/SmsGatewayClient.php`, `../app/api/API-bridge.php` a `../app/lib/api/API-sms-inbound.php`. Synchronizovat jen soubory, jejichž obsah se liší. Migrace SMS 001/002 i tabulka app inboxu už existují; žádnou z nich znovu nespouštět.
  2. **Ověřit API bez SMS.** Po synchronizaci spustit PHP lint změněných souborů. Vytvořit jeden testovací API klíč, uložit ho pouze do souboru přístupného rootovi a ověřit autorizované `GET ?op=status` a `GET ?op=inbound&channel=sms`. Tělo odpovědi s čísly/texty ani klíč neposílat do chatu. Tento test nic neodesílá a lze ho udělat před nákupem SIM.
  3. **Dokončit SMS push receiver.** App inbox tabulka je už potvrzená (`table_count=1`, `column_count=10`); DDL neopakovat. Do chráněné konfigurace doplnit `inbound_webhook_url=https://app.menubot.cz/api/?bridge=sms-inbound` a nový náhodný `inbound_webhook_signing_key`, stejný pro odesílatele i receiver. Ověřit pouze přítomnost hodnot a spustit `webhook-worker.php --check`. GET receiveru má vracet 405; podepsaný POST otestovat až jako jeden jasně označený syntetický event, bez SMS.

B. Až bude připravený Android telefon a SIM – SMS

  1. **Zkontrolovat číslo před aktivací.** Ověřit, že SIM přijme běžné SMS i hovory a má datové připojení. Pro zamýšlené přímé WhatsApp Cloud API nepřihlašovat toto číslo do WhatsApp Messenger ani Business App. Pokud je číslo už ve WhatsApp registrované, nic nemazat ani nemigrovat; zastavit se a použít jiné číslo, nebo zvlášť řešit složitější Coexistence.
  2. **Připravit telefon jako SMS bránu.** Vložit SIM, nainstalovat oficiální SMSGate Android z důvěryhodného zdroje, přihlásit telefon k internetu, povolit potřebná SMS/telefonní oprávnění a vypnout uspávání aplikace na pozadí. Neměnit firewall ani jiné služby serveru.
  3. **Nastavit SMSGate na serveru.** Do `/etc/menubot-sms/config.php` přidat `smsgate_username`, `smsgate_password`, `smsgate_webhook_signing_key` a `smsgate_webhook_url=https://www.menubot.cz/sub/sms/webhook.php`. Signing key musí odpovídat nastavení webhooku v SMSGate. Zálohu configu chránit; hodnoty klíčů nikdy nevypisovat ani neposílat.
  4. **Nejdřív jen kontroly.** Po ověření konfigurace spustit `worker.php --check`, `register-webhooks.php --check` a `webhook-worker.php --check`. Zkontrolovat cílovou HTTPS adresu i podpis. Teprve pokud výstup odpovídá očekávání, spustit samostatně `register-webhooks.php --register` a read-only kontrolou ověřit registraci událostí.
  5. **Jeden SMS test.** Po výslovném potvrzení poslat jednu SMS pouze na vlastní číslo, odpovědět z telefonu a ověřit doručení, webhook, stav v DB a dostupnost přes polling/push. Žádné zákaznické číslo, hromadný test ani opakování nejasně dokončeného požadavku.

C. WhatsApp Cloud API – odděleně od WhatsApp aplikace

  1. **Nejdřív Meta testovací číslo.** V Meta Developer Dashboardu založit vlastní aplikaci „Connect with customers through WhatsApp“, vlastní Business Portfolio/WABA a použít testovací číslo. Aplikaci používat jen pod vlastním účtem/rolí; nezakládat Tech Provider ani Embedded Signup. Pokud Meta zobrazí žádost o dokumenty nebo App Review, zastavit se před odesláním žádosti a ověřit konkrétní požadavek.
  2. **Až po úspěšném testu produkční číslo.** Použít dedikované číslo, které není registrované ve WhatsApp; ověřit ho SMS nebo hovorem v Meta Dashboardu. Stejná SIM může zůstat v telefonu pro SMSGate, ale WhatsApp zprávy pak obsluhuje Cloud API, nikoli aplikace v telefonu. Existující aktivní WhatsApp číslo nemigrovat.
  3. **Zabezpečit připojení serveru.** V Meta vytvořit System User token, přiřadit vlastní WABA/aplikaci a potřebná oprávnění. Do chráněného configu přidat `meta_whatsapp_access_token`, `meta_whatsapp_phone_number_id`, aktuální `meta_graph_api_version`, `meta_whatsapp_app_secret` a `meta_whatsapp_verify_token`. Nastavit webhook `https://www.menubot.cz/sub/sms/whatsapp-webhook.php`, ověřit challenge a odběr `messages`. Ověřit jen přítomnost configu a spustit `whatsapp-worker.php --check`; běžný worker zatím nespouštět.
  4. **Jeden WhatsApp test.** Předem ověřit cenu a souhlas s případnou platební metodou; pro zprávu zahajující konverzaci může být potřeba schválená šablona. Potom poslat jednu testovací zprávu pouze na vlastní číslo, ověřit status/webhook/příchozí odpověď a vypnout testovacího klienta, pokud už není potřeba.

D. Teprve po úspěšných testech – pilot

  1. Ověřit zálohu/obnovu, idempotenci, deduplikaci, retenční pravidla a způsob zastavení pouze SMS/WhatsApp workeru. Sledovat nízký pilotní provoz alespoň 24 hodin. Timer/cron ani zvýšení limitu nenastavovat, dokud nejsou schválené cena, frekvence, limity a návrat.

Bezpečnostní hranice

  • Přiložený plný instalátor je určen pro nový prázdný server; na tomto víceúčelovém VPS se nesmí spouštět.
  • Neměnit existující weby, služby, databáze, globální API, firewall ani časovače kvůli SMS.
  • Nepouštět aktualizace balíčků, restart ani změnu konfigurace jako součást auditu.
  • worker.php, whatsapp-worker.php i webhook-worker.php jsou CLI-only; běžné spuštění může odeslat SMS/WhatsApp nebo zavolat nakonfigurovaný webhook. Pouze --check nic neposílá.
  • Při další práci přes SSH postupovat po jednom příkazu, počkat na výstup a teprve potom pokračovat. Klíče, hesla, tokeny ani těla zpráv neposílat do chatu.
  • WhatsApp worker má pilotní limit nejvýše pěti pokusů za klouzavou hodinu a jedno předání na spuštění; zvýšení limitu vyžaduje samostatné schválení.
  • Limit pěti pokusů za hodinu není cenový limit Meta; šablony mohou být placené od prvního doručení a 1 000 bezplatných service odpovědí není neomezené.
  • Po nejednoznačném timeoutu se SMS ani WhatsApp neposílá znovu naslepo; stav unknown čeká na webhook/ověření.
  • SMSGate Android aplikace je pouze SMS brána; WhatsApp automatizaci přes neoficiální WhatsApp Web/WAHA/Baileys nepoužívat.
  • Čísla a texty SMS jsou citlivé údaje; plán uchování a ochranu záloh vyřešit před ostrým provozem.

Aktuální stav

  • Produkční migrace 001 a 002 jsou potvrzené: verze `1,2`, celkem 12 tabulek, pět nových tabulek a čtyři doplněné sloupce.
  • Produkční SMS základ je potvrzen uživatelskými výstupy: migrace 001, šest aplikačních tabulek, PHP spojení pod www-data, runtime práva bez DELETE a neautorizovaný API GET s odpovědí 401. Po migraci 002 uživatel znovu potvrdil pouze INSERT, SELECT a UPDATE. Autorizovaný klient ani živá SMS ověřené nejsou.
  • App inbox tabulka je už vytvořená a readback potvrdil `table_count=1`, `column_count=10`; SQL DDL znovu nespouštět. Receiver GET vrátil očekávaný 405, ale podepsaný POST, callback konfigurace a skutečné doručení ještě ověřené nejsou.
  • Cache-bust kontrola 29. 10. potvrdila tehdejší veřejný index a API manuál. Nejnovější úpravy MBSMD/manuálu jsou zatím pouze v pracovním stromu; po synchronizaci je nutný nový veřejný readback.
  • Dne 29. 10. ve 23:29 uživatel spustil SSH fázi A jako root: všechny uvedené soubory byly přítomné, PHP lint prošel, před migrací 002 bylo 7 tabulek a runtime práva byla INSERT/SELECT/UPDATE; config má root:www-data 640.
  • Root preflight ukázal, že SMSGate, app callback i Meta klíče chybí. Push pro příchozí SMS zůstává zvolený; cílová URL je `https://app.menubot.cz/api/?bridge=sms-inbound`. Polling `GET ?op=inbound` zůstává bezpečná alternativa.
  • Produkční SMS/WhatsApp workery a původní API soubory byly nalezené a PHP lint prošel. Nový polling endpoint `GET ?op=inbound`, SDK a HMAC receiver prošly lokálním lintem/testy; shoda těchto posledních verzí s produkcí a autorizované API čtení zatím potvrzené nejsou.
  • Lokálně prošel PHP lint všech SMS souborů, izolované podpisové/konfigurační/SDK testy a vykreslení indexu i manuálu. Produkční DB transakce, Meta/callback připojení a živé zprávy testované nejsou.
  • SMSGate Cloud údaje, registrace webhooků, telefon/SIM a živá SMS zatím nejsou ověřené. Aktuálním cílem je přímé Meta Cloud API pro vlastní účet; Meta app/WABA/číslo/tokeny/webhook ani test zprávy nejsou nastavené. Dřívější ruční WhatsApp Business App volba je pro serverové posílání nahrazená.
  • Žádný normální worker, testovací zpráva, timer/cron, PHP-FPM restart, firewall ani nový port nebyl spuštěn/nastaven. Zálohu mimo VPS a obnovu do oddělené DB uživatel potvrdil.

Audit a dosavadní ověření

  • Ověřen aktivní víceúčelový server; kapacita při jednom měření nevypadala kriticky, ale měření není garance dlouhodobé rezervy.
  • Syntaxe Nginx a PHP-FPM prošla. Read-only MariaDB preflight 2026-10-29 v 14:26 potvrdil bind na loopbacku, port 3306 a volný název schématu i aplikačního účtu.
  • Dne 2026-10-29 ve 14:30 uživatel vytvořil nové prázdné SMS schéma; readback potvrdil utf8mb4 a utf8mb4_unicode_ci. Existující schémata ani služby nebyly měněny.
  • Konfigurace je uložena mimo webroot a PHP test pod www-data vrátil PHP_DB_CONNECTION_OK. Dne 2026-10-29 v 19:46 uživatel odebral DELETE; read-only kontrola oprávnění potvrdila pouze INSERT, SELECT a UPDATE.
  • Hetzner Firewall se zobrazuje jako Fully applied k cílovému serveru. Pravidla nebyla měněna; přesné síťové podrobnosti nejsou součástí veřejného přehledu.
  • Byly zjištěny nevyřešené provozní odchylky. V rámci SMS se nemění.
  • Uživatel potvrdil, že databázová záloha je mimo VPS a obnova do oddělené DB byla ověřena.
  • Read-only kontrola práv po migraci 002 potvrdila pouze `INSERT`, `SELECT` a `UPDATE`.

Hotovo – doložený stav

  • Prošel jsem dodaný postup a oddělil SMS MVP od WhatsAppu, hovorů a AI.
  • První SSH audit proběhl pouze pro čtení; syntaktické kontroly Nginx a PHP-FPM prošly.
  • Firewall je potvrzen jako plně aplikovaný na server z SSH auditu.
  • Read-only databázový preflight potvrdil volný název schématu i aplikačního účtu.
  • Nové SMS schéma bylo vytvořeno a charset/collation ověřeny.
  • Migrace 001 vytvořila všech šest aplikačních tabulek; bezpečný GET bez klíče potvrdil odpověď 401 a žádná SMS nebyla odeslána.
  • Samostatný databázový účet a chráněný konfigurační soubor byly vytvořeny; PHP-FPM uživatel má k souboru čtecí přístup, DB spojení prošlo read-only testem a nadbytečné právo DELETE bylo odebráno.
  • Cache-bust kontrola 29. 10. potvrdila tehdejší veřejný index a API manuál; webové endpointy odpovídaly očekávaně. Nové lokální změny dokumentace z 30. 10. ještě vyžadují synchronizaci a readback.
  • Uživatelův root preflight potvrdil přítomnost a čistý PHP lint všech uvedených souborů. Následně uživatel spustil migraci 002; readback potvrdil verze 1,2, 12 tabulek, pět nových tabulek a čtyři sloupce.
  • Produkční webroot obsahuje SMS/WhatsApp API, Meta webhook a workery; původní soubory prošly PHP lintem. Nejnovější polling API/SDK/app receiver změny je nutné před autorizovaným testem porovnat a případně synchronizovat. Normální CLI workery ani živé zprávy nejsou spuštěné.
  • Všechny lokální PHP soubory prošly php -l; izolované testy podpisů, callback konfigurace, SDK pojistek, bind parametrů a renderu indexu/manuálu prošly.
  • Oficiální SMSGate dokumentace byla ověřena pro JWT scopes, odesílání a webhooky včetně podpisu i počtu částí zprávy.
  • Zálohu databáze uživatel hlásí jako provedenou; žádná SMS ani změna produkčních služeb nebyla provedena.
  • Migrace 002 již na produkci proběhla; Meta Cloud HTTP klient, WhatsApp API fronta/stavy, source_system a trvalé podepsané webhook doručení jsou publikované. Konfigurace a provozní workery čekají.
  • Každý API klient má mít WhatsApp vypnutý jako výchozí stav; povolit pouze konkrétnímu testovanému klientovi. Volný text se řídí 24hodinovým zákaznickým oknem, mimo něj se pro zahájení konverzace používá schválená šablona.

Aktualizováno

Aktualizace: 30. 10. 2026 – migrace SMS 002, post-migrační granty, obnova zálohy a app inbox tabulka jsou potvrzené. App receiver prošel lokálním lintem/HMAC testy; produkční GET vrátil očekávaný 405. App DB readback potvrdil `table_count=1`, `column_count=10`. Callback config, podepsaný POST, API klíč/read test, SMSGate a Meta konfigurace stále čekají. Poslední dokumentační úpravy čekají na synchronizaci na web.