Glasovna poruka na WhatsApp-u: „Hej Claude, kako mi je server?" Odgovor: server je zdrav, radi 5 od 5 kontejnera.

Problem iza toga je sasvim neefektan. Držati sopstveni server znači SSH. SSH znači terminal, a terminal znači sedenje za stolom. Postoje SSH klijenti za telefon, koristio sam ih. Kucati systemctl komandu na ekranu osetljivom na dodir u vozu nije tok rada, to je kazna.

Uobičajen odgovor na to je kontrolna tabla — Grafana, Uptime Kuma, šta god voliš. Kontrolne table su u redu. Prikazuju brojeve. Ali kontrolna tabla ne može ništa da uradi. Kaže ti da je kontejner pao. Ne može da ga podigne, ne može da pročita log i ne može da ti kaže zašto.

Ono što zapravo hoću jeste da postavim pitanje običnim jezikom i dobijem odgovor od nečega što ume i da postupi.

Šta tamo radi

Claude Code radi na ovom serveru još od videa o self-hostingu. Ista postavka, ništa novo. Dakle koristim Claude Code da instaliram ono čime posle razgovaram sa Claude Code.

Sam bot je moj projekat i javno stoji na GitHub-u. Govori Slack, Telegram i WhatsApp; ovde radi samo WhatsApp. Uz njega idu: PostgreSQL kao pamćenje sesije, da bot pamti tok razgovora, i usmerivač koji jednostavna pitanja šalje na Haiku za brz odgovor, a teška na Opus.

Dve stavke spadaju na početak, jer znače novac odnosno rizik:

  • Glasovne poruke idu preko OpenAI Whisper-a, odvojenog servisa koji se plaća. Delovi centa po poruci, ali nije besplatno.
  • Broj koji povezujem je prepaid SIM, kupljen baš za ovo. Ne moj lični. Zašto, piše niže.

Faza 1 · Instalacija

text
Kloniraj ovaj repozitorijum u moj home direktorijum i pokreni ga na ovom
serveru.

Prvo npm install. To povlači whatsapp-web.js, to povlači Puppeteer, a to povlači ceo Chromium pregledač. Na svežem Ubuntu serveru sistemske biblioteke koje Chromium traži ne postoje.

Jedan savet uz to koji štedi petnaest minuta: nemoj da nagađaš spisak paketa. Pokreni servis, pročitaj log, instaliraj tačno ono što on imenuje. To je dva minuta umesto dvadeset.

27 putanja

Prolazeći kroz repozitorijum, Claude Code je našao nešto što nisam očekivao: 27 tvrdo upisanih putanja. Svaka od njih pokazivala je na /home/damjan. Moj korisnik na ovom serveru zove se drugačije. I putanja do Claude izvršnog fajla bila je tvrdo upisana, direktno u modulu za pokretanje.

Ovaj projekat sam pisao na drugoj mašini i nikada nisam primetio, jer je tamo putanja bila tačna.

Postojala su dva izlaza: napraviti korisnika sa odgovarajućim imenom i nastaviti, ili uredno prepisati putanje. Pustio sam da se prepišu.

To je pošten razlog zašto je ova faza u videu. Ne zato što je npm install zanimljiv, nego zato što se upravo to dešava kada projekat pređe na mašinu za koju nije pisan. Pouka je banalna i skupa: piši putanje kao promenljive okruženja. Nisam, i koštalo me je jedne faze ovog videa.

Podela

Claude Code ne može da izvršava sudo. Dakle on piše konfiguracije, a ja sam pokrećem privilegovane komande.

To nije zaobilaženje, to je ispravan raspored. Agent piše, ja izvršavam.

Faza 2 · Baza

Instalirati PostgreSQL i pustiti migracije. Prvi prolaz je vratio grešku; predao sam grešku Claude-u, on je pripremio dodatnu migraciju i dopunio tabele koje su nedostajale dok svih dvanaest nije odgovaralo referencama u kodu.

