Siirry teknologiasisältöön
Takaisin etusivulle

Teknologiapino

HansaChat on eurooppalainen yrityschat, jossa on kenttätiimeille tarkoitettu operatiivinen kerros. Sen on suunnitellut ja rakentanut yksi ihminen, joka myös ylläpitää sitä. Tällä sivulla kerrotaan, millä kukin osa on rakennettu ja miksi se valittiin.

Versiot ja luvut tarkistettu lokakuussa 2026.

Laskettu repositorioista

ConnectRPC-palvelua ja 179 RPC-kutsua, kaikki määritelty Protobufilla
18
Go-binääriä samasta koodikannasta: API, worker, outbox-välittäjä, ylläpito
4
alustaa yhdestä asiakasohjelmasta: verkko, macOS, Windows, Linux, iOS, Android
6
kieltä julkisella verkkosivustolla
22
käyttöliittymäkieltä sovelluksessa
23
Playwright-päästä päähän -testiä eristetyssä ympäristössä
70

Miten osat sopivat yhteen

Kolme sovellusta jakaa yhden reunakerroksen ja yhden klusterin. Verkkosivusto vastaa laskutuksesta ja työtilarekisteristä, Go-taustajärjestelmä kaikesta työtilan sisällä, ja verkkosovellus keskustelee taustajärjestelmän kanssa generoitujen ConnectRPC-asiakkaiden kautta.

Asiakasohjelmat

Selain

Verkkosivusto ja verkkosovellus

Tauri

Työpöytä- ja mobiilikuoret

hansa CLI

Skriptit ja agentit

Reuna

Bunny.net CDN

TLS, välimuisti, DDoS-suojaus

IONOS Managed Kubernetes, Saksa

Traefik

Ingress jokaiselle sovellukselle

Verkkosovellus Vue + Vite

Staattinen Vue-käännös

Chat-API

Go ja ConnectRPC

  • Worker
  • Outbox-välittäjä

Verkkosivusto Laravel + FrankenPHP

Laskutus, rekisteri, provisiointi

NATS JetStream

Pysyvät komennot ja tapahtumat

Centrifugo

WebSocket-jakelu

Valkey Sentinel + HAProxy

Välimuisti, läsnäolo, istunnot

LiveKit

Puhelujen media

Hallitut tiedot IONOSissa

MariaDB

Yksi tietokanta työtilaa kohden sekä keskitetty rekisteri

Object Storage S3

Tiedostot ja profiilikuvat

Ulkoiset palvelut

ElevenLabs · LLM · Clef

Litterointi, käännös, luokittelu

Creem · EmailLabs

Maksut ja sähköposti

Klusterin ulkopuolella

Cloudflare Workers D1

Ulkoiset tilatarkistukset

Bunny Storage restic

Salatut varmuuskopiot Frankfurtissa ja Tukholmassa

Yhden viestin reitti

  1. Asiakasohjelma kutsuu viestipalvelua ConnectRPC-protokollalla.
  2. API hyväksyy pyynnön vasta, kun NATS JetStream on tallentanut komennon pysyvästi.
  3. Worker kirjoittaa viestin ja outbox-tapahtuman työtilan tietokantaan yhdessä transaktiossa.
  4. Outbox-välittäjä julkaisee vahvistetun tapahtuman NATSiin ja Centrifugoon.
  5. Jokainen avoin asiakasohjelma vastaanottaa sen WebSocket-yhteyden kautta; katkoksen jälkeen asiakasohjelmat lataavat määräävän tilan uudelleen API-rajapinnasta.

Chatin taustajärjestelmä

Kaikki, mitä työtilan sisällä tapahtuu, toimii Go-kielellä: viestit, kanavat, tiedostot, puhelut, reaaliaikaisuus, tuonnit ja siivousalan operatiivinen paketti. Verkkosivusto ei koskaan käsittele työtilan tietoja.

Go 1.26

