Preskoči na sadržaj o tehnologiji
Natrag na početnu stranicu

Tehnološki stog

HansaChat je poslovni chat iz EU s operativnim slojem za terenske timove, koji je osmislila i izgradila te ga vodi jedna osoba. Ova stranica pokazuje od čega je izgrađen svaki dio i zašto je odabran.

Verzije i brojke provjerene su u listopadu 2026.

Prebrojeno u repozitorijima

ConnectRPC servisa sa 179 RPC poziva, svi definirani u Protobufu
18
Go binarne datoteke iz jedne baze koda: API, worker, outbox relay, administracija
4
platformi iz jednog klijenta: web, macOS, Windows, Linux, iOS, Android
6
jezika na javnom web-mjestu
22
jezika sučelja u aplikaciji
23
Playwright specifikacija za cjelovito (end-to-end) testiranje na izoliranom stogu
70

Kako se dijelovi uklapaju

Tri aplikacije dijele jedan rubni sloj i jedan klaster. Web-mjesto upravlja naplatom i registrom radnih prostora, pozadinski sustav u Go upravlja svime unutar radnog prostora, a web-aplikacija komunicira s pozadinskim sustavom putem generiranih ConnectRPC klijenata.

Klijenti

Preglednik

Web-mjesto i web-aplikacija

Tauri

Ljuske za stolna računala i mobilne uređaje

hansa CLI

Skripte i agenti

Rubni sloj

Bunny.net CDN

TLS, predmemoriranje, DDoS zaštita

IONOS Managed Kubernetes, Njemačka

Traefik

Ingress za svaku aplikaciju

Web-aplikacija Vue + Vite

Statični Vue build

Chat API

Go s ConnectRPC

  • Worker
  • Outbox relay

Web-mjesto Laravel + FrankenPHP

Naplata, registar, dodjela resursa

NATS JetStream

Trajne naredbe i događaji

Centrifugo

WebSocket distribucija

Valkey Sentinel + HAProxy

Predmemorija, prisutnost, sesije

LiveKit

Mediji poziva

Upravljani podaci na IONOS-u

MariaDB

Jedna baza podataka po radnom prostoru plus središnji registar

Objektna pohrana S3

Datoteke i avatari

Vanjske usluge

ElevenLabs · LLM · Clef

Transkripcija, prijevod, trijaža

Creem · EmailLabs

Plaćanja i e-pošta

Izvan klastera

Cloudflare Workers D1

Vanjske provjere statusa

Bunny Storage restic

Šifrirane sigurnosne kopije u Frankfurtu i Stockholmu

Put jedne poruke

  1. Klijent poziva servis za poruke putem ConnectRPC-a.
  2. API prihvaća zahtjev tek nakon što NATS JetStream trajno pohrani naredbu.
  3. Worker u jednoj transakciji zapisuje poruku i outbox događaj u bazu podataka radnog prostora.
  4. Outbox relay objavljuje potvrđeni događaj u NATS i Centrifugo.
  5. Svaki otvoreni klijent prima ga putem WebSocketa; nakon prekida klijenti ponovno učitavaju mjerodavno stanje iz API-ja.

Pozadinski sustav chata

Sve što se događa unutar radnog prostora radi u Go: poruke, kanali, datoteke, pozivi, komunikacija u stvarnom vremenu, uvozi i operativni paket za tvrtke za čišćenje. Web-mjesto nikada ne dira podatke radnih prostora.

Go 1.26

Četiri binarne datoteke iz jedne modularne baze koda: API, worker za poruke, outbox relay i zaštićena administratorska naredba. Isporučuju se kao statične binarne datoteke u jednoj maloj slici.

Zašto

Snažna standardna biblioteka, predvidljive performanse i jednostavna konkurentnost odgovaraju pozadinskom sustavu sastavljenom od dugotrajnih workera. Jedan jezik za cijelu jezgru radnog prostora omogućuje da je održava jedna osoba.

ConnectRPC + Protobuf connect-go 1.20 · buf 1.71

18 servisa i 179 RPC poziva definirano je u Protobufu. buf generira Go poslužitelj i TypeScript klijente pomoću lokalnih dodataka, tako da nijedna shema ne napušta računalo.

Zašto

