Pereiti prie technologijų turinio
Grįžti į pradžią

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

  1. Klientas per ConnectRPC kreipiasi į žinučių paslaugą.
  2. API priima užklausą tik tada, kai NATS JetStream patvariai išsaugo komandą.
  3. Worker vienoje transakcijoje įrašo žinutę ir outbox įvykį į darbo erdvės duomenų bazę.
  4. Outbox perdavėjas paskelbia patvirtintą įvykį į NATS ir Centrifugo.
  5. 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ė.

Rašyti kūrėjui