Neljä binääriä yhdestä modulaarisesta koodikannasta: API, viesti-worker, outbox-välittäjä ja suojattu ylläpitokomento. Ne toimitetaan staattisina binääreinä yhdessä pienessä konttikuvassa.

Miksi

Vahva standardikirjasto, ennustettava suorituskyky ja yksinkertainen rinnakkaisuus sopivat taustajärjestelmään, joka koostuu pitkäkestoisista workereista. Yksi kieli koko työtilan ytimelle pitää sen yhden ihmisen ylläpidettävissä.

ConnectRPC + Protobuf connect-go 1.20 · buf 1.71

18 palvelua ja 179 RPC-kutsua on määritelty Protobufilla. buf generoi Go-palvelimen ja TypeScript-asiakkaat paikallisilla liitännäisillä, joten mikään skeema ei poistu koneelta.

Miksi

Yksi sopimus palvelee verkko-, työpöytä-, mobiili- ja komentoriviasiakkaita. Käsin kirjoitettuja HTTP-polkuja tai vastausten jäsentämistä ei ole, ja sopimuksen muutos näkyy käännösvirheenä eikä ajonaikaisena virheenä.

Yksi tietokanta työtilaa kohden MariaDB · sqlc

Jokainen työtila saa oman fyysisen MariaDB-tietokannan. API selvittää työtilan sen verkkotunnuksesta ja avaa vastaavan yhteysaltaan; workerit selvittävät sen itse uudelleen eivätkä koskaan luota jonoviestissä olevaan tietokannan nimeen. Kyselyt ovat tavallista SQL-kieltä, jonka sqlc kääntää tyypitetyksi Go-koodiksi.

Miksi

Eristys on rakenteellista eikä jokaiseen kyselyyn lisättävä suodatin. Vienti, tuonti, palautus ja poisto toimivat yrityskohtaisesti.

NATS JetStream 2.10

Pysyvät virrat komennoille, töille ja tapahtumille sekä dead-letter-virta. Viestien kirjoitukset kulkevat 64 järjestetyssä osiossa.

Miksi

Viesti hyväksytään vasta pysyvän kuittauksen jälkeen. Saman kanavan viestit pysyvät järjestyksessä, kun taas toisistaan riippumattomia kanavia käsitellään rinnakkain.

Transaktionaalinen outbox

Toimialueen rivit ja lähtevä tapahtuma vahvistetaan samassa transaktiossa. Välittäjä julkaisee vahvistetut tapahtumat NATSiin ja Centrifugoon, poistaa kaksoiskappaleet tapahtumatunnisteen perusteella ja kirjaa epäonnistumiset uudelleenyritystä varten.

Miksi

Tapahtumia ei katoa eikä haamutapahtumia synny, vaikka prosessi pysähtyisi tietokantaan kirjoittamisen ja julkaisun välillä.

Centrifugo v5

WebSocket-toimitus viesteille, läsnäololle, kirjoitusilmaisimille ja puhelujen tilalle. Asiakasohjelmat tilaavat kanavia lyhytikäisillä kanavakohtaisilla tunnisteilla, jotka API myöntää vasta tarkistettuaan työtilan jäsenyyden.

Miksi

Erillinen reaaliaikapalvelin pitää pitkäikäiset yhteydet poissa API-prosessista, ja jokainen tunniste nimeää sekä työtilan että käyttäjän, joten eri tietokantojen identiteetit eivät voi törmätä.

S3-yhteensopiva objektitallennus aws-sdk-go-v2

Tiedostot ja profiilikuvat tallennetaan IONOS Object Storageen EU-alueella, ja ne jaetaan lyhytikäisten allekirjoitettujen linkkien kautta.

Miksi

Tiedostotallennus skaalautuu tietokannoista riippumatta ja on salattu levossa palvelinpuolella.

LiveKit 1.9

Itse ylläpidetty WebRTC-mediapalvelin yksityisviestien puheluihin ja ääneen painottuviin kanavapuheluihin, joissa on kamera ja näytön jakaminen.