Jedan ugovor služi web-klijentima, klijentima za stolna računala, mobilnim klijentima i klijentima naredbenog retka. Nema ručno pisanih HTTP putanja ni raščlanjivanja odgovora, a promjena ugovora pokazuje se kao pogreška pri prevođenju, a ne kao kvar tijekom izvođenja.

Jedna baza podataka po radnom prostoru MariaDB · sqlc

Svaki radni prostor dobiva vlastitu fizičku MariaDB bazu podataka. API određuje radni prostor prema njegovoj domeni i otvara odgovarajući skup veza; workeri ga sami ponovno određuju i nikada ne vjeruju nazivu baze podataka iz poruke u redu čekanja. Upiti su čisti SQL koji sqlc prevodi u tipizirani Go kod.

Zašto

Izolacija je strukturna, a ne filtar u svakom upitu. Izvoz, uvoz, obnova i brisanje rade zasebno za svaku tvrtku.

NATS JetStream 2.10

Trajni tokovi za naredbe, poslove i događaje, uz tok za neisporučive poruke (dead-letter). Zapisivanje poruka odvija se u 64 uređene particije.

Zašto

Poruka se prihvaća tek nakon trajne potvrde. Poruke u jednom kanalu ostaju u redoslijedu, dok se neovisni kanali obrađuju paralelno.

Transakcijski outbox

Retci domenskih podataka i odlazni događaj potvrđuju se u istoj transakciji. Relay objavljuje potvrđene događaje u NATS i Centrifugo, uklanja duplikate prema ID-u događaja i bilježi neuspjehe za ponovni pokušaj.

Zašto

Nema izgubljenih ni fantomskih događaja kada se proces zaustavi između zapisa u bazu podataka i objave.

Centrifugo v5

WebSocket isporuka poruka, prisutnosti, indikatora tipkanja i stanja poziva. Klijenti se pretplaćuju kratkotrajnim tokenima za pojedini kanal, koje API izdaje tek nakon provjere članstva u radnom prostoru.

Zašto

Namjenski poslužitelj za stvarno vrijeme drži dugotrajne veze izvan procesa API-ja, a svaki token navodi i radni prostor i korisnika, tako da se identiteti iz odvojenih baza podataka ne mogu sukobiti.

Objektna pohrana kompatibilna s S3 aws-sdk-go-v2

Datoteke i avatari pohranjeni su u IONOS Object Storageu u EU i dostupni putem kratkotrajnih potpisanih poveznica.

Zašto

Pohrana datoteka skalira se neovisno o bazama podataka i šifrirana je u mirovanju na strani poslužitelja.

LiveKit 1.9

Samostalno hostirani WebRTC medijski poslužitelj za pozive u izravnim porukama i pretežno glasovne pozive u kanalima s kamerom i dijeljenjem zaslona.

Zašto

Otvorenog koda i prikladan za samostalno hostiranje, tako da mediji poziva rade na infrastrukturi kojom upravlja HansaChat.

ElevenLabs Scribe

Pretvaranje govora u tekst za glasovne poruke. Transkript se prilaže poruci i može se pretraživati i prevoditi kao svaki drugi tekst.

Zašto

Terenske ekipe više govore nego što tipkaju.

Prijevod pomoću LLM-a

Prijevod za svakog čitatelja zasebno putem API-ja kompatibilnog s OpenAI. Svaka se poruka prevodi na zahtjev, sprema u predmemoriju jednom po ciljnom jeziku i preskače kada čitatelj već koristi isti jezik.

Zašto

Višejezična ekipa radi u jednom razgovoru, dok svaki član čita na vlastitom jeziku. Pružatelj usluge ostaje zamjenjiv iza jednog sučelja.

Cloudflare Clef

Model odlučivanja razvrstava operativne poruke prema kategoriji, hitnosti i stupnju pouzdanosti. Vraća vjerojatnosti za unaprijed zadana pitanja, a ne generirani tekst. Trenutačno u pilotnoj fazi.

Zašto

Nema slobodnog teksta za raščlanjivanje. Voditelji vide što zahtijeva pažnju; postupanje uvijek ostaje ljudska odluka.

go-pdf 0.9

Evidencije radnog vremena i servisna izvješća u formatu A4 generiraju se na poslužitelju.

