Technológiai stack
A HansaChat EU-s céges csevegés, terepen dolgozó csapatoknak szóló operatív réteggel, amelyet egyetlen ember tervezett, épített és üzemeltet. Ez az oldal bemutatja, mire épülnek az egyes részek, és miért esett rájuk a választás.
A verziókat és a számadatokat 2026 októberében ellenőriztük.
A repositorykban megszámolva
- ConnectRPC-szolgáltatás 179 RPC-vel, mind Protobufban definiálva
- 18
- Go-bináris egyetlen kódbázisból: API, worker, outbox-továbbító, adminisztráció
- 4
- platform egyetlen kliensből: web, macOS, Windows, Linux, iOS, Android
- 6
- nyelv a nyilvános weboldalon
- 22
- felületi nyelv az alkalmazásban
- 23
- Playwright end-to-end teszt izolált stacken
- 70
Hogyan illeszkednek egymáshoz a részek
Három alkalmazás osztozik egy edge-rétegen és egy clusteren. A weboldal felel a számlázásért és a munkaterület-nyilvántartásért, a Go-backend mindenért, ami egy munkaterületen belül történik, a webalkalmazás pedig generált ConnectRPC-klienseken keresztül kommunikál a backenddel.
Kliensek
Böngésző
Weboldal és webalkalmazás
Tauri
Asztali és mobil keretalkalmazások
hansa CLI
Szkriptek és ügynökök
Edge
Bunny.net CDN
TLS, gyorsítótárazás, DDoS-védelem
IONOS Managed Kubernetes, Németország
Traefik
Ingress minden alkalmazáshoz
Webalkalmazás Vue + Vite
Statikus Vue-build
Chat API
Go ConnectRPC-vel
- Worker
- Outbox-továbbító
Weboldal Laravel + FrankenPHP
Számlázás, nyilvántartás, kiépítés
NATS JetStream
Tartós parancsok és események
Centrifugo
WebSocket-szétosztás
Valkey Sentinel + HAProxy
Gyorsítótár, jelenlét, munkamenetek
LiveKit
Hívásmédia
Felügyelt adatok az IONOS-nál
MariaDB
Munkaterületenként egy adatbázis és egy központi nyilvántartás
Object Storage S3
Fájlok és profilképek
Külső szolgáltatások
ElevenLabs · LLM · Clef
Beszédátírás, fordítás, osztályozás
Creem · EmailLabs
Fizetések és e-mail
A clusteren kívül
Cloudflare Workers D1
Külső állapotellenőrzések
Bunny Storage restic
Titkosított mentések Frankfurtban és Stockholmban
Egy üzenet útja
- A kliens ConnectRPC-n keresztül hívja meg az üzenetszolgáltatást.
- Az API csak akkor fogadja el a kérést, ha a NATS JetStream már tartósan eltárolta a parancsot.
- Egy worker egyetlen tranzakcióban írja be az üzenetet és egy outbox-eseményt a munkaterület adatbázisába.
- Az outbox-továbbító közzéteszi a véglegesített eseményt a NATS és a Centrifugo felé.
- Minden nyitott kliens WebSocketen keresztül kapja meg; kimaradás után a kliensek az API-ból töltik újra a hiteles állapotot.
Chat-backend
Minden, ami egy munkaterületen belül történik, Go-ban fut: üzenetek, csatornák, fájlok, hívások, valós idejű funkciók, importálás és a takarítócégeknek szóló operatív csomag. A weboldal soha nem nyúl munkaterület-adatokhoz.
- Go 1.26
-
Négy bináris egyetlen moduláris kódbázisból: az API, az üzenetworker, az outbox-továbbító és egy védett adminisztrációs parancs. Statikus binárisként, egyetlen kis konténerképben kerülnek kiadásra.
Miért
Az erős standard könyvtár, a kiszámítható teljesítmény és az egyszerű konkurenciakezelés jól illik egy hosszan futó workerekből álló backendhez. Ha a teljes munkaterület-mag egyetlen nyelven készül, egy ember is karban tudja tartani.
- ConnectRPC + Protobuf connect-go 1.20 · buf 1.71
-
18 szolgáltatás és 179 RPC van Protobufban definiálva. A buf helyi pluginekkel generálja a Go-szervert és a TypeScript-klienseket, így egyetlen séma sem hagyja el a gépet.
Miért
Egyetlen szerződés szolgálja ki a webes, asztali, mobil és parancssori klienseket. Nincsenek kézzel írt HTTP-útvonalak és válaszfeldolgozás, a szerződés módosítása pedig fordítási hibaként jelenik meg, nem futásidejű hibaként.
- Munkaterületenként egy adatbázis MariaDB · sqlc
-
Minden munkaterület saját fizikai MariaDB-adatbázist kap. Az API a domainből azonosítja a munkaterületet, és megnyitja a hozzá tartozó kapcsolatkészletet; a workerek maguk is újra azonosítják, és soha nem bíznak meg egy üzenetsorból érkező adatbázisnévben. A lekérdezések egyszerű SQL-ek, amelyeket az sqlc típusos Go-kóddá fordít.
Miért
Az elkülönítés szerkezeti, nem pedig minden lekérdezésre alkalmazott szűrő. Az exportálás, az importálás, a visszaállítás és a törlés cégenként működik.
- NATS JetStream 2.10
-
Tartós streamek parancsokhoz, feladatokhoz és eseményekhez, valamint egy dead-letter stream. Az üzenetírások 64 rendezett partícióban futnak.
Miért
Egy üzenet csak tartós nyugtázás után számít elfogadottnak. Az egy csatornán belüli üzenetek sorrendje megmarad, miközben a független csatornák feldolgozása párhuzamosan történik.
- Tranzakciós outbox
-
A domainrekordok és a kimenő esemény ugyanabban a tranzakcióban kerülnek véglegesítésre. Egy továbbító közzéteszi a véglegesített eseményeket a NATS és a Centrifugo felé, eseményazonosító alapján deduplikálva, a hibákat pedig rögzíti az újrapróbálkozáshoz.
Miért
Nincsenek elveszett vagy fantomesemények, ha egy folyamat az adatbázisírás és a közzététel között leáll.
- Centrifugo v5
-
WebSocket-kézbesítés üzenetekhez, jelenléthez, gépelésjelzéshez és hívásállapothoz. A kliensek rövid élettartamú, csatornánkénti tokenekkel iratkoznak fel, amelyeket az API csak a munkaterület-tagság ellenőrzése után ad ki.
Miért
Egy dedikált valós idejű szerver távol tartja a hosszú életű kapcsolatokat az API-folyamattól, és minden token a munkaterületet és a felhasználót is megnevezi, így a külön adatbázisokból származó identitások nem ütközhetnek.
- S3-kompatibilis objektumtárolás aws-sdk-go-v2
-
A fájlok és a profilképek az IONOS Object Storage-ban, az EU-ban tárolódnak, és rövid élettartamú, aláírt hivatkozásokon keresztül érhetők el.
Miért
A fájltárolás az adatbázisoktól függetlenül skálázódik, és kiszolgálóoldalon, inaktív állapotban titkosított.
- LiveKit 1.9
-
Saját üzemeltetésű WebRTC-médiaszerver a közvetlen üzenetekből indított hívásokhoz és a hangközpontú csatornahívásokhoz, kamerával és képernyőmegosztással.
Miért
Nyílt forráskódú és saját üzemeltetésre alkalmas, így a hívásmédia a HansaChat által üzemeltetett infrastruktúrán fut.
- ElevenLabs Scribe
-
Beszédfelismerés hangüzenetekhez. Az átirat az üzenethez csatolódik, kereshető, és bármely szöveghez hasonlóan lefordítható.
Miért
A terepen dolgozó brigádok többet beszélnek, mint amennyit gépelnek.
- LLM-alapú fordítás
-
Olvasónkénti fordítás egy OpenAI-kompatibilis API-n keresztül. Minden üzenet igény szerint fordítódik le, célnyelvenként egyszer kerül gyorsítótárba, és kimarad, ha az olvasó már beszéli az adott nyelvet.
Miért
Egy vegyes nyelvű brigád egyetlen beszélgetésben dolgozik, miközben minden tag a saját nyelvén olvas. A szolgáltató egyetlen interfész mögött cserélhető marad.
- Cloudflare Clef
-
Egy döntési modell kategória, sürgősség és megbízhatóság szerint osztályozza az operatív üzeneteket. Rögzített kérdésekre valószínűségeket ad vissza, nem generált szöveget. Jelenleg pilotfázisban van.
Miért
Nincs feldolgozandó szabad szöveges kimenet. A csoportvezetők látják, mi igényel figyelmet; a cselekvés mindig emberi döntés marad.
- go-pdf 0.9
-
A4-es munkaidő-kimutatások és szolgáltatási jelentések készülnek a szerveren.
Miért
Egy tisztán Go nyelvű könyvtár kicsin tartja a backend konténerképét, és nincs szükség headless böngészőre.
- Sentry + slog
-
A hibák és a trace-ek a Sentrybe kerülnek, a naplók a standard könyvtárból származó strukturált JSON-formátumúak, a workerek pedig Prometheus szövegformátumban teszik közzé a metrikákat.
Miért
Kevés üzemeltetendő mozgó alkatrész, és minden hiba a kontextusával együtt érkezik.
Alkalmazások és CLI
Egyetlen Vue-kliens szolgálja ki a webet, és ezt csomagolja a Tauri asztali és mobil alkalmazássá. A parancssori kliens ugyanazt a nyilvános API-t használja, mint az alkalmazások.
- Vue 3 + TypeScript Vue 3.5 · TS 5.9 · Pinia 3
-
Egyetlen kliens 118 egyfájlos komponenssel, Pinia-storeokkal, vue-routerrel és vue-i18n-nel 23 felületi nyelven, Vitesttel tesztelve.
Miért
Egy kiforrott, jól olvasható komponensmodell és a szigorú TypeScript egy nagy klienst is kezelhetővé tesz egy nagyon kis csapat számára.
- Vite + Tailwind CSS Vite 8 · Tailwind 4
-
A buildeszköz és a stílusréteg: Tailwind CSS 4 világos és sötét témával.
Miért
Gyors buildek és olyan design tokenek, amelyek ugyanazt a dokumentált palettát követik, mint a weboldal.
- Tauri 2.10
-
Ugyanazt a webklienst csomagolja macOS-re, Windowsra, Linuxra, iOS-re és Androidra, natív értesítésekkel, mélyhivatkozásokkal és aláírt asztali frissítésekkel.
Miért
Mindenhol egyetlen felület, a rendszer webview-jával, ahelyett hogy minden alkalmazás saját böngészőmotort tartalmazna.
- Generált Connect-kliensek connect-web 2.1 · protobuf-es 2
-
A backend Protobuf-definícióiból generált és a webalkalmazásba másolt TypeScript-kliensek. Kézzel soha nem szerkesztjük őket.
Miért
A szerződés módosítása típushibaként jelenik meg a kliensben, nem pedig meglepetésként éles környezetben.
- centrifuge-js + livekit-client 5.7 · 2.20
-
A Centrifugo valós idejű kapcsolataihoz és a LiveKit-hívásokhoz tartozó kliens-könyvtárak.
Miért
Az újracsatlakozás, a helyreállítás és a médiakezelés azoktól a projektektől származik, amelyek a szervereket is fejlesztik.
- TipTap 3.22
-
Az üzenetszerkesztő említésekkel, hivatkozásokkal és szintaxiskiemeléses kódblokkokkal.
Miért
Strukturált szerkesztő törékeny karakterlánc-kezelés helyett.
- hansa CLI Go 1.26 · Cobra
-
Állapotmentes parancssori kliens embereknek, szkripteknek és LLM-ügynököknek. Alapértelmezés szerint JSON-kimenet, hitelesítő adatok az operációs rendszer kulcstartójában, és Minisignnal aláírt kiadási ellenőrzőösszegek.
Miért
Ugyanazt a nyilvános API-t használja, mint az alkalmazások. Protobuf-szerződéseit a backendből másoljuk át és SHA-256 hashekkel rögzítjük, így az eltéréseket a CI észleli.
Weboldal, számlázás és nyilvántartás
A Laravel működteti a nyilvános weboldalt, az ügyféldokumentációt, a fizetési folyamatot, az előfizetéseket és a munkaterületek központi nyilvántartását. Új munkaterületet a Go-backend hitelesített HTTP-hívásával hoz létre, közös kód és közös üzenetsorok nélkül.
- Laravel + PHP Laravel 12 · PHP 8.5
-
A nyilvános weboldal, az ügyféldokumentáció, a fizetési folyamat, az előfizetések, a kuponok, az életciklus-értesítések, valamint a munkaterületek és domainek központi nyilvántartása.
Miért
A számlázás, a levelezés, az ütemezés, az üzenetsorok és az űrlapok a Laravel legerősebb területei. A chat Go-ban marad, a kettő közötti határ pedig egyetlen hitelesített HTTP-interfész.
- FrankenPHP 1.13
-
A PHP-alkalmazásszerver a konténerképben, egy közös alapképre építve, amely digest alapján rögzíti a PHP-t, annak bővítményeit és eszközeit.
Miért
Egyetlen folyamat szolgálja ki az alkalmazást, és ugyanannak a commitnak az újraépítése ugyanazt a futtatókörnyezetet eredményezi.
- Blade + Alpine.js + Tailwind CSS Alpine 3.15 · Tailwind 3.4 · Vite 7
-
Szerveroldalon renderelt oldalak kis Alpine.js-komponensekkel, Tailwind CSS-sel formázva és Vite-tal csomagolva.
Miért
A tartalmi oldalak gyorsan betöltődnek anélkül, hogy egyoldalas alkalmazáskeretrendszert kellene a böngészőbe küldeni.
- 22 nyelv
-
Minden nyilvános oldal 22 uniós nyelven érhető el, nyelvi előtagos URL-ekkel, hreflang-hivatkozásokkal és lokalizált oldaltérképpel. Egy teszt elbukik, ha bármelyik nyelvből hiányzik egy kulcs, vagy angol szöveg kerülne ki benne.
Miért
Egy európai terméknek már az első oldaltól a vásárló nyelvén kell olvashatónak lennie.
- Creem
-
Fizetési folyamat, adók, számlák és előfizetések, aláírt webhookokkal szinkronban tartva.
Miért
A fizetés, az adózás és a számlázás egy erre szakosodott szolgáltatónál marad, a weboldal pedig minden előfizetésről egyeztetett másolatot vezet.
- EmailLabs
-
Tranzakciós és szolgáltatási e-mailek, például meghívók, jelszóhivatkozások és értesítések.
Miért
EU-s e-mail-szolgáltató egy EU-s termékhez.
- Pest 4.4
-
Több mint 130 tesztfájl fedi le az útvonalakat, a számlázást, a kiépítést, a fordításokat és a SEO-t, böngészőtesztekkel együtt.
Miért
Gyors, olvasható tesztek, amelyek minden változtatásnál lefutnak.
Platform és üzemeltetés
Az éles és az előnézeti környezet az IONOS-nál, Németországban fut. Minden alkalmazás saját Helm charttal ellátott konténerképként kerül kiadásra, és manuálisan indított GitLab-feladattal települ.
- IONOS Managed Kubernetes
-
Éles és előnézeti clusterek, felügyelt MariaDB és S3-kompatibilis Object Storage, mindezt egy német szolgáltató üzemelteti Németországban.
Miért
Uniós joghatóság alá tartozó európai szolgáltató, nem pedig egy Európán kívüli felhő uniós régiója.
- Helm + Traefik
-
Minden alkalmazás saját chartot kap. A Traefik irányítja a forgalmat a clusteren belül, a munkaterület-adatbázisok migrációi pedig hookként futnak minden backend-kiadás előtt.
Miért
Minden telepítés verziózott, megismételhető és könnyen visszagörgethető.
- Bunny.net
-
CDN, DNS és DDoS-védelem a cluster előtt, valamint a titkosított mentések tárolója.
Miért
Egy európai cég üzemelteti az edge-réteget és őrzi a mentési másolatokat, így egyik sem függ Európán kívüli felhőtől.
- Valkey + Sentinel + HAProxy Valkey 9.1
-
Három replika Sentinel-alapú feladatátvétellel és egy HAProxy-proxyval, amely mindig az aktuális elsődleges csomópontra mutat. Ez szolgálja ki a gyorsítótárazást, a munkameneteket, a jelenlétet és a valós idejű brokert.
Miért
A feladatátvétel nem igényel alkalmazásmódosítást, mert minden szolgáltatás továbbra is ugyanazzal a címmel kommunikál.
- restic 0.18
-
Titkosított adatbázismentések 6 óránként két uniós helyszínre, heti integritásellenőrzéssel és automatizált havi visszaállítási gyakorlattal.
Miért
Egy mentés csak akkor számít, ha a visszaállítás már bizonyítottan működött.
- GitLab CI
-
A tesztek, a konténerképek buildelése és a Helm chartok ellenőrzése a CI-ban fut. Az előnézeti és az éles környezetbe történő telepítés külön, manuálisan indított feladat.
Miért
Az automatizálás végzi az ismétlődő munkát; egy ember dönti el, mikor jut el valami az ügyfelekhez.
A termék körül
Azok az eszközök, amelyekkel egy egyszemélyes cég megfigyelhető, elérhető és érthető marad.
- Cloudflare Workers + D1
-
Külső állapotoldal, amely ötpercenként ellenőrzi az alkalmazást és a weboldalt, és rögzíti az incidenseket.
Miért
A rendelkezésre állást az általa leírt infrastruktúrán kívülről mérjük.
- Umami 3.2
-
Saját üzemeltetésű webanalitika, amely csak azután fut, hogy a látogató döntött a hozzájárulásról.
Miért
A látogatói adatok a HansaChat infrastruktúráján maradnak, ahelyett hogy egy hirdetési hálózatot táplálnának.
- Remotion 4.0
-
A termékvideókat az end-to-end tesztfuttató rögzíti a valódi alkalmazásból, majd kódban állnak össze AI-alapú hangalámondással.
Miért
Ha a felület megváltozik, a videót újrarendereljük, nem pedig újraforgatjuk.
- TwentyCRM + WireGuard
-
Saját üzemeltetésű CRM, amely csak privát VPN-en keresztül érhető el.
Miért
Az értékesítési adatok egyáltalán nincsenek kitéve a nyilvános internetnek.
Fejlesztési gyakorlat
Azok a szokások, amelyek lehetővé teszik, hogy egyetlen ember külön QA- vagy üzemeltetési csapat nélkül szállítson egy többbérlős terméket.
A szerződéseket generáljuk, sosem kézzel írjuk
A Protobuf az egyetlen forrás a Go-szerver, a TypeScript-kliensek és a CLI számára. A generátorok pontos verziókra vannak rögzítve, a CLI pedig minden általa használt szerződésfájl hashét nyilvántartja.
A migrációk nyilvántartást vezetnek
Minden munkaterület-adatbázis rögzíti, mely migrációkat alkalmazta már. Egy telepítési hook csak a hiányzókat futtatja le, és a kiadás után újra ellenőriz. A weboldal megtartja eredeti alapmigrációit, így a meglévő adatbázisok soha nem futtatják le őket kétszer.
End-to-end tesztek izolált stacken
Egyetlen parancs elindítja az adatbázisokat, a NATS-ot, a Valkeyt, a Centrifugót és az objektumtárolót szabad portokon, lefordítja a Go-binárisokat, elindítja a webalkalmazást, és lefuttat 70 Playwright-tesztet, mindegyiket friss munkaterülettel.
Tesztek minden rétegben
478 Go-tesztfüggvény, köztük két munkaterülettel végzett elkülönítési tesztek, 109 Vitest-fájl a kliensben és több mint 130 Pest-fájl a weboldalon.
Védőkorlátok a CI-ban
Formázási ellenőrzések, Go-fájlonként 1000 soros korlát és Helm chart-tesztek futnak a CI-ban a tesztcsomagok mellett.
Manuális telepítési kapuk
A CI automatikusan buildel és tesztel, de az előnézeti és az éles telepítés külön, manuális feladat. Éles környezetbe egy kiadási címke kerül, amely csak a változtatás beolvasztása után jön létre.
Visszaállítással igazolt mentések
Minden mentési futás felügyelt, és egy automatizált gyakorlat havonta visszaállítja az adatbázisokat, majd ellenőrzi a táblákat és a sorok számát.
Egyetlen dizájnrendszer
A weboldal és az alkalmazás egy közös, dokumentált palettát, tipográfiai skálát és komponensszabályokat használ, az alkalmazásban világos és sötét témával.
AI-támogatással, emberi jóváhagyással
Az AI-alapú kódolóügynökök minden repositoryban egy utasításfájl alapján dolgoznak, amely egy központi fejlesztési dokumentációs repositoryra mutat. Az ismétlődő munkafolyamatok, például az end-to-end futtatás, ügynökkészségekként vannak becsomagolva. Minden változtatás továbbra is ugyanazokon a teszteken megy át, a telepítések pedig manuálisak maradnak.
Biztonságirányítás előkészítés alatt
A HansaChat kockázati nyilvántartással, bizonyítéknyilvántartással és döntési naplóval készül az ISO/IEC 27001 tanúsításra. Jelenleg nem rendelkezik tanúsítással.
Mit állít ez az oldal — és mit nem
A fentiek mind a ma megvalósított állapotot írják le, a számadatok pedig a forráskód-repositorykból származnak. A HansaChat nem állít biztonsági tanúsítványt. Az üzenetek osztályozása pilotfázisban van, a bezárt alkalmazásokhoz szóló push értesítések pedig még nem élesek.
Kérdése van az architektúráról?
A HansaChatet értékelő mérnökök közvetlen választ kapnak attól, aki megépítette.