log.initd.cz

Všechno co se mi nevejde na mastodonczech.cz/@bycx

2 followers

Live chat support appka

V pátek jsem o půlnoci dostal perfektní nápad. Mohl bych s AI zkusit vygenerovat live chat support appku. Takový ten widget v rohu stránky, na který když kliknete, tak si můžete psát s někým živým. Ve čtyři ráno jsem zjistil, že to byla opravdu hluboká králičí nora.

Řeč je o tomhle:

Widget

Kliknete na bublinku, dostanete chatovací okno. To je postavené na websocketech. Jeden konec má uživatel, druhý konec má prohlížeč, třetí konec appka v telefonu a všechny tyhle konce jsou propojené v backend službě sedící uprostřed. Ta přeposílá jak zprávy, tak stavy. Hrál jsem si občas s myšlenkou, že si to napíšu sám. To bylo ještě v době "před AI", ale je tam tolik detailů, že by to trvalo měsíce a nikdy se to nevrátilo.

Doba se posunula a tak jsem to zkusil. Nejsme totiž spokojení s existujícími komerčními ani open source chaty. Po několika letech se SmartSupp a Tawk.to mohu říct, že to jsou kvalitní služby a obzvláště Tawk.to mohu doporučit, protože fungoval slušně. Ďábel je samozřejmě v detailech.

Pro nás na Roští je kriticky důležitá jedna vlastnost a to notifikace. Když uživatel pošle první zprávu, není nic otravnějšího pro obě strany, než když podpora sedí u notebooku a nedozví se to.

Na SmartSupp se nám stávalo, že po probuzení notebooku se rozhraní ve webovém prohlížeči sice tvářilo připojené na backend ale nebylo, takže zprávy nechodily. Druhý problém byly notifikace na Androidu. Mám podezření, že si je řešili ve své režii a tak aplikace musela běžet stále na pozadí a udržovat TCP spojení na server. Pokud ji systém sestřelil, tak notifikace nepřišla. Zároveň nevíte, že se to stalo. Když appku otevřete a novou zprávu otestujete, tak všechno funguje.

Trochu otravné bylo, že ze strany podpory SmartSupp přišlo jen doporučení, že máme zakázat uspávání SmartSupp appky na telefonu a problém s prohlížečem se jim nestává a tak ho nemají jak vyřešit. Tím naše komunikace skončila. Důvěře nepomohla ani změna ceníku tak, že jsme najednou platili trojnásobek.

Tady doplním, že tohle je zkušenost cca dva až tři roky zpět a dnes může být všechno jinak.

Přešli jsme kvůli tomu na Tawk.to. Ten umí být i zadarmo, i když omezený a bez vašeho loga ve widgetu. Je to odladěná služba, hlavně v prohlížeči funguje spolehlivě. Android appka občas také nedoručí notifikaci a také je podezírám, že používají vlastní socket. Ale pokud funguje spolehlivě prohlížeč, tak to tolik nevadí.

Tawk má jiný problém a to bolestivé UX v rozhraní pro agenty. Obzvláště, pokud nevyužijete 80 % funkcí, které tam jsou, stejně jako my. Když nějakou službu používáte dva roky a doslova v ní každý den hledáte chat, který někdo otevřel a vy jste nestihli reagovat. Tawk má rozdělené aktivní chaty, ukončené konverzace a tickety. Konverzace s uživatelem pak proplouvá mezi těmito třemi stavy a nefunguje to úplně intuitivně.

Ale zpět k našemu novém chatu. Ten na Androidu řeší notifikace přes FCM, což znamená, že backend pošle notifikaci Googlu a ten ji doručí na telefon. Je to energeticky neefektivnější a zároveň nejspolehlivější cesta, jak notifikace na Androidu doručovat.

Rozhraní pro agenty na webu používá Push API a zároveň začne přehrávat velmi otravnou nahrávku "Help, Help, Help". Díky Push API se notifikace doručí i když není otevřený tab s chatem. Stačí mít spuštěný prohlížeč.

Push notifikace v prohlížeči

Backend nepoužívá žádné tickety, dokonce nemá implementovanou ani komunikaci přes email. Pokud uživatel pošle zprávu, vytvoří se konverzace a ta je vidět dokud ji agent neukončí. Pokud ji ukončí, uživatel o tom ví a pokud napíše novou zprávu, vytvoří se konverzace nová. Nestane se tak, že by někdo napsal a začne lov konverzace na třech různých místech.

Notifications

Takhle vypadá rozhraní pro agenty ve webovém prohlížeči:

SPA pro agenty

Tady je Android appka založená na frameworku Capacitor:

Android appka

Když se na to kouknu ekonomicky, tak ročně teď ušetříme necelých 5000 Kč za Tawk.to. Z SmartSupp bychom dávali cca 9000 Kč. Teď ale máme pod kontrolou nejdůležitější nástroj pro komunikaci se zákazníkem. Jsme schopni efektivně integrovat našeho vlastního AI bota a nejsme tlačení do služeb, které nevyužijeme. Příkladem je třeba nemožnost integrovat naši vlastní dokumentaci do Tawk.to, které nás nutilo vytvářet kopii v jejich vlastním nástroji.

Existující služby nutí vlastního AI bota. My si ale můžeme udělat jednoho na míru. Použít vhodný model, který nebude optimalizovaný na to, aby provozovatel ušetřil a můžeme ho vybavit vlastními nástroji a skilly. Ta optimalizace na cenu je vidět třeba v Jira, kde je propastný rozdíl mezi AI chatem přímo v Jiře a MCP Jira serverem třeba v Copilotu. Z té možnosti posunout tenhle projekt směrem, který potřebujeme, mám větší radost než z ušetřených pár tisíc ročně.

❝ 1

AI mi pomohla opravit správu DNS zón na Roští.cz

Asi už ani nemá smysl psát, že mi AI s něčím pomohla, protože její asistence je koloritem současného světa softwarového vývoje. Roští má spoustu míst, které by si zasloužily desítky hodin vývoje, ale zároveň nemá moc ekonomický smysl se do toho pouštět. AI tohle mění a tento týden to je podpora pro DNSSEC.

Na Roští.cz sice neregistrujeme domény, ale hostujeme DNS zóny. O ty se stará služba s generickým názvem dnsapi, na kterou se nesáhlo cca od roky 2020, kdy se její business logika odtrhla od administrace a začala éra makroservisní architektury.

To byl na jednu stranu dobrý krok, na druhou měl jednu dětskou bolest - vazba mezi účtem a zónou byla v administraci. Architektonicky to není dobré řešení. Místo toho, aby administrace volala jen API dnsapi, řešila na své straně komu vlastně zóna patří.

Tenhle problém je tam na více místech a tak když už se v tom hrabu, tak jsem si řekl, že to překopu. S tímhle ale nastává další problém. Pokud zóny nemají model v Djangu, tak Django pro ně negeneruje administraci. To se v dnešní době ukázalo jako menší problém než před pěti lety:

dnsapi admin

No a když byla administrace, tak proč nezkusit implementovat i DNSSEC.

DNSSEC podpora v administraci

Podpora v Bindu je dnes perfektní. DNSSEC se zapne v konfiguračním souboru u konkrétní zóny a Bind se postará o zbytek.

DNESSEC flag v Bindu

Funguje to tak, že Bind vygeneruje klíč a začne podepisovat odpovědi pro resolvery. U registrátora je pak potřeba přidat DS záznam s klíčem, který naváže řetězec důvěry s root servery.

Máme k tomu i stránku v naší dokumentaci.

Teď už zbývá jen přesunout Bind do kontejnerů a zmigrovat data, což máme naplánováno na noc ze středy na čtvrtek.

♥ 1 ❝ 1

Přešel jsem na vlastní blogovací tool

S WriteFreely jsem moc dlouho nevydržel a tak jsem si s AI vygeneroval vlastní řešení. Takhle se snadno vyhnu dvěma problémům, které mě u WriteFreely trápily.

Vyloženě deal breaker byla absence podpory pro upload obrázků. Nechci to řešit externí službou (WriteFreely na to má snap.as), chci přetáhnout nebo vložit obrázek a řešit u něj maximálně popisek.

S druhou věcí bych dokázal žít, ale vadila mi docela hodně. WriteFreely kombinuje administraci ve stránce, kde jsou vidět její prvky, když se člověk přihlásí a zároveň nad ně najede myší:

Admin prvky u postů

.. s dedikovaným admin rozhraním:

Admin rozhraní

Což u mě vedlo k tomu, že když jsem editoval nějaký post, šel jsem nejdřív do admin rozhraní a až pak si uvědomil, že vlastně musím do toho postu ve veřejné části. Někomu to asi vyhovuje, ale pro mě to bylo matoucí.