Miksi

Avointa lähdekoodia ja itse ylläpidettävissä, joten puhelujen media kulkee HansaChatin ylläpitämässä infrastruktuurissa.

ElevenLabs Scribe

Puheentunnistus ääniviesteille. Litteraatti liitetään viestiin, ja sitä voi hakea ja kääntää kuten mitä tahansa tekstiä.

Miksi

Kenttätyöntekijät puhuvat enemmän kuin kirjoittavat.

LLM-käännös

Lukijakohtainen käännös OpenAI-yhteensopivan API-rajapinnan kautta. Jokainen viesti käännetään tarvittaessa, tallennetaan välimuistiin kerran kohdekieltä kohden ja ohitetaan, jos lukija jo osaa kielen.

Miksi

Monikielinen tiimi työskentelee yhdessä keskustelussa, ja jokainen jäsen lukee omalla kielellään. Palveluntarjoaja on vaihdettavissa yhden rajapinnan takana.

Cloudflare Clef

Päätösmalli luokittelee operatiiviset viestit luokan, kiireellisyyden ja varmuuden mukaan. Se palauttaa todennäköisyyksiä kiinteisiin kysymyksiin, ei generoitua tekstiä. Tällä hetkellä pilottivaiheessa.

Miksi

Jäsennettävää vapaamuotoista tulostetta ei ole. Esihenkilöt näkevät, mikä vaatii huomiota; sen perusteella toimiminen on aina ihmisen päätös.

go-pdf 0.9

A4-kokoiset työaikalomakkeet ja huoltoraportit luodaan palvelimella.

Miksi

Puhdas Go-kirjasto pitää taustajärjestelmän konttikuvan pienenä ilman headless-selainta.

Sentry + slog

Virheet ja jäljitykset menevät Sentryyn, lokit ovat standardikirjaston tuottamaa jäsenneltyä JSON-dataa, ja workerit tarjoavat mittarit Prometheus-tekstimuodossa.

Miksi

Ylläpidettäviä liikkuvia osia on vähän, ja jokainen virhe saapuu kontekstinsa kanssa.

Sovellukset ja CLI

Yksi Vue-asiakasohjelma palvelee verkkoa, ja Tauri paketoi sen työpöydälle ja mobiiliin. Komentoriviasiakas käyttää samaa julkista API-rajapintaa kuin sovellukset.

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

Yksi asiakasohjelma, jossa on 118 yhden tiedoston komponenttia, Pinia-storet, vue-router ja vue-i18n 23 käyttöliittymäkielellä, testattuna Vitestillä.

Miksi

Kypsä ja luettava komponenttimalli sekä tiukka TypeScript tekevät suuresta asiakasohjelmasta hallittavan hyvin pienelle tiimille.

Vite + Tailwind CSS Vite 8 · Tailwind 4

Käännöstyökalu ja tyylikerros: Tailwind CSS 4 vaalealla ja tummalla teemalla.

Miksi

Nopeat käännökset ja design-tokenit, jotka noudattavat samaa dokumentoitua palettia kuin verkkosivusto.

Tauri 2.10

Paketoi saman verkkoasiakkaan macOS-, Windows-, Linux-, iOS- ja Android-alustoille natiiveine ilmoituksineen, syvälinkkeineen ja allekirjoitettuine työpöytäpäivityksineen.

Miksi

Yksi käyttöliittymä kaikkialla, ja se käyttää järjestelmän webview-näkymää sen sijaan, että jokaiseen sovellukseen niputettaisiin oma selainmoottori.

Generoidut Connect-asiakkaat connect-web 2.1 · protobuf-es 2

TypeScript-asiakkaat generoidaan taustajärjestelmän Protobuf-määrittelyistä ja kopioidaan verkkosovellukseen. Niitä ei koskaan muokata käsin.

Miksi

Sopimuksen muutos näkyy tyyppivirheenä asiakasohjelmassa eikä yllätyksenä tuotannossa.

