Technologijų rinkinys
HansaChat – ES įmonės pokalbių platforma su operacijų sluoksniu lauko komandoms, kurią suprojektavo, sukūrė ir eksploatuoja vienas žmogus. Šiame puslapyje parodyta, kuo remiasi kiekviena dalis ir kodėl ji pasirinkta.
Versijos ir skaičiai patikrinti 2026 m. spalį.
Suskaičiuota repozitorijose
- ConnectRPC paslaugų su 179 RPC, visos apibrėžtos Protobuf
- 18
- Go dvejetainiai failai iš vienos kodo bazės: API, worker, outbox perdavėjas, administravimas
- 4
- platformos iš vieno kliento: žiniatinklis, macOS, Windows, Linux, iOS, Android
- 6
- kalbos viešoje svetainėje
- 22
- sąsajos kalbos programėlėje
- 23
- Playwright end-to-end testų izoliuotoje aplinkoje
- 70
Kaip dalys dera tarpusavyje
Trys programos dalijasi vienu kraštiniu sluoksniu (edge) ir vienu klasteriu. Svetainė atsakinga už atsiskaitymus ir darbo erdvių registrą, Go serverinė dalis – už viską, kas vyksta darbo erdvės viduje, o žiniatinklio programėlė su serverine dalimi bendrauja per sugeneruotus ConnectRPC klientus.
Klientai
Naršyklė
Svetainė ir žiniatinklio programėlė
Tauri
Kompiuterių ir mobiliųjų įrenginių apvalkalai
hansa CLI
Scenarijai ir agentai
Edge
Bunny.net CDN
TLS, podėliavimas, DDoS apsauga
IONOS Managed Kubernetes, Vokietija
Traefik
Ingress kiekvienai programai
Žiniatinklio programėlė Vue + Vite
Statinis Vue rinkinys
Pokalbių API
Go su ConnectRPC
- Worker
- Outbox perdavėjas
Svetainė Laravel + FrankenPHP
Atsiskaitymai, registras, parengimas
NATS JetStream
Patvariai saugomos komandos ir įvykiai
Centrifugo
WebSocket paskirstymas
Valkey Sentinel + HAProxy
Podėlis, buvimo būsena, seansai
LiveKit
Skambučių medija
Valdomi duomenys IONOS
MariaDB
Po vieną duomenų bazę kiekvienai darbo erdvei ir centrinis registras
Object Storage S3
Failai ir avatarai
Išorinės paslaugos
ElevenLabs · LLM · Clef
Transkripcija, vertimas, rūšiavimas
Creem · EmailLabs
Mokėjimai ir el. paštas
Už klasterio ribų
Cloudflare Workers D1
Išoriniai būsenos patikrinimai
Bunny Storage restic
Šifruotos atsarginės kopijos Frankfurte ir Stokholme
Vienos žinutės kelias
- Klientas per ConnectRPC kreipiasi į žinučių paslaugą.
- API priima užklausą tik tada, kai NATS JetStream patvariai išsaugo komandą.
- Worker vienoje transakcijoje įrašo žinutę ir outbox įvykį į darbo erdvės duomenų bazę.
- Outbox perdavėjas paskelbia patvirtintą įvykį į NATS ir Centrifugo.
- Kiekvienas atidarytas klientas jį gauna per WebSocket; po pertrūkio klientai iš API iš naujo įkelia autoritetingą būseną.
Pokalbių serverinė dalis
Viskas, kas vyksta darbo erdvės viduje, veikia Go: žinutės, kanalai, failai, skambučiai, realaus laiko funkcijos, importas ir valymo įmonėms skirtas operacijų paketas. Svetainė niekada neliečia darbo erdvių duomenų.
- Go 1.26
-
Keturi dvejetainiai failai iš vienos modulinės kodo bazės: API, žinučių worker, outbox perdavėjas ir apsaugota administravimo komanda. Jie pateikiami kaip statiniai dvejetainiai failai viename mažame atvaizde.
Kodėl
Stipri standartinė biblioteka, nuspėjamas našumas ir paprastas lygiagretumas tinka serverinei daliai, sudarytai iš ilgai veikiančių worker procesų. Viena kalba visam darbo erdvių branduoliui leidžia jį prižiūrėti vienam žmogui.
- ConnectRPC + Protobuf connect-go 1.20 · buf 1.71
-
Protobuf apibrėžta 18 paslaugų ir 179 RPC. buf su vietiniais įskiepiais generuoja Go serverį ir TypeScript klientus, todėl jokia schema nepalieka kompiuterio.
Kodėl
Viena sutartis aptarnauja žiniatinklio, kompiuterių, mobiliuosius ir komandinės eilutės klientus. Nėra rankomis rašytų HTTP maršrutų ar atsakymų analizės, o sutarties pakeitimas pasireiškia kaip kompiliavimo klaida, o ne kaip gedimas vykdymo metu.
- Po vieną duomenų bazę kiekvienai darbo erdvei MariaDB · sqlc
-
Kiekviena darbo erdvė gauna savo fizinę MariaDB duomenų bazę. API nustato darbo erdvę pagal jos domeną ir atidaro atitinkamą jungčių telkinį; worker procesai ją nustato patys iš naujo ir niekada nepasitiki duomenų bazės pavadinimu iš eilės žinutės. Užklausos yra paprastas SQL, kurį sqlc kompiliuoja į tipizuotą Go kodą.
Kodėl
Izoliacija yra struktūrinė, o ne filtras kiekvienoje užklausoje. Eksportas, importas, atkūrimas ir trynimas veikia kiekvienai įmonei atskirai.
- NATS JetStream 2.10
-
Patvarūs srautai komandoms, užduotims ir įvykiams bei dead-letter srautas. Žinučių įrašymas vyksta 64 sutvarkytuose skaidiniuose.
Kodėl
Žinutė priimama tik gavus patvarų patvirtinimą. Vieno kanalo žinutės išlaiko eiliškumą, o nepriklausomi kanalai apdorojami lygiagrečiai.
- Transakcinis outbox
-
Srities įrašai ir siunčiamas įvykis patvirtinami toje pačioje transakcijoje. Perdavėjas skelbia patvirtintus įvykius į NATS ir Centrifugo, šalindamas dublikatus pagal įvykio ID, ir užfiksuoja nesėkmes pakartotiniam bandymui.
Kodėl
Jokių prarastų ar fantominių įvykių, jei procesas sustoja tarp įrašymo į duomenų bazę ir paskelbimo.
- Centrifugo v5
-
Pristatymas per WebSocket žinutėms, buvimo būsenai, rašymo indikatoriui ir skambučių būsenai. Klientai prenumeruoja su trumpalaikiais kiekvieno kanalo prieigos raktais, kuriuos API išduoda tik patikrinusi narystę darbo erdvėje.
Kodėl
Atskiras realaus laiko serveris laiko ilgalaikius ryšius atokiau nuo API proceso, o kiekvienas raktas nurodo ir darbo erdvę, ir naudotoją, todėl tapatybės iš skirtingų duomenų bazių negali susidurti.
- Su S3 suderinama objektų saugykla aws-sdk-go-v2
-
Failai ir avatarai saugomi IONOS Object Storage saugykloje ES ir pateikiami per trumpalaikes pasirašytas nuorodas.
Kodėl
Failų saugykla plečiama nepriklausomai nuo duomenų bazių ir yra šifruojama ramybės būsenoje serverio pusėje.
- LiveKit 1.9
-
Savarankiškai talpinamas WebRTC medijos serveris asmeninių žinučių skambučiams ir į garsą orientuotiems kanalų skambučiams su kamera ir ekrano bendrinimu.
Kodėl
Atvirojo kodo ir talpinamas savarankiškai, todėl skambučių medija keliauja HansaChat eksploatuojama infrastruktūra.
- ElevenLabs Scribe
-
Kalbos pavertimas tekstu balso žinutėms. Transkripcija pridedama prie žinutės, joje galima ieškoti, o ją pačią galima išversti kaip bet kurį tekstą.
Kodėl
Lauko brigados daugiau kalba, nei rašo.
- Vertimas su LLM
-
Vertimas kiekvienam skaitytojui per su OpenAI suderinamą API. Kiekviena žinutė verčiama pagal poreikį, kiekvienai tikslinei kalbai išsaugoma podėlyje vieną kartą ir praleidžiama, jei skaitytojas jau moka tą kalbą.
Kodėl
Daugiakalbė brigada dirba viename pokalbyje, o kiekvienas narys skaito savo kalba. Tiekėją galima pakeisti, nes jis slypi už vienos sąsajos.
- Cloudflare Clef
-
Sprendimų modelis klasifikuoja operacines žinutes pagal kategoriją, skubumą ir patikimumą. Jis pateikia tikimybes fiksuotiems klausimams, o ne sugeneruotą tekstą. Šiuo metu vyksta bandomasis etapas.
Kodėl
Nėra laisvos formos išvesties, kurią reikėtų analizuoti. Vadovai mato, kam reikia dėmesio; ar imtis veiksmų, visada sprendžia žmogus.
- go-pdf 0.9
-
A4 darbo laiko žiniaraščiai ir paslaugų ataskaitos generuojami serveryje.
Kodėl
Vien Go kalba parašyta biblioteka leidžia serverinės dalies atvaizdui likti mažam ir apsieiti be „headless“ naršyklės.
- Sentry + slog
-
Klaidos ir sekos (traces) siunčiamos į Sentry, žurnalai yra struktūrizuotas JSON iš standartinės bibliotekos, o worker procesai pateikia metrikas Prometheus tekstiniu formatu.
Kodėl
Mažai judančių dalių eksploatacijoje, o kiekviena klaida pateikiama su savo kontekstu.
Programėlės ir CLI
Vienas Vue klientas aptarnauja žiniatinklį, o Tauri jį supakuoja kompiuteriams ir mobiliesiems įrenginiams. Komandinės eilutės klientas naudoja tą pačią viešąją API kaip ir programėlės.
- Vue 3 + TypeScript Vue 3.5 · TS 5.9 · Pinia 3
-
Vienas klientas su 118 vieno failo komponentų, Pinia saugyklomis, vue-router ir vue-i18n 23 sąsajos kalbomis, testuojamas su Vitest.
Kodėl
Brandus, lengvai skaitomas komponentų modelis ir griežtas TypeScript leidžia labai mažai komandai suvaldyti didelį klientą.
- Vite + Tailwind CSS Vite 8 · Tailwind 4
-
Kūrimo įrankis ir stilių sluoksnis: Tailwind CSS 4 su šviesia ir tamsia tema.
Kodėl
Greitas kūrimas ir dizaino žetonai, atitinkantys tą pačią dokumentuotą paletę kaip svetainė.
- Tauri 2.10
-
Supakuoja tą patį žiniatinklio klientą macOS, Windows, Linux, iOS ir Android platformoms su vietiniais pranešimais, giliosiomis nuorodomis ir pasirašytais kompiuterių programų atnaujinimais.
Kodėl
Viena sąsaja visur, naudojant sistemos webview, o ne į kiekvieną programėlę įdiegiant naršyklės variklį.
- Sugeneruoti Connect klientai connect-web 2.1 · protobuf-es 2
-
TypeScript klientai, sugeneruoti iš serverinės dalies Protobuf ir nukopijuoti į žiniatinklio programėlę. Jie niekada neredaguojami rankomis.
Kodėl
Sutarties pakeitimas tampa tipo klaida kliente, o ne staigmena gamybinėje aplinkoje.
- centrifuge-js + livekit-client 5.7 · 2.20
-
Klientinės bibliotekos Centrifugo realaus laiko ryšiui ir LiveKit skambučiams.
Kodėl
Pakartotinis prisijungimas, atkūrimas ir medijos apdorojimas ateina iš tų pačių projektų, kurie kuria serverius.
- TipTap 3.22
-
Žinučių rengyklė su paminėjimais, nuorodomis ir kodo blokais su sintaksės paryškinimu.
Kodėl
Struktūrizuota rengyklė vietoj trapaus darbo su simbolių eilutėmis.
- hansa CLI Go 1.26 · Cobra
-
Būsenos neturintis komandinės eilutės klientas žmonėms, scenarijams ir LLM agentams. Numatytoji JSON išvestis, prisijungimo duomenys operacinės sistemos raktinėje ir Minisign pasirašytos leidimų kontrolinės sumos.
Kodėl
Jis naudoja tą pačią viešąją API kaip ir programėlės. Jo Protobuf sutartys nukopijuojamos iš serverinės dalies ir užfiksuojamos SHA-256 maišos reikšmėmis, todėl nukrypimai aptinkami CI.
Svetainė, atsiskaitymai ir registras
Laravel aptarnauja viešąją svetainę, klientų dokumentaciją, apmokėjimą, prenumeratas ir centrinį darbo erdvių registrą. Darbo erdvę jis sukuria kreipdamasis į Go serverinę dalį per autentifikuotą HTTP, be bendro kodo ir be bendrų eilių.
- Laravel + PHP Laravel 12 · PHP 8.5
-
Vieša svetainė, klientų dokumentacija, apmokėjimas, prenumeratos, kuponai, gyvavimo ciklo pranešimai ir centrinis darbo erdvių bei domenų registras.
Kodėl
Atsiskaitymai, el. paštas, planavimas, eilės ir formos yra stipriausios Laravel sritys. Pokalbiai lieka Go, o riba tarp jų yra viena autentifikuota HTTP sąsaja.
- FrankenPHP 1.13
-
PHP programų serveris konteinerio atvaizde, sukurtas ant bendro bazinio atvaizdo, kuris pagal digest užfiksuoja PHP, jo plėtinius ir įrankius.
Kodėl
Vienas procesas aptarnauja programą, o to paties commit perkūrimas duoda tą pačią vykdymo aplinką.
- Blade + Alpine.js + Tailwind CSS Alpine 3.15 · Tailwind 3.4 · Vite 7
-
Serveryje generuojami puslapiai su mažais Alpine.js komponentais, stilizuoti Tailwind CSS ir supakuoti Vite.
Kodėl
Turinio puslapiai įkeliami greitai, nereikia pateikti vieno puslapio programų karkaso.
- 22 kalbos
-
Kiekvienas viešas puslapis yra 22 ES kalbomis, su kalbos priešdėliu URL adresuose, hreflang nuorodomis ir lokalizuotu svetainės žemėlapiu. Testas nepavyksta, jei kuriai nors kalbai trūksta rakto arba joje pateikiamas angliškas tekstas.
Kodėl
Europinis produktas turėtų būti skaitomas pirkėjo kalba nuo pat pirmo puslapio.
- Creem
-
Apmokėjimas, mokesčiai, sąskaitos faktūros ir prenumeratos, sinchronizuojami per pasirašytus webhook pranešimus.
Kodėl
Mokėjimai, mokesčiai ir sąskaitų išrašymas lieka specializuotam tiekėjui, o svetainė saugo kiekvienos prenumeratos suderintą kopiją.
- EmailLabs
-
Transakciniai ir paslaugų el. laiškai, pavyzdžiui, kvietimai, slaptažodžių nuorodos ir pranešimai.
Kodėl
ES el. pašto tiekėjas ES produktui.
- Pest 4.4
-
Daugiau nei 130 testų failų apima maršrutus, atsiskaitymus, parengimą, vertimus ir SEO, įskaitant naršyklės testus.
Kodėl
Greiti, lengvai skaitomi testai, vykdomi po kiekvieno pakeitimo.
Platforma ir eksploatacija
Gamybinė ir peržiūros aplinkos veikia IONOS infrastruktūroje Vokietijoje. Kiekviena programa pateikiama kaip konteinerio atvaizdas su savo Helm chart ir diegiama rankiniu būdu paleidžiama GitLab užduotimi.
- IONOS Managed Kubernetes
-
Gamybinės ir peržiūros aplinkos klasteriai, valdoma MariaDB ir su S3 suderinama Object Storage saugykla – visa tai eksploatuoja Vokietijos tiekėjas Vokietijoje.
Kodėl
Europos tiekėjas, kuriam taikoma ES jurisdikcija, o ne neeuropinės debesijos ES regionas.
- Helm + Traefik
-
Kiekviena programa turi savo chart. Traefik nukreipia srautą klasterio viduje, o darbo erdvių duomenų bazių migracijos vykdomos kaip hook prieš kiekvieną serverinės dalies išleidimą.
Kodėl
Kiekvienas diegimas yra versijuotas, pakartojamas ir lengvai atšaukiamas.
- Bunny.net
-
CDN, DNS ir DDoS apsauga prieš klasterį bei saugykla šifruotoms atsarginėms kopijoms.
Kodėl
Europos įmonė eksploatuoja kraštinį sluoksnį ir saugo atsargines kopijas, todėl nė vienas iš jų nepriklauso nuo neeuropinės debesijos.
- Valkey + Sentinel + HAProxy Valkey 9.1
-
Trys replikos su Sentinel perjungimu (failover) ir HAProxy tarpiniu serveriu, kuris visada nukreipia į esamą pagrindinį mazgą. Jis aptarnauja podėlį, seansus, buvimo būseną ir realaus laiko tarpininką.
Kodėl
Perjungimui nereikia jokių programos pakeitimų, nes kiekviena paslauga toliau jungiasi tuo pačiu adresu.
- restic 0.18
-
Šifruotos duomenų bazių atsarginės kopijos kas 6 valandas į dvi ES vietas, su kassavaitiniais vientisumo patikrinimais ir automatizuotomis kasmėnesinėmis atkūrimo pratybomis.
Kodėl
Atsarginė kopija ką nors reiškia tik tada, kai įrodyta, kad iš jos galima atkurti duomenis.
- GitLab CI
-
Testai, atvaizdų kūrimas ir Helm chart patikrinimai vykdomi CI. Diegimai į peržiūros ir gamybinę aplinkas yra atskiros, rankiniu būdu paleidžiamos užduotys.
Kodėl
Automatizacija atlieka pasikartojantį darbą; žmogus sprendžia, kada kas nors pasiekia klientus.
Aplink produktą
Įrankiai, kurie vieno žmogaus įmonę palaiko stebimą, pasiekiamą ir paaiškinamą.
- Cloudflare Workers + D1
-
Išorinis būsenos puslapis, kuris kas penkias minutes tikrina programėlę ir svetainę bei registruoja incidentus.
Kodėl
Prieinamumas matuojamas už infrastruktūros, kurią jis apibūdina, ribų.
- Umami 3.2
-
Savarankiškai talpinama žiniatinklio analitika, kuri veikia tik lankytojui priėmus sprendimą dėl sutikimo.
Kodėl
Lankytojų duomenys lieka HansaChat infrastruktūroje, užuot maitinę reklamos tinklą.
- Remotion 4.0
-
Produkto vaizdo įrašus iš tikros programos įrašo end-to-end testų vykdyklė, o vėliau jie sukomponuojami kode su AI sugeneruotu balso įgarsinimu.
Kodėl
Pasikeitus sąsajai, vaizdo įrašas sugeneruojamas iš naujo, o ne filmuojamas iš naujo.
- TwentyCRM + WireGuard
-
Savarankiškai talpinama CRM sistema, pasiekiama tik per privatų VPN.
Kodėl
Pardavimų duomenys visiškai neatskleidžiami viešajam internetui.
Inžinerinė praktika
Įpročiai, leidžiantys vienam žmogui pristatyti kelių nuomininkų (multi-tenant) produktą be atskiros QA ar eksploatacijos komandos.
Sutartys generuojamos, niekada nerašomos rankomis
Protobuf yra vienintelis šaltinis Go serveriui, TypeScript klientams ir CLI. Generatoriai užfiksuoti tiksliomis versijomis, o CLI įrašo kiekvieno naudojamo sutarties failo maišos reikšmę.
Migracijos turi žurnalą
Kiekviena darbo erdvės duomenų bazė fiksuoja, kurias migracijas ji pritaikė. Diegimo hook pritaiko tik trūkstamas ir po išleidimo patikrina dar kartą. Svetainė išlaiko savo pradines bazines migracijas, kad esamos duomenų bazės niekada jų nevykdytų du kartus.
End-to-end testai izoliuotoje aplinkoje
Viena komanda laisvuose prievaduose paleidžia duomenų bazes, NATS, Valkey, Centrifugo ir objektų saugyklą, sukompiliuoja Go dvejetainius failus, paleidžia žiniatinklio programėlę ir vykdo 70 Playwright testų, kiekvienam testui naudodama naują darbo erdvę.
Testai kiekviename sluoksnyje
478 Go testų funkcijos, įskaitant izoliacijos testus su dviem darbo erdvėmis, 109 Vitest failai kliente ir daugiau nei 130 Pest failų svetainėje.
Apsaugos priemonės CI procese
Formatavimo patikrinimai, 1000 eilučių riba kiekvienam Go failui ir Helm chart testai vykdomi CI kartu su testų rinkiniais.
Rankiniai diegimo vartai
CI automatiškai kuria ir testuoja, tačiau diegimai į peržiūros ir gamybinę aplinkas yra atskiros rankinės užduotys. Į gamybinę aplinką diegiama leidimo žymė, sukuriama tik po to, kai pakeitimas sujungiamas.
Atkūrimais įrodytos atsarginės kopijos
Kiekvienas atsarginio kopijavimo vykdymas stebimas, o automatizuotos pratybos kas mėnesį atkuria duomenų bazes ir patikrina lenteles bei eilučių skaičių.
Viena dizaino sistema
Svetainė ir programėlė naudoja vieną dokumentuotą paletę, šriftų skalę ir komponentų taisykles, o programėlėje yra šviesi ir tamsi tema.
Padedant AI, tvirtinant žmogui
AI programavimo agentai dirba pagal instrukcijų failą kiekvienoje repozitorijoje, kuris nukreipia į vieną centrinę inžinerinės dokumentacijos repozitoriją. Pasikartojančios darbo eigos, tokios kaip end-to-end testų paleidimas, supakuotos kaip agentų įgūdžiai. Kiekvienas pakeitimas vis tiek pereina tuos pačius testus, o diegimai lieka rankiniai.
Saugumo valdymas rengiamas
HansaChat rengiasi ISO/IEC 27001 sertifikavimui: tvarkomas rizikų registras, įrodymų registras ir sprendimų žurnalas. Šiandien HansaChat sertifikato neturi.
Ką šis puslapis teigia – ir ko jis neteigia
Viskas, kas aprašyta aukščiau, šiandien įgyvendinta ir suskaičiuota šaltinio kodo repozitorijose. HansaChat nesiremia jokiu saugumo sertifikatu. Žinučių rūšiavimas yra bandomajame etape, o push pranešimai uždarytoms programėlėms dar neveikia.
Klausimų apie architektūrą?
HansaChat vertinantys inžinieriai gauna tiesioginius atsakymus iš žmogaus, kuris jį sukūrė.