Na kraju je pisalo DB available: true — nijedan upit nije oborio zastavicu dostupnosti. Zatim su redovi iz probnog testa izbačeni.

Faza 3 · Uparivanje

Bot se pokreće, PostgreSQL je povezan, Slack uredno isključen, WhatsApp se inicijalizuje, kontrolna tabla na portu 3800.

Uparivanje ide preko QR koda. On ističe za nekoliko sekundi, pa se generiše svež i skenira odmah: na telefonu „poveži uređaj", skeniraj, gotovo. WhatsApp posle toga prikaže sesiju iz Chrome pregledača — to je sesija koju bot koristi.

Sesija se čuva u folderu unutar projekta, pa ponovno pokretanje ne košta uparivanje. Ali: telefon mora da se javi na mrežu otprilike na svakih četrnaest dana, inače veza pukne i skeniraš ponovo.

Pošten deo

Ovo nije zvanični WhatsApp Business API. To je Puppeteer koji vozi pregledač bez prikaza i predstavlja se kao WhatsApp Web. Metini uslovi to zabranjuju, i nalozi zbog toga bivaju blokirani.

Baš zato ovde stoji prepaid SIM, a ne moj sopstveni broj. Ako bude blokiran, gubim SIM karticu, a ne svoje poruke. Ko ovo pravi za sebe, nabavi SIM pre početka, a ne posle. Deset evra, i to je razlika između projekta i problema.

Faza 5 · Razgovor

Probna poruka, i odgovor stiže: kontejneri rade, opterećenje 0,26, disk na 4 posto.

Redosled je ono što upada u oči. Kratak odgovor stiže gotovo odmah, duži sledi za njim. To je usmerivač: Haiku razvrstava poruku. Ako je jednostavna, Haiku odgovara direktno i time je gotovo. Ako je složena, Haiku šalje brzu potvrdu prijema da ne buljiš u prazno, a Opus preuzima iza toga.

Ta dvostepena postavka je razlika između „ovo deluje kao razgovor" i „ovo deluje kao poslat formular".

Dijagram · Usmerivač: Haiku razvrstava, Opus preuzima iza toga
Dijagram · Usmerivač: Haiku razvrstava, Opus preuzima iza toga21:9

Glasovna poruka ide istim putem: audio ide na Whisper, vraća se kao tekst i prolazi kroz tačno isti lanac kao da sam kucao. Granica je 25 megabajta, dakle nekoliko minuta govora — to se ne dostiže.

A onda ono zbog čega sam ovo zapravo napravio: izveštaj o serveru. Docker kontejneri i njihov status, disk na root i home, memorija, nginx, uptime. To je funkcija koja pravi presek, izvršava šest komandi na mašini i rezultat upisuje u tabelu stanja. Čuva 24 sata istorije.

Šta nije išlo

  1. 27 tvrdo upisanih putanja u projektu koji sam sam napisao. Promenljive okruženja. Uvek.
  2. Chromium sistemske biblioteke na svežem serveru. Predvidivo, zamorno, pet minuta.
  3. Setiti se da se prepaid telefon uključi na svakih četrnaest dana.

Tri pravila

  1. Bela lista je tvoj bezbednosni model, a ne olakšica. Ko sme da piše, sme i da postupa.
  2. Daj agentu radni direktorijum, ne ceo disk. Konfiguracija ima podešavanje za to. Koristi ga.
  3. Sve što traži root, pokrećeš sam. Agent piše konfiguraciju, ti je izvršavaš. Ta podela je ono što ovu postavku drži bezbednom.

Zaključak

Bot nije zanimljiv deo. Nešto slično se sa Telegramom napravi za jedno popodne.

Ono što ovo čini upotrebljivim jeste to što Claude Code ionako već živi na tom serveru, sa stvarnim pristupom. Aplikacija za poruke je samo vrata — Telegram i Slack već stoje u istom kodu. Ista mašina, druga vrata.

Sučelje ka tvom serveru ne mora da bude terminal. Mora da bude nešto što ionako imaš otvoreno.