centrifuge-js + livekit-client 5.7 · 2.20

Asiakaskirjastot Centrifugon reaaliaikaisuudelle ja LiveKit-puheluille.

Miksi

Uudelleenyhdistäminen, palautuminen ja median käsittely tulevat samoilta projekteilta, jotka rakentavat palvelimet.

TipTap 3.22

Viestieditori, jossa on maininnat, linkit ja syntaksikorostetut koodilohkot.

Miksi

Rakenteinen editori hauraan merkkijonokäsittelyn sijaan.

hansa CLI Go 1.26 · Cobra

Tilaton komentoriviasiakas ihmisille, skripteille ja LLM-agenteille. Oletuksena JSON-tuloste, tunnistetiedot käyttöjärjestelmän avainnipussa ja julkaisujen tarkistussummat Minisignilla allekirjoitettuina.

Miksi

Se käyttää samaa julkista API-rajapintaa kuin sovellukset. Sen Protobuf-sopimukset kopioidaan taustajärjestelmästä ja lukitaan SHA-256-tiivisteillä, joten poikkeamat havaitaan CI-putkessa.

Verkkosivusto, laskutus ja rekisteri

Laravel pyörittää julkista verkkosivustoa, asiakasdokumentaatiota, kassaa, tilauksia ja keskitettyä työtilarekisteriä. Se luo työtilan kutsumalla Go-taustajärjestelmää todennetun HTTP-yhteyden yli ilman yhteistä koodia ja ilman yhteisiä jonoja.

Laravel + PHP Laravel 12 · PHP 8.5

Julkinen verkkosivusto, asiakasdokumentaatio, kassa, tilaukset, kupongit, elinkaari-ilmoitukset sekä keskitetty työtila- ja verkkotunnusrekisteri.

Miksi

Laskutus, sähköposti, ajastus, jonot ja lomakkeet ovat Laravelin vahvinta aluetta. Chat pysyy Go-kielessä, ja niiden välinen raja on yksi todennettu HTTP-rajapinta.

FrankenPHP 1.13

PHP-sovelluspalvelin konttikuvan sisällä, rakennettuna yhteisen peruskuvan päälle, joka lukitsee PHP-version, sen laajennukset ja työkalut digestin perusteella.

Miksi

Yksi prosessi palvelee sovellusta, ja saman commitin uudelleenrakentaminen tuottaa saman ajoympäristön.

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

Palvelimella renderöidyt sivut pienillä Alpine.js-komponenteilla, tyyliteltyinä Tailwind CSS -kirjastolla ja paketoituina Vitellä.

Miksi

Sisältösivut latautuvat nopeasti ilman yhden sivun sovelluskehystä.

22 kieltä

Jokainen julkinen sivu on saatavilla 22 EU-kielellä kielikohtaisin URL-etuliittein, hreflang-linkein ja lokalisoidulla sivustokartalla. Testi epäonnistuu, jos jostakin kielestä puuttuu avain tai siinä on englanninkielistä tekstiä.

Miksi

Eurooppalaisen tuotteen pitäisi olla luettavissa ostajan kielellä ensimmäisestä sivusta alkaen.

Creem

Kassa, verot, laskut ja tilaukset, jotka pidetään synkronoituina allekirjoitettujen webhookien avulla.

Miksi

Maksut, verot ja laskutus hoitaa erikoistunut palveluntarjoaja, ja verkkosivusto pitää täsmäytettyä kopiota jokaisesta tilauksesta.

EmailLabs

Transaktio- ja palvelusähköpostit, kuten kutsut, salasanalinkit ja ilmoitukset.

Miksi

EU-maassa toimiva sähköpostipalvelu EU-tuotteelle.

Pest 4.4

Yli 130 testitiedostoa kattaa reitit, laskutuksen, provisioinnin, käännökset ja SEO-tarkistukset, selaintestit mukaan lukien.

Miksi

Nopeat, luettavat testit, jotka ajetaan jokaisen muutoksen yhteydessä.