Zašto

Biblioteka napisana isključivo u Go održava sliku pozadinskog sustava malom i bez headless preglednika.

Sentry + slog

Pogreške i tragovi šalju se u Sentry, zapisnici su strukturirani JSON iz standardne biblioteke, a workeri izlažu metrike u tekstnom formatu Prometheusa.

Zašto

Malo pokretnih dijelova za održavanje, a svaki kvar stiže sa svojim kontekstom.

Aplikacije i CLI

Jedan Vue klijent poslužuje web, a Tauri ga pakira za stolna računala i mobilne uređaje. Klijent naredbenog retka koristi isti javni API kao i aplikacije.

Vue 3 + TypeScript Vue 3.5 · TS 5.9 · Pinia 3

Jedan klijent sa 118 jednodatotečnih komponenti, Pinia spremištima, vue-routerom i vue-i18n na 23 jezika sučelja, testiran pomoću Vitesta.

Zašto

Zreo, čitljiv model komponenti i strogi TypeScript čine velik klijent upravljivim za vrlo mali tim.

Vite + Tailwind CSS Vite 8 · Tailwind 4

Alat za izgradnju i sloj stilova: Tailwind CSS 4 sa svijetlom i tamnom temom.

Zašto

Brze izgradnje i dizajnerski tokeni koji prate istu dokumentiranu paletu kao web-mjesto.

Tauri 2.10

Pakira isti web-klijent za macOS, Windows, Linux, iOS i Android, s izvornim obavijestima, dubokim poveznicama i potpisanim ažuriranjima za stolna računala.

Zašto

Jedno sučelje posvuda, koje koristi sistemski webview umjesto ugrađivanja preglednikovog pogona u svaku aplikaciju.

Generirani Connect klijenti connect-web 2.1 · protobuf-es 2

TypeScript klijenti generirani iz Protobuf definicija pozadinskog sustava i kopirani u web-aplikaciju. Nikada se ne uređuju ručno.

Zašto

Promjena ugovora postaje pogreška tipa u klijentu umjesto iznenađenja u produkciji.

centrifuge-js + livekit-client 5.7 · 2.20

Klijentske biblioteke za komunikaciju u stvarnom vremenu putem Centrifuga i za pozive putem LiveKita.

Zašto

Ponovno povezivanje, oporavak i obrada medija dolaze iz projekata koji razvijaju same poslužitelje.

TipTap 3.22

Uređivač poruka sa spominjanjima, poveznicama i blokovima koda s isticanjem sintakse.

Zašto

Strukturirani uređivač umjesto krhke obrade nizova znakova.

hansa CLI Go 1.26 · Cobra

Klijent naredbenog retka bez stanja za ljude, skripte i LLM agente. Zadani izlaz je JSON, vjerodajnice su u privjesku ključeva operacijskog sustava, a kontrolni zbrojevi izdanja potpisani su pomoću Minisigna.

Zašto

Koristi isti javni API kao i aplikacije. Njegovi Protobuf ugovori kopiraju se iz pozadinskog sustava i zaključavaju SHA-256 sažecima, tako da CI otkriva odstupanja.

Web-mjesto, naplata i registar

Laravel pokreće javno web-mjesto, dokumentaciju za korisnike, plaćanje, pretplate i središnji registar radnih prostora. Radni prostor stvara pozivom pozadinskog sustava u Go putem autentificiranog HTTP-a, bez zajedničkog koda i bez zajedničkih redova čekanja.

Laravel + PHP Laravel 12 · PHP 8.5

Javno web-mjesto, dokumentacija za korisnike, plaćanje, pretplate, kuponi, obavijesti o životnom ciklusu i središnji registar radnih prostora i domena.

Zašto

Naplata, e-pošta, raspoređivanje zadataka, redovi čekanja i obrasci područja su u kojima je Laravel najjači. Chat ostaje u Go, a granica između njih jedno je autentificirano HTTP sučelje.

FrankenPHP 1.13

PHP aplikacijski poslužitelj unutar slike spremnika, izgrađen na zajedničkoj osnovnoj slici koja PHP, njegova proširenja i alate fiksira prema digestu.

Zašto

Aplikaciju poslužuje jedan proces, a ponovna izgradnja istog commita daje isto izvršno okruženje.

