Liigu tehnoloogia sisu juurde
Tagasi avalehele

Tehnoloogiapinu

HansaChat on Euroopa ettevõttevestlus koos välitöömeeskondade operatiivkihiga, mille on kavandanud, ehitanud ja mida käitab üks inimene. See leht näitab, millega iga osa on ehitatud ja miks see valiti.

Versioonid ja arvud üle vaadatud 2026. aasta oktoobris.

Loendatud repositooriumides

ConnectRPC-teenust ja 179 RPC-meetodit, kõik kirjeldatud Protobufis
18
Go binaarfaili ühest koodibaasist: API, worker, outbox-relee, haldus
4
platvormi ühest kliendist: veeb, macOS, Windows, Linux, iOS, Android
6
keelt avalikul veebilehel
22
kasutajaliidese keelt rakenduses
23
Playwrighti otsast lõpuni testi isoleeritud keskkonnas
70

Kuidas osad omavahel kokku sobivad

Kolm rakendust jagavad üht servakihti ja üht klastrit. Veebileht vastutab arvelduse ja tööruumide registri eest, Go-taustasüsteem kõige eest, mis toimub tööruumi sees, ning veebirakendus suhtleb taustasüsteemiga genereeritud ConnectRPC-klientide kaudu.

Kliendid

Brauser

Veebileht ja veebirakendus

Tauri

Töölaua- ja mobiilikestad

hansa CLI

Skriptid ja agendid

Servakiht

Bunny.net CDN

TLS, vahemälu, DDoS-kaitse

IONOS Managed Kubernetes, Saksamaa

Traefik

Ingress igale rakendusele

Veebirakendus Vue + Vite

Staatiline Vue-kooste

Vestluse API

Go ja ConnectRPC

  • Worker
  • Outbox-relee

Veebileht Laravel + FrankenPHP

Arveldus, register, tööruumide loomine

NATS JetStream

Püsivad käsud ja sündmused

Centrifugo

WebSocketi jaotus

Valkey Sentinel + HAProxy

Vahemälu, kohalolek, seansid

LiveKit

Kõnede meedia

Hallatud andmed IONOSes

MariaDB

Üks andmebaas tööruumi kohta pluss keskne register

Object Storage S3

Failid ja avatarid

Välised teenused

ElevenLabs · LLM · Clef

Transkriptsioon, tõlge, triaaž

Creem · EmailLabs

Maksed ja e-post

Väljaspool klastrit

Cloudflare Workers D1

Välised olekukontrollid

Bunny Storage restic

Krüpteeritud varukoopiad Frankfurdis ja Stockholmis

Ühe sõnumi teekond

  1. Klient kutsub sõnumiteenust ConnectRPC kaudu.
  2. API võtab päringu vastu alles siis, kui NATS JetStream on käsu püsivalt salvestanud.
  3. Worker kirjutab sõnumi ja outbox-sündmuse ühe tehinguga tööruumi andmebaasi.
  4. Outbox-relee avaldab kinnitatud sündmuse NATS-ile ja Centrifugole.
  5. Iga avatud klient saab selle WebSocketi kaudu; pärast katkestust laadivad kliendid API-st uuesti autoriteetse oleku.

Vestluse taustasüsteem

Kõik, mis toimub tööruumi sees, töötab Go-s: sõnumid, kanalid, failid, kõned, reaalajasuhtlus, importimine ja puhastusvaldkonna operatiivpakett. Veebileht ei puutu kunagi tööruumi andmeid.

Go 1.26

Neli binaarfaili ühest modulaarsest koodibaasist: API, sõnumite worker, outbox-relee ja kaitstud halduskäsk. Need tarnitakse staatiliste binaarfailidena ühes väikeses konteinerkujutises.

Miks

Tugev standardteek, prognoositav jõudlus ja lihtne samaaegsus sobivad pikalt töötavatest workeritest koosnevale taustasüsteemile. Üks keel kogu tööruumi tuuma jaoks hoiab selle ühe inimese jaoks hallatavana.

ConnectRPC + Protobuf connect-go 1.20 · buf 1.71

18 teenust ja 179 RPC-meetodit on kirjeldatud Protobufis. buf genereerib Go-serveri ja TypeScripti kliendid kohalike pluginatega, nii et ükski skeem ei lahku masinast.

