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
- Klient kutsub sõnumiteenust ConnectRPC kaudu.
- API võtab päringu vastu alles siis, kui NATS JetStream on käsu püsivalt salvestanud.
- Worker kirjutab sõnumi ja outbox-sündmuse ühe tehinguga tööruumi andmebaasi.
- Outbox-relee avaldab kinnitatud sündmuse NATS-ile ja Centrifugole.
- 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.