Blade + Alpine.js + Tailwind CSS Alpine 3.15 · Tailwind 3.4 · Vite 7

Stranice renderirane na poslužitelju s malim Alpine.js komponentama, stilizirane pomoću Tailwind CSS-a i spakirane pomoću Vitea.

Zašto

Sadržajne stranice brzo se učitavaju bez isporuke okvira za jednostranične aplikacije.

22 jezika

Svaka javna stranica postoji na 22 jezika EU, s URL-ovima s jezičnim prefiksom, hreflang poveznicama i lokaliziranom kartom web-mjesta. Test ne prolazi ako u bilo kojem jeziku nedostaje ključ ili se pojavljuje engleski tekst.

Zašto

Europski proizvod trebao bi biti čitljiv na jeziku kupca već od prve stranice.

Creem

Plaćanje, porezi, računi i pretplate, usklađeni putem potpisanih webhookova.

Zašto

Plaćanje, porezi i izdavanje računa ostaju kod specijaliziranog pružatelja usluge, dok web-mjesto čuva usklađenu kopiju svake pretplate.

EmailLabs

Transakcijska i servisna e-pošta, primjerice pozivnice, poveznice za lozinku i obavijesti.

Zašto

Pružatelj usluga e-pošte iz EU za proizvod iz EU.

Pest 4.4

Više od 130 testnih datoteka pokriva rute, naplatu, dodjelu resursa, prijevode i SEO, uključujući testove u pregledniku.

Zašto

Brzi, čitljivi testovi koji se pokreću pri svakoj promjeni.

Platforma i operacije

Produkcijsko i pretpregledno okruženje rade na IONOS-u u Njemačkoj. Svaka se aplikacija isporučuje kao slika spremnika s vlastitim Helm chartom i implementira se ručno pokrenutim poslom u GitLabu.

IONOS Managed Kubernetes

Produkcijski i pretpregledni klasteri, upravljana MariaDB i objektna pohrana kompatibilna s S3, sve kod njemačkog pružatelja usluga u Njemačkoj.

Zašto

Europski pružatelj usluga pod jurisdikcijom EU, a ne EU regija neeuropskog oblaka.

Helm + Traefik

Svaka aplikacija ima vlastiti chart. Traefik usmjerava promet unutar klastera, a migracije baza podataka radnih prostora izvode se kao hook prije svake implementacije pozadinskog sustava.

Zašto

Svaka implementacija je verzionirana, ponovljiva i lako se vraća na prethodno stanje.

Bunny.net

CDN, DNS i DDoS zaštita ispred klastera te pohrana za šifrirane sigurnosne kopije.

Zašto

Europska tvrtka upravlja rubnim slojem i čuva sigurnosne kopije, tako da ni jedno ni drugo ne ovisi o neeuropskom oblaku.

Valkey + Sentinel + HAProxy Valkey 9.1

Tri replike s preuzimanjem pri kvaru putem Sentinela i HAProxy posrednikom koji uvijek pokazuje na trenutačni primarni čvor. Služi za predmemoriranje, sesije, prisutnost i posrednika za stvarno vrijeme.

Zašto

Preuzimanje pri kvaru ne zahtijeva promjenu u aplikaciji jer svaka usluga nastavlja komunicirati s istom adresom.

restic 0.18

Šifrirane sigurnosne kopije baza podataka svakih 6 sati na dvije lokacije u EU, uz tjedne provjere integriteta i automatiziranu mjesečnu vježbu obnove.

Zašto

Sigurnosna kopija vrijedi tek kada je obnova iz nje dokazana.

GitLab CI

Testovi, izgradnja slika i provjere Helm chartova izvode se u CI-ju. Implementacije u pretpregledno i produkcijsko okruženje zasebni su, ručno pokretani poslovi.

Zašto

Automatizacija obavlja posao koji se ponavlja; čovjek odlučuje kada nešto stiže do korisnika.

Oko proizvoda

Alati zahvaljujući kojima tvrtka jedne osobe ostaje pod nadzorom, dostupna i objašnjiva.

Cloudflare Workers + D1

Vanjska stranica statusa koja svakih pet minuta provjerava aplikaciju i web-mjesto te bilježi incidente.

Zašto