Alusta ja ylläpito

Tuotanto- ja esikatseluympäristö toimivat IONOSilla Saksassa. Jokainen sovellus toimitetaan konttikuvana omalla Helm-kaaviollaan, ja se otetaan käyttöön manuaalisesti käynnistettävällä GitLab-työllä.

IONOS Managed Kubernetes

Tuotanto- ja esikatseluklusterit, hallittu MariaDB ja S3-yhteensopiva Object Storage – kaikkea ylläpitää saksalainen palveluntarjoaja Saksassa.

Miksi

Eurooppalainen palveluntarjoaja EU-lainkäyttövallan alaisena eikä Euroopan ulkopuolisen pilvipalvelun EU-alue.

Helm + Traefik

Jokaisella sovelluksella on oma Helm-kaavionsa. Traefik reitittää liikenteen klusterin sisällä, ja työtilatietokantojen migraatiot ajetaan hookina ennen jokaista taustajärjestelmän käyttöönottoa.

Miksi

Jokainen käyttöönotto on versioitu, toistettavissa ja helppo perua.

Bunny.net

CDN, DNS ja DDoS-suojaus klusterin edessä sekä tallennustila salatuille varmuuskopioille.

Miksi

Eurooppalainen yritys ylläpitää reunakerrosta ja säilyttää varmuuskopiot, joten kumpikaan ei ole riippuvainen Euroopan ulkopuolisesta pilvestä.

Valkey + Sentinel + HAProxy Valkey 9.1

Kolme replikaa Sentinel-vikasiirrolla ja HAProxy-välityspalvelin, joka osoittaa aina nykyiseen ensisijaiseen solmuun. Se palvelee välimuistia, istuntoja, läsnäoloa ja reaaliaikavälittäjää.

Miksi

Vikasiirto ei vaadi muutoksia sovellukseen, koska jokainen palvelu jatkaa saman osoitteen käyttöä.

restic 0.18

Salatut tietokantavarmuuskopiot 6 tunnin välein kahteen sijaintiin EU-alueella, viikoittaiset eheystarkistukset ja automatisoitu kuukausittainen palautusharjoitus.

Miksi

Varmuuskopio lasketaan vasta, kun palautus on osoitettu toimivaksi.

GitLab CI

Testit, konttikuvien käännökset ja Helm-kaavioiden tarkistukset ajetaan CI-putkessa. Käyttöönotot esikatseluun ja tuotantoon ovat erillisiä, manuaalisesti käynnistettäviä töitä.

Miksi

Automaatio hoitaa toistuvan työn; ihminen päättää, milloin jokin päätyy asiakkaille.

Tuotteen ympärillä

Työkalut, joiden ansiosta yhden hengen yritys pysyy havainnoitavana, tavoitettavana ja selitettävänä.

Cloudflare Workers + D1

Ulkoinen tilasivu, joka tarkistaa sovelluksen ja verkkosivuston viiden minuutin välein ja kirjaa häiriöt.

Miksi

Saatavuus mitataan sen infrastruktuurin ulkopuolelta, jota se kuvaa.

Umami 3.2

Itse ylläpidetty verkkoanalytiikka, joka käynnistyy vasta, kun kävijä on tehnyt suostumusvalinnan.

Miksi

Kävijätiedot pysyvät HansaChatin infrastruktuurissa eivätkä päädy mainosverkoston käyttöön.

Remotion 4.0

Tuotevideot tallennetaan oikeasta sovelluksesta päästä päähän -testien ajurilla ja kootaan koodissa tekoälyllä tuotetun selostuksen kanssa.

Miksi

Kun käyttöliittymä muuttuu, video renderöidään uudelleen eikä sitä tarvitse kuvata uudelleen.

TwentyCRM + WireGuard

Itse ylläpidetty CRM, johon pääsee vain yksityisen VPN-yhteyden kautta.

Miksi

Myyntitiedot eivät ole lainkaan avoimen internetin ulottuvilla.