Miks

Üks leping teenindab veebi-, töölaua-, mobiili- ja käsurakliente. Käsitsi kirjutatud HTTP-teid ega vastuste parsimist pole ning lepingu muudatus ilmneb kompileerimisveana, mitte käitusaegse tõrkena.

Üks andmebaas tööruumi kohta MariaDB · sqlc

Iga tööruum saab oma füüsilise MariaDB andmebaasi. API tuvastab tööruumi selle domeeni järgi ja avab vastava ühenduskogumi; workerid tuvastavad selle ise uuesti ega usalda kunagi järjekorrasõnumis olevat andmebaasi nime. Päringud on tavaline SQL, mille sqlc kompileerib tüübitud Go-koodiks.

Miks

Isolatsioon on struktuurne, mitte filter igas päringus. Eksport, import, taastamine ja kustutamine toimivad ettevõtte kaupa.

NATS JetStream 2.10

Püsivad vood käskude, tööde ja sündmuste jaoks ning dead-letter-voog. Sõnumite kirjutamine toimub 64 järjestatud partitsioonis.

Miks

Sõnum võetakse vastu alles pärast püsivat kinnitust. Ühe kanali sõnumid püsivad õiges järjekorras, samal ajal kui sõltumatuid kanaleid töödeldakse paralleelselt.

Tehinguline outbox

Domeeniread ja väljuv sündmus kinnitatakse samas tehingus. Relee avaldab kinnitatud sündmused NATS-ile ja Centrifugole, eemaldab sündmuse ID alusel duplikaadid ja salvestab tõrked korduskatseteks.

Miks

Sündmused ei kao ega teki fantoomsündmusi, kui protsess peatub andmebaasi kirjutamise ja avaldamise vahel.

Centrifugo v5

Sõnumite, kohaloleku, trükkimise märguannete ja kõne oleku edastamine WebSocketi kaudu. Kliendid tellivad lühiajaliste kanalipõhiste tokenitega, mille API väljastab alles pärast tööruumi liikmesuse kontrollimist.

Miks

Eraldi reaalajaserver hoiab pikaajalised ühendused API protsessist eemal ning iga token sisaldab nii tööruumi kui ka kasutajat, nii et eri andmebaaside identiteedid ei saa omavahel põrkuda.

S3-ühilduv objektisalvestus aws-sdk-go-v2

Failid ja avatarid hoitakse EL-is asuvas IONOS Object Storage teenuses ning neid jagatakse lühiajaliste allkirjastatud linkide kaudu.

Miks

Failisalvestus skaleerub andmebaasidest sõltumatult ja on serveripoolselt puhkeolekus krüpteeritud.

LiveKit 1.9

Isehallatav WebRTC-meediaserver otsesõnumite kõnede ning peamiselt helipõhiste kanalikõnede jaoks koos kaamera ja ekraanijagamisega.

Miks

Avatud lähtekoodiga ja isehallatav, nii et kõnede meedia liigub HansaChati käitatud taristul.

ElevenLabs Scribe

Kõne teisendamine tekstiks häälsõnumite jaoks. Transkriptsioon lisatakse sõnumile ning seda saab otsida ja tõlkida nagu iga teist teksti.

Miks

Välitöötajad räägivad rohkem, kui kirjutavad.

LLM-tõlge

Lugejapõhine tõlge OpenAI-ga ühilduva API kaudu. Iga sõnum tõlgitakse vajaduse korral, salvestatakse vahemällu üks kord sihtkeele kohta ja jäetakse vahele, kui lugeja seda keelt juba valdab.

Miks

Mitmekeelne meeskond töötab ühes vestluses, samal ajal kui iga liige loeb oma keeles. Teenusepakkuja on ühe liidese taga vahetatav.

Cloudflare Clef

Otsustusmudel liigitab operatiivsed sõnumid kategooria, kiireloomulisuse ja usaldusväärsuse järgi. See tagastab kindlaksmääratud küsimustele tõenäosused, mitte genereeritud teksti. Praegu pilootfaasis.

Miks

Parsitavat vabateksti pole. Töödejuhatajad näevad, mis vajab tähelepanu; selle põhjal tegutsemine jääb alati inimese otsuseks.