Na můj vlastní systém jsem měl jen několik požadavků:

  • Psaní příspěvků markdownem.
  • Upload obrázků přímo do pole s markdownem.
  • Na homepage nekonečný scrolling.
  • Možnost rozdělit post na perex a zbytek.
  • Admin nekombinovaný s veřejnou částí.
  • Co nejjednodušší rozhraní.
  • No a pak taky federování, protože chci boostovat ze svého profilu.

Chci prostě něco, co otevřu, píšu, naboostuju to na mém Mastodonu a za deset minut to můžu zavřít. A myslím, že se povedlo.

List příspěvků k editaci

Editace příspěvku

Husté je, že za tři hodiny, co u toho sedím, to vlastně funguje líp jak WriteFreely. Má to všechny funkce, které jsem potřeboval a ActivityPub je implementován včetně citací a profilových fotek. WriteFreely vám do profilovky hodí čárku a citace vůbec neumí.

❝ 2

AI deploy na Roští

Když Luděk Reif začal dělat Roští workshopy, přineslo mi to ohromnou dávku inspirace. Koukal jsem, jak tu službu lidé používají a jaké problémy tam řeší.

Zároveň mi před pár týdny vstoupil do života Anthropic s Opusem 4.6, který mě prakticky nahradil ve vývoji. Všechny ty parádní funkce, které Roští za poslední dva týdny dostalo, by pro mě jinak znamenaly práci na měsíce. Jen tak namátkou:

  • Aplikace mají webový terminál.
  • Všechny bugy, které se objevovaly v našem BugSinku, jsou pryč.
  • Management kontejner ve stackách už není součástí uživatelského docker-compose.
  • Párování plateb už nenecháváme na Fakturoidu, ale jedeme přes API Fio banky.
  • Update administrace na Django 6.0.
  • Nové endpointy v API.
  • MCP server pro AI, který kopíruje naše API.
  • Nové rosticli pro snadné nasazování stacků.

Každopádně cílem je, aby AI měla schopnost nasadit kód na Roští. Zkoušel jsem různé přístupy. Třeba deploy ZIP archivu přes MCP tool — to nefungovalo. Pak přes REST API. Na tom se AI hodně cyklila, a i když jsem jí dával step-by-step návod, pořád se snažila použít MCP server a jela si po svém.

Teď jsem celý proces zjednodušil na tři kroky:

  • vygeneruj Dockerfile,
  • vygeneruj docker-compose.yml,
  • zavolej rosticli stacks sync.

Každý krok zvlášť AI zvládne na jedničku. V dalších dnech se to pokusím schovat za jednoduché „nasaď tenhle kód na Roští“.

Začal jsem taky víc používat OpenCode. I když stále primárně jedu ve VS Code, dnes už nemám pochyb o tom, že OpenCode-like editory jsou budoucnost vývoje. K tomu je mimochodem výborné video od DevOps Toolbox:


Zkouším WriteFreely

Našel jsem WriteFreely a zaujalo mě, jak funguje i jak se nasazuje. Ne všechno se mi vejde na můj Mastodon účet a u něčeho bych se chtěl rozepsat a tak si říkám, proč to nezkusit.

Pokud chcete vlastní instanci WriteFreely, tak šup na Roští.cz. WriteFreely nemá docker image, takže nejjednodušší cesta, jak ho k nám dostat, je jako aplikaci.

Vytvořte novou a jako technologii vyberte Default.

WriteFreely in admin

Instalace probíhá takto:

cd /srv/app
wget https://github.com/writefreely/writefreely/releases/download/v0.16.0/writefreely_0.16.0_linux_amd64.tar.gz
tar xf writefreely_0.16.0_linux_amd64.tar.gz

writefreely config start
writefreely keys generate

Databázi zvolte SQLite. Zbytek je na vás.

Je potřeba ještě upravit pár souborů:

cp /opt/examples/nginx/nginx.conf  /srv/conf/nginx.d/app.conf

echo "[program:app]
command=/srv/app/writefreely/writefreely
directory=/srv/app/writefreely
autostart=true
autorestart=true
process_name=nginx
stdout_logfile=/srv/log/app.log
stdout_logfile_maxbytes=2MB
stdout_logfile_backups=5
stdout_capture_maxbytes=2MB
stdout_events_enabled=false
redirect_stderr=true" > /srv/conf/supervisor.d/app.conf

supervisorctl reload
supervisorctl update
supervisorctl restart nginx

A nové WriteFreely poběží. V administraci dořešíte doménu a máte hotovo.

Btw: Na Roští máme nový MCP server a pokud si ho přidáte do AI a dáte AI link na tento text, tak vám WriteFreely nasadí.