Kehityskäytännöt

Tavat, joiden ansiosta yksi ihminen voi toimittaa monivuokralaistuotteen ilman erillistä laadunvarmistus- tai ylläpitotiimiä.

Sopimukset generoidaan, niitä ei kirjoiteta käsin

Protobuf on ainoa lähde Go-palvelimelle, TypeScript-asiakkaille ja CLI-työkalulle. Generaattorit on lukittu tarkkoihin versioihin, ja CLI-työkalu kirjaa jokaisen käyttämänsä sopimustiedoston tiivisteen.

Migraatioista pidetään kirjaa

Jokainen työtilatietokanta kirjaa, mitkä migraatiot siihen on ajettu. Käyttöönoton hook ajaa vain puuttuvat ja tarkistaa tilanteen uudelleen käyttöönoton jälkeen. Verkkosivusto säilyttää alkuperäiset perusmigraationsa, jotta olemassa olevat tietokannat eivät koskaan aja niitä kahdesti.

Päästä päähän -testit eristetyssä ympäristössä

Yksi komento käynnistää tietokannat, NATSin, Valkeyn, Centrifugon ja objektitallennuksen vapaisiin portteihin, kääntää Go-binäärit, käynnistää verkkosovelluksen ja ajaa 70 Playwright-testiä niin, että jokainen testi saa uuden työtilan.

Testit jokaisella kerroksella

478 Go-testifunktiota, mukaan lukien kahden työtilan eristystestit, 109 Vitest-tiedostoa asiakasohjelmassa ja yli 130 Pest-tiedostoa verkkosivustolla.

Suojakaiteet CI-putkessa

Muotoilutarkistukset, 1 000 rivin raja Go-tiedostoa kohden ja Helm-kaavioiden testit ajetaan CI-putkessa testisarjojen rinnalla.

Käyttöönotot vaativat ihmisen hyväksynnän

CI-putki kääntää ja testaa automaattisesti, mutta käyttöönotot esikatseluun ja tuotantoon ovat erillisiä manuaalisia töitä. Tuotantoon otetaan käyttöön julkaisutagi, joka luodaan vasta, kun muutos on yhdistetty.

Palautuksilla todennetut varmuuskopiot

Jokaista varmuuskopioajoa valvotaan, ja automatisoitu harjoitus palauttaa tietokannat joka kuukausi sekä tarkistaa taulut ja rivimäärät.

Yksi design-järjestelmä

Verkkosivusto ja sovellus jakavat yhden dokumentoidun paletin, typografisen asteikon ja komponenttisäännöt; sovelluksessa on vaalea ja tumma teema.

Tekoälyavusteinen, ihmisen hyväksymä

Tekoälykoodausagentit työskentelevät jokaisen repositorion ohjetiedoston pohjalta, joka osoittaa yhteen keskitettyyn kehitysdokumentaation repositorioon. Toistettavat työnkulut, kuten päästä päähän -testiajo, on paketoitu agenttitaidoiksi. Jokaisen muutoksen on silti läpäistävä samat testit, ja käyttöönotot pysyvät manuaalisina.

Tietoturvan hallinta valmisteilla

HansaChat valmistautuu ISO/IEC 27001 -sertifiointiin riskirekisterin, näyttörekisterin ja päätöslokin avulla. HansaChat ei ole tällä hetkellä sertifioitu.

Mitä tämä sivu väittää ja mitä ei

Kaikki yllä kuvattu on toteutettu jo nyt, ja luvut on laskettu lähdekoodirepositorioista. HansaChat ei väitä omaavansa tietoturvasertifiointia. Viestien luokittelu on pilottivaiheessa, eivätkä suljettujen sovellusten push-ilmoitukset ole vielä käytössä.

Kysyttävää arkkitehtuurista?

HansaChatia arvioivat insinöörit saavat suorat vastaukset sen rakentaneelta henkilöltä.

Lähetä sähköpostia kehittäjälle