go-pdf 0.9

A4-formaadis tööajalehed ja teenindusaruanded luuakse serveris.

Miks

Puhtalt Go-s kirjutatud teek hoiab taustasüsteemi konteinerkujutise väikesena ja ilma headless-brauserita.

Sentry + slog

Vead ja jäljed saadetakse Sentrysse, logid on standardteegi struktureeritud JSON ning workerid avaldavad mõõdikud Prometheuse tekstivormingus.

Miks

Hallata tuleb vähe liikuvaid osi ja iga tõrge saabub koos oma kontekstiga.

Rakendused ja CLI

Üks Vue-klient teenindab veebi ning Tauri pakendab selle töölaua- ja mobiilirakendusteks. Käsureaklient kasutab sama avalikku API-t mis rakendused.

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

Üks klient 118 ühefailise komponendi, Pinia hoidlate, vue-routeri ja vue-i18n-iga 23 kasutajaliidese keeles, testitud Vitestiga.

Miks

Küps ja loetav komponendimudel ning range TypeScript teevad suure kliendi väga väikesele meeskonnale hallatavaks.

Vite + Tailwind CSS Vite 8 · Tailwind 4

Koostetööriist ja stiilikiht: Tailwind CSS 4 heleda ja tumeda teemaga.

Miks

Kiired koosted ja disainimärgid, mis järgivad veebilehega sama dokumenteeritud paletti.

Tauri 2.10

Pakendab sama veebikliendi macOS-i, Windowsi, Linuxi, iOS-i ja Androidi jaoks koos natiivsete teavituste, süvalinkide ja allkirjastatud töölauauuendustega.

Miks

Üks kasutajaliides kõikjal, mis kasutab süsteemi veebivaadet, selle asemel et igasse rakendusse brauserimootor kaasa pakkida.

Genereeritud Connecti kliendid connect-web 2.1 · protobuf-es 2

TypeScripti kliendid, mis genereeritakse taustasüsteemi Protobufist ja kopeeritakse veebirakendusse. Neid ei muudeta kunagi käsitsi.

Miks

Lepingu muudatus muutub kliendis tüübiveaks, mitte üllatuseks toodangus.

centrifuge-js + livekit-client 5.7 · 2.20

Klienditeegid Centrifugo reaalajasuhtluse ja LiveKiti kõnede jaoks.

Miks

Taasühendamine, taastamine ja meediatöötlus pärinevad samadelt projektidelt, mis ehitavad servereid.

TipTap 3.22

Sõnumiredaktor mainimiste, linkide ja süntaksiesiletõstuga koodiplokkidega.

Miks

Struktureeritud redaktor habraste stringitöötluste asemel.

hansa CLI Go 1.26 · Cobra

Olekuta käsureaklient inimestele, skriptidele ja LLM-agentidele. Vaikimisi JSON-väljund, mandaadid operatsioonisüsteemi võtmehoidlas ja Minisigniga allkirjastatud väljalasete kontrollsummad.

Miks

See kasutab sama avalikku API-t mis rakendused. Selle Protobufi lepingud kopeeritakse taustasüsteemist ja lukustatakse SHA-256 räsidega, nii et kõrvalekalded tuvastatakse CI-s.

Veebileht, arveldus ja register

Laravel käitab avalikku veebilehte, kliendidokumentatsiooni, makseprotsessi, tellimusi ja tööruumide keskset registrit. Tööruumi loomiseks kutsub see autenditud HTTP kaudu Go-taustasüsteemi, ilma jagatud koodi ja jagatud järjekordadeta.

Laravel + PHP Laravel 12 · PHP 8.5

Avalik veebileht, kliendidokumentatsioon, makseprotsess, tellimused, kupongid, elutsükli teavitused ning tööruumide ja domeenide keskne register.

Miks

Arveldus, e-post, ajastamine, järjekorrad ja vormid on Laraveli tugevaimad küljed. Vestlus jääb Go-sse ja nendevaheline piir on üks autenditud HTTP-liides.

FrankenPHP 1.13

PHP rakendusserver konteinerkujutise sees, ehitatud jagatud baaskujutisele, mis lukustab PHP, selle laiendused ja tööriistad räsi (digest) järgi.

Miks

Üks protsess teenindab rakendust ja sama commiti uuesti koostamine annab sama käituskeskkonna.

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

Serveris renderdatud lehed väikeste Alpine.js komponentidega, kujundatud Tailwind CSS-iga ja komplekteeritud Vite abil.

Miks

Sisulehed laadivad kiiresti, ilma et peaks kaasa andma üheleherakenduse raamistikku.

22 keelt

Iga avalik leht on olemas 22 EL-i keeles, keele eesliitega URL-ide, hreflang-linkide ja lokaliseeritud saidikaardiga. Test kukub läbi, kui mõnest keelest puudub võti või see sisaldab ingliskeelset teksti.

Miks

Euroopa toode peaks olema ostja keeles loetav juba esimeselt lehelt.

Creem

Makseprotsess, maksud, arved ja tellimused, mida hoitakse sünkroonis allkirjastatud webhookide kaudu.

Miks

Maksed, maksud ja arveldamine jäävad spetsialiseerunud teenusepakkujale, samal ajal kui veebileht hoiab iga tellimuse kooskõlastatud koopiat.

EmailLabs

Tehingu- ja teenusmeilid, nagu kutsed, paroolilingid ja teavitused.

Miks

EL-i meiliteenuse pakkuja EL-i tootele.

Pest 4.4

Üle 130 testifaili katavad marsruute, arveldust, tööruumide loomist, tõlkeid ja SEO-d, sealhulgas brauseriteste.

Miks

Kiired ja loetavad testid, mis käivituvad iga muudatuse korral.

Platvorm ja käitus

Toodangu- ja eelvaatekeskkond töötavad IONOSes Saksamaal. Iga rakendus tarnitakse konteinerkujutisena koos oma Helmi paketiga ja juurutatakse käsitsi käivitatava GitLabi tööga.

IONOS Managed Kubernetes

Toodangu- ja eelvaateklastrid, hallatud MariaDB ja S3-ühilduv Object Storage – kõike käitab Saksa teenusepakkuja Saksamaal.

Miks

Euroopa teenusepakkuja EL-i jurisdiktsiooni all, mitte Euroopa-välise pilve EL-i piirkond.

Helm + Traefik

Iga rakendus tarnib oma Helmi paketi. Traefik suunab liiklust klastri sees ning tööruumide andmebaaside migratsioonid käivitatakse konksuna enne iga taustasüsteemi juurutust.

Miks

Iga juurutus on versioonitud, korratav ja lihtsalt tagasi pööratav.

Bunny.net

CDN, DNS ja DDoS-kaitse klastri ees ning salvestusruum krüpteeritud varukoopiatele.

Miks

Servakihti käitab ja varukoopiaid hoiab Euroopa ettevõte, nii et kumbki ei sõltu Euroopa-välisest pilvest.

Valkey + Sentinel + HAProxy Valkey 9.1

Kolm koopiat Sentineli tõrkesiirdega ja HAProxy puhverserver, mis osutab alati praegusele primaarsõlmele. See teenindab vahemälu, seansse, kohalolekut ja reaalajavahendajat.

Miks

Tõrkesiire ei nõua rakenduses muudatusi, sest iga teenus suhtleb edasi sama aadressiga.

restic 0.18

Krüpteeritud andmebaasi varukoopiad iga 6 tunni järel kahte EL-i asukohta, iganädalased terviklikkuse kontrollid ja automaatne igakuine taastamisharjutus.

Miks

Varukoopia loeb alles siis, kui taastamine on tõestatud.

GitLab CI

Testid, konteinerkujutiste koostamine ja Helmi pakettide kontrollid käivad CI-s. Juurutused eelvaate- ja toodangukeskkonda on eraldi, käsitsi käivitatavad tööd.

Miks

Automaatika teeb korduva töö ära; inimene otsustab, millal miski jõuab klientideni.

Toote ümber

Tööriistad, mis hoiavad üheinimeseettevõtte jälgitava, kättesaadava ja selgitatavana.

Cloudflare Workers + D1

Väline olekuleht, mis kontrollib rakendust ja veebilehte iga viie minuti järel ning registreerib intsidendid.

Miks

Kättesaadavust mõõdetakse väljastpoolt taristut, mida see kirjeldab.

Umami 3.2

Isehallatav veebianalüütika, mis käivitub alles pärast seda, kui külastaja on teinud nõusolekuvaliku.

Miks

Külastajate andmed jäävad HansaChati taristule, selle asemel et toita reklaamivõrgustikku.

Remotion 4.0

Tootevideod salvestab otsast lõpuni testide käivitaja päris rakendusest ning need pannakse koodis kokku tehisintellekti loodud diktoritekstiga.

Miks

Kui kasutajaliides muutub, renderdatakse video uuesti, selle asemel et seda uuesti filmida.

TwentyCRM + WireGuard

Isehallatav CRM, millele pääseb ligi ainult privaatse VPN-i kaudu.

Miks

Müügiandmed ei ole avalikus internetis üldse nähtavad.

Arenduspraktikad

Harjumused, mis võimaldavad ühel inimesel tarnida mitme kliendiga (multi-tenant) toodet ilma eraldi kvaliteedikontrolli- või käitusmeeskonnata.

Lepingud genereeritakse, mitte ei kirjutata käsitsi

Protobuf on ainus allikas Go-serverile, TypeScripti klientidele ja CLI-le. Generaatorid on lukustatud täpsetele versioonidele ning CLI salvestab iga kasutatava lepingufaili räsi.

Migratsioonide üle peetakse arvestust

Iga tööruumi andmebaas registreerib, milliseid migratsioone sellele on rakendatud. Juurutuskonks rakendab ainult puuduvad ja kontrollib pärast juurutust uuesti. Veebileht säilitab oma algsed baasmigratsioonid, et olemasolevad andmebaasid ei käivitaks neid kunagi kaks korda.

Otsast lõpuni testid isoleeritud keskkonnas

Üks käsk käivitab vabadel portidel andmebaasid, NATS-i, Valkey, Centrifugo ja objektisalvestuse, koostab Go binaarfailid, käivitab veebirakenduse ja jooksutab 70 Playwrighti testi, kus iga test saab värske tööruumi.

Testid igal kihil

478 Go testifunktsiooni, sealhulgas kahe tööruumi isolatsioonitestid, 109 Vitesti faili kliendis ja üle 130 Pesti faili veebilehel.

Kaitsepiirded CI-s

Vormindamise kontrollid, 1000-realine piirang Go faili kohta ja Helmi pakettide testid käivad CI-s testikomplektide kõrval.

Käsitsi kinnitatavad juurutused

CI koostab ja testib automaatselt, kuid juurutused eelvaate- ja toodangukeskkonda on eraldi käsitsi käivitatavad tööd. Toodangusse juurutatakse väljalaske silt, mis luuakse alles pärast muudatuse ühendamist.

Taastamisega tõestatud varukoopiad

Iga varundamist jälgitakse ning automaatne harjutus taastab andmebaasid iga kuu ning valideerib tabelid ja ridade arvu.

Üks disainisüsteem

Veebileht ja rakendus jagavad üht dokumenteeritud paletti, tüpograafilist skaalat ja komponendireegleid; rakenduses on hele ja tume teema.

Tehisintellekti abiga, inimese kinnitusega

Tehisintellektil põhinevad koodiagendid töötavad iga repositooriumi juhendfaili alusel, mis viitab ühele kesksele arendusdokumentatsiooni repositooriumile. Korduvad töövood, näiteks otsast lõpuni testide käivitus, on pakendatud agendioskusteks. Iga muudatus peab endiselt läbima samad testid ja juurutused jäävad käsitsi tehtavaks.

Turvalisuse juhtimine ettevalmistamisel

HansaChat valmistub ISO/IEC 27001 sertifitseerimiseks riskiregistri, tõendusmaterjali registri ja otsuste logi abil. HansaChat ei ole praegu sertifitseeritud.

Mida see leht väidab ja mida mitte

Kõik ülaltoodu kirjeldab tänaseks rakendatud lahendusi ja on loendatud lähtekoodi repositooriumidest. HansaChat ei väida, et tal on turvasertifikaat. Sõnumite triaaž on pilootfaasis ja suletud rakenduste tõuketeavitused ei ole veel kasutusel.

Küsimusi arhitektuuri kohta?

HansaChati hindavad insenerid saavad otsesed vastused inimeselt, kes selle ehitas.

Kirjuta arendajale