Dostupnost se mjeri izvan infrastrukture koju opisuje.

Umami 3.2

Samostalno hostirana web-analitika koja se pokreće tek nakon što posjetitelj odabere postavke privole.

Zašto

Podaci o posjetiteljima ostaju na infrastrukturi HansaChata umjesto da hrane oglašivačku mrežu.

Remotion 4.0

Videozapisi proizvoda snimaju se iz stvarne aplikacije pomoću alata za cjelovito (end-to-end) testiranje i sastavljaju se u kodu uz AI glasovnu naraciju.

Zašto

Kada se sučelje promijeni, videozapis se ponovno renderira umjesto da se ponovno snima.

TwentyCRM + WireGuard

Samostalno hostirani CRM dostupan samo putem privatnog VPN-a.

Zašto

Prodajni podaci uopće nisu izloženi javnom internetu.

Inženjerske prakse

Navike koje jednoj osobi omogućuju isporuku višekorisničkog (multi-tenant) proizvoda bez zasebnog tima za QA ili operacije.

Ugovori se generiraju, nikada se ne pišu ručno

Protobuf je jedini izvor za Go poslužitelj, TypeScript klijente i CLI. Generatori su fiksirani na točne verzije, a CLI bilježi sažetak svake datoteke ugovora koju koristi.

Migracije vode evidenciju

Svaka baza podataka radnog prostora bilježi koje su migracije na njoj primijenjene. Hook pri implementaciji primjenjuje samo one koje nedostaju i ponovno provjerava stanje nakon uvođenja. Web-mjesto zadržava svoje izvorne početne migracije, tako da ih postojeće baze podataka nikada ne pokreću dvaput.

Cjeloviti testovi na izoliranom stogu

Jedna naredba pokreće baze podataka, NATS, Valkey, Centrifugo i objektnu pohranu na slobodnim portovima, gradi Go binarne datoteke, pokreće web-aplikaciju i izvodi 70 Playwright specifikacija sa svježim radnim prostorom za svaki test.

Testovi na svakom sloju

478 Go testnih funkcija, uključujući testove izolacije između dva radna prostora, 109 Vitest datoteka u klijentu i više od 130 Pest datoteka na web-mjestu.

Zaštitne ograde u CI-ju

Provjere formatiranja, ograničenje od 1000 redaka po Go datoteci i testovi Helm chartova izvode se u CI-ju uz skupove testova.

Ručna vrata za implementaciju

CI automatski gradi i testira, ali implementacije u pretpregledno i produkcijsko okruženje zasebni su ručni poslovi. U produkciju se implementira oznaka izdanja koja se stvara tek nakon spajanja promjene.

Sigurnosne kopije potvrđene obnovama

Svako pokretanje izrade sigurnosnih kopija se prati, a automatizirana vježba svaki mjesec obnavlja baze podataka i provjerava tablice i broj redaka.

Jedan sustav dizajna

Web-mjesto i aplikacija dijele jednu dokumentiranu paletu, tipografsku ljestvicu i pravila komponenti, uz svijetlu i tamnu temu u aplikaciji.

Uz pomoć AI-ja, pod ljudskim nadzorom

AI agenti za programiranje rade prema datoteci s uputama u svakom repozitoriju koja upućuje na jedan središnji repozitorij inženjerske dokumentacije. Ponovljivi tijekovi rada, poput cjelovitog testnog pokretanja, zapakirani su kao vještine agenata. Svaka promjena i dalje prolazi iste testove, a implementacije ostaju ručne.

Upravljanje sigurnošću u pripremi

HansaChat se priprema za certifikaciju prema ISO/IEC 27001 s registrom rizika, registrom dokaza i dnevnikom odluka. Trenutačno nije certificiran.

Što ova stranica tvrdi, a što ne

Sve gore navedeno opisuje ono što je danas implementirano i prebrojeno je iz izvornih repozitorija. HansaChat ne tvrdi da ima sigurnosni certifikat. Trijaža poruka je u pilotnoj fazi, a push obavijesti za zatvorene aplikacije još nisu aktivne.

Pitanja o arhitekturi?

Inženjeri koji procjenjuju HansaChat dobivaju izravne odgovore od osobe koja ga je izgradila.

Pišite razvojnom programeru