Технологичен стек
HansaChat е фирмен чат от ЕС с оперативен слой за теренни екипи, проектиран, изграден и поддържан от един човек. Тази страница показва с какво е изградена всяка част и защо е избрана.
Версиите и броят са проверени през октомври 2026 г.
Преброено в хранилищата
- ConnectRPC услуги със 179 RPC извиквания, всички дефинирани в Protobuf
- 18
- изпълними файла на Go от една кодова база: API, worker, outbox релей, администриране
- 4
- платформи от един клиент: уеб, macOS, Windows, Linux, iOS, Android
- 6
- езика на публичния уебсайт
- 22
- езика на интерфейса в приложението
- 23
- спецификации с Playwright за тестове от край до край върху изолиран стек
- 70
Как се свързват частите
Три приложения споделят един edge слой и един клъстер. Уебсайтът отговаря за таксуването и регистъра на работните пространства, Go бекендът отговаря за всичко вътре в работното пространство, а уеб приложението комуникира с бекенда чрез генерирани ConnectRPC клиенти.
Клиенти
Браузър
Уебсайт и уеб приложение
Tauri
Обвивки за настолни и мобилни устройства
hansa CLI
Скриптове и агенти
Edge
Bunny.net CDN
TLS, кеширане, защита от DDoS
IONOS Managed Kubernetes, Германия
Traefik
Ingress за всяко приложение
Уеб приложение Vue + Vite
Статична компилация на Vue
Чат API
Go с ConnectRPC
- Worker
- Outbox релей
Уебсайт Laravel + FrankenPHP
Таксуване, регистър, провизиране
NATS JetStream
Трайни команди и събития
Centrifugo
Разпращане по WebSocket
Valkey Sentinel + HAProxy
Кеш, присъствие, сесии
LiveKit
Медия за разговори
Управлявани данни в IONOS
MariaDB
Една база данни на работно пространство плюс централен регистър
Обектно хранилище S3
Файлове и аватари
Външни услуги
ElevenLabs · LLM · Clef
Транскрипция, превод, триаж
Creem · EmailLabs
Плащания и имейл
Извън клъстера
Cloudflare Workers D1
Външни проверки на статуса
Bunny Storage restic
Шифровани резервни копия във Франкфурт и Стокхолм
Пътят на едно съобщение
- Клиентът извиква услугата за съобщения през ConnectRPC.
- API приема заявката едва след като NATS JetStream е съхранил командата трайно.
- Worker записва съобщението и outbox събитие в базата данни на работното пространство в една транзакция.
- Outbox релеят публикува потвърденото събитие в NATS и Centrifugo.
- Всеки отворен клиент го получава през WebSocket; след прекъсване клиентите презареждат авторитетното състояние от API.
Чат бекенд
Всичко, което се случва в работното пространство, работи на Go: съобщения, канали, файлове, разговори, комуникация в реално време, импорти и операционният пакет за почистващи фирми. Уебсайтът никога не докосва данните на работните пространства.
- Go 1.26
-
Четири изпълними файла от една модулна кодова база: API, worker за съобщения, outbox релеят и защитена администраторска команда. Доставят се като статични изпълними файлове в един малък образ.
Защо
Силна стандартна библиотека, предвидима производителност и проста конкурентност пасват на бекенд, съставен от дълго работещи процеси. Един език за цялото ядро на работното пространство позволява то да се поддържа от един човек.
- ConnectRPC + Protobuf connect-go 1.20 · buf 1.71
-
18 услуги и 179 RPC извиквания са дефинирани в Protobuf. buf генерира Go сървъра и TypeScript клиентите с локални плъгини, така че нито една схема не напуска машината.
Защо
Един контракт обслужва уеб, настолните, мобилните и CLI клиентите. Няма ръчно писани HTTP пътища или парсване на отговори, а промяна в контракта се проявява като грешка при компилация, а не като срив по време на изпълнение.
- Една база данни на работно пространство MariaDB · sqlc
-
Всяко работно пространство получава собствена физическа база данни в MariaDB. API определя работното пространство по неговия домейн и отваря съответния пул от връзки; workers го определят отново сами и никога не се доверяват на име на база данни от съобщение в опашката. Заявките са чист SQL, компилиран до типизиран Go код със sqlc.
Защо
Изолацията е структурна, а не филтър във всяка заявка. Експортът, импортът, възстановяването и изтриването работят поотделно за всяка компания.
- NATS JetStream 2.10
-
Трайни потоци за команди, задачи и събития, плюс поток за неуспешно обработени съобщения (dead-letter). Записите на съобщения се изпълняват в 64 подредени дяла.
Защо
Съобщение се приема едва след трайно потвърждение. Съобщенията в един канал запазват реда си, а независимите канали се обработват паралелно.
- Транзакционен outbox
-
Редовете с данни на домейна и изходящото събитие се записват в една и съща транзакция. Релей публикува потвърдените събития в NATS и Centrifugo, премахва дубликатите по ID на събитието и записва неуспехите за повторен опит.
Защо
Няма изгубени или фантомни събития, когато процес спре между записа в базата данни и публикуването.
- Centrifugo v5
-
Доставка по WebSocket на съобщения, присъствие, индикация за писане и състояние на разговорите. Клиентите се абонират с краткотрайни токени за отделен канал, които API издава само след проверка на членството в работното пространство.
Защо
Отделен сървър за реално време държи дълготрайните връзки извън процеса на API, а всеки токен посочва както работното пространство, така и потребителя, така че идентичности от отделни бази данни не могат да се смесят.
- S3-съвместимо обектно хранилище aws-sdk-go-v2
-
Файловете и аватарите се съхраняват в IONOS Object Storage в ЕС и се предоставят чрез краткотрайни подписани връзки.
Защо
Файловото хранилище се мащабира независимо от базите данни и е шифровано при съхранение от страна на сървъра.
- LiveKit 1.9
-
Самостоятелно хостван WebRTC медиен сървър за разговори в лични съобщения и разговори в канали с приоритет на звука, с камера и споделяне на екрана.
Защо
С отворен код и възможност за самостоятелен хостинг, така че медията на разговорите работи върху инфраструктура, управлявана от HansaChat.
- ElevenLabs Scribe
-
Преобразуване на реч в текст за гласови съобщения. Транскрипцията се прикачва към съобщението и може да се търси и превежда като всеки друг текст.
Защо
Теренните екипи говорят повече, отколкото пишат.
- Превод с LLM
-
Превод за всеки читател поотделно чрез OpenAI-съвместим API. Всяко съобщение се превежда при поискване, кешира се веднъж за всеки целеви език и се пропуска, когато читателят вече ползва същия език.
Защо
Многоезичен екип работи в един разговор, докато всеки член чете на собствения си език. Доставчикът остава заменяем зад един интерфейс.
- Cloudflare Clef
-
Модел за вземане на решения класифицира оперативните съобщения по категория, спешност и степен на увереност. Той връща вероятности за фиксирани въпроси, а не генериран текст. В момента е в пилотна фаза.
Защо
Няма свободен текст за парсване. Ръководителите виждат какво изисква внимание; действието по него винаги остава човешко решение.
- go-pdf 0.9
-
Листове за работно време и сервизни отчети във формат A4 се генерират на сървъра.
Защо
Библиотека, написана изцяло на Go, поддържа образа на бекенда малък и без headless браузър.
- Sentry + slog
-
Грешките и трасировките отиват в Sentry, логовете са структуриран JSON от стандартната библиотека, а workers предоставят метрики в текстовия формат на Prometheus.
Защо
Малко движещи се части за поддръжка, а всеки срив пристига със своя контекст.
Приложения и CLI
Един Vue клиент обслужва уеба и се пакетира с Tauri за настолни и мобилни устройства. Клиентът за командния ред използва същия публичен API като приложенията.
- Vue 3 + TypeScript Vue 3.5 · TS 5.9 · Pinia 3
-
Един клиент със 118 еднофайлови компонента, Pinia хранилища, vue-router и vue-i18n с 23 езика на интерфейса, тестван с Vitest.
Защо
Зрял, четим компонентен модел и строг TypeScript правят големия клиент управляем за много малък екип.
- Vite + Tailwind CSS Vite 8 · Tailwind 4
-
Инструментът за компилация и слоят за стилове: Tailwind CSS 4 със светла и тъмна тема.
Защо
Бързи компилации и дизайн токени, които следват същата документирана палитра като уебсайта.
- Tauri 2.10
-
Пакетира същия уеб клиент за macOS, Windows, Linux, iOS и Android, с нативни известия, дълбоки връзки и подписани актуализации за настолни системи.
Защо
Един интерфейс навсякъде, който използва системния webview, вместо да вгражда браузърен двигател във всяко приложение.
- Генерирани Connect клиенти connect-web 2.1 · protobuf-es 2
-
TypeScript клиенти, генерирани от Protobuf дефинициите на бекенда и копирани в уеб приложението. Те никога не се редактират ръчно.
Защо
Промяна в контракта се превръща в грешка в типовете в клиента, а не в изненада в продукционна среда.
- centrifuge-js + livekit-client 5.7 · 2.20
-
Клиентските библиотеки за комуникация в реално време с Centrifugo и за разговори с LiveKit.
Защо
Повторното свързване, възстановяването и обработката на медия идват от проектите, които разработват самите сървъри.
- TipTap 3.22
-
Редакторът за съобщения, със споменавания, връзки и блокове с код с оцветяване на синтаксиса.
Защо
Структуриран редактор вместо крехка обработка на низове.
- hansa CLI Go 1.26 · Cobra
-
Клиент за командния ред без състояние за хора, скриптове и LLM агенти. Изход в JSON по подразбиране, идентификационни данни в ключодържателя на операционната система и контролни суми на изданията, подписани с Minisign.
Защо
Използва същия публичен API като приложенията. Неговите Protobuf контракти се копират от бекенда и се заключват със SHA-256 хешове, така че разминаванията се откриват в CI.
Уебсайт, таксуване и регистър
Laravel обслужва публичния сайт, документацията за клиенти, плащането, абонаментите и централния регистър на работните пространства. Той създава работно пространство, като извиква Go бекенда през удостоверен HTTP, без споделен код и без споделени опашки.
- Laravel + PHP Laravel 12 · PHP 8.5
-
Публичният уебсайт, документацията за клиенти, плащането, абонаментите, купоните, известията за жизнения цикъл и централният регистър на работните пространства и домейните.
Защо
Таксуването, пощата, планирането на задачи, опашките и формулярите са силните страни на Laravel. Чатът остава на Go, а границата между тях е един удостоверен HTTP интерфейс.
- FrankenPHP 1.13
-
PHP приложният сървър в контейнерния образ, изграден върху общ базов образ, който фиксира PHP, разширенията и инструментите му по хеш (digest).
Защо
Един процес обслужва приложението, а повторното изграждане на същия commit дава същата среда за изпълнение.
- Blade + Alpine.js + Tailwind CSS Alpine 3.15 · Tailwind 3.4 · Vite 7
-
Страници, рендирани на сървъра, с малки Alpine.js компоненти, стилизирани с Tailwind CSS и пакетирани с Vite.
Защо
Страниците със съдържание се зареждат бързо, без да се доставя рамка за едностранични приложения.
- 22 езика
-
Всяка публична страница съществува на 22 езика на ЕС, с URL адреси с езиков префикс, hreflang връзки и локализирана карта на сайта. Тест се проваля, ако на някой език липсва ключ или се показва английски текст.
Защо
Европейски продукт трябва да бъде четим на езика на купувача още от първата страница.
- Creem
-
Плащане, данъци, фактури и абонаменти, синхронизирани чрез подписани webhooks.
Защо
Плащанията, данъците и фактурирането остават при специализиран доставчик, а уебсайтът пази съгласувано копие на всеки абонамент.
- EmailLabs
-
Транзакционни и служебни имейли, например покани, връзки за парола и известия.
Защо
Доставчик на имейл услуги от ЕС за продукт от ЕС.
- Pest 4.4
-
Повече от 130 тестови файла покриват маршрути, таксуване, провизиране, преводи и SEO, включително тестове в браузър.
Защо
Бързи, четими тестове, които се изпълняват при всяка промяна.
Платформа и експлоатация
Продукционната и предварителната (preview) среда работят на IONOS в Германия. Всяко приложение се доставя като контейнерен образ със собствен Helm chart и се внедрява чрез ръчно стартирана задача в GitLab.
- IONOS Managed Kubernetes
-
Продукционни и предварителни (preview) клъстери, управлявана MariaDB и S3-съвместимо Object Storage, всичко предоставяно от германски доставчик в Германия.
Защо
Европейски доставчик под юрисдикцията на ЕС, а не регион в ЕС на неевропейски облак.
- Helm + Traefik
-
Всяко приложение има собствен chart. Traefik маршрутизира трафика в клъстера, а миграциите на базите данни на работните пространства се изпълняват като hook преди всяко внедряване на бекенда.
Защо
Всяко внедряване е версионирано, повторяемо и лесно за връщане назад.
- Bunny.net
-
CDN, DNS и защита от DDoS пред клъстера, както и хранилището за шифрованите резервни копия.
Защо
Европейска компания управлява edge слоя и съхранява резервните копия, така че нито едното, нито другото не зависи от неевропейски облак.
- Valkey + Sentinel + HAProxy Valkey 9.1
-
Три реплики с превключване при отказ чрез Sentinel и HAProxy прокси, което винаги сочи към текущия първичен възел. Обслужва кеширането, сесиите, присъствието и брокера за реално време.
Защо
Превключването при отказ не изисква промяна в приложението, защото всяка услуга продължава да комуникира със същия адрес.
- restic 0.18
-
Шифровани резервни копия на базите данни на всеки 6 часа в две локации в ЕС, със седмични проверки на целостта и автоматизирано месечно упражнение по възстановяване.
Защо
Резервното копие се брои едва след като възстановяването от него е доказано.
- GitLab CI
-
Тестовете, изграждането на образи и проверките на Helm charts се изпълняват в CI. Внедряванията в предварителната и продукционната среда са отделни, ръчно стартирани задачи.
Защо
Автоматизацията върши повтарящата се работа; човек решава кога нещо достига до клиентите.
Около продукта
Инструментите, които правят компания от един човек наблюдаема, достъпна и обяснима.
- Cloudflare Workers + D1
-
Външна страница за статус, която проверява приложението и уебсайта на всеки пет минути и регистрира инцидентите.
Защо
Наличността се измерва извън инфраструктурата, която описва.
- Umami 3.2
-
Самостоятелно хоствана уеб аналитика, която се стартира само след като посетителят е направил избор относно съгласието.
Защо
Данните за посетителите остават в инфраструктурата на HansaChat, вместо да захранват рекламна мрежа.
- Remotion 4.0
-
Продуктовите видеа се записват от реалното приложение чрез инструмента за тестове от край до край и се сглобяват в код с AI озвучаване.
Защо
Когато интерфейсът се промени, видеото се рендира наново, вместо да се снима отново.
- TwentyCRM + WireGuard
-
Самостоятелно хостван CRM, достъпен само през частна VPN мрежа.
Защо
Данните за продажбите изобщо не са изложени в публичния интернет.
Инженерни практики
Навиците, които позволяват на един човек да доставя многоклиентски (multi-tenant) продукт без отделен екип за QA или експлоатация.
Контрактите се генерират, никога не се пишат ръчно
Protobuf е единственият източник за Go сървъра, TypeScript клиентите и CLI. Генераторите са фиксирани на точни версии, а CLI записва хеша на всеки файл с контракт, който използва.
Миграциите водят регистър
Всяка база данни на работно пространство записва кои миграции са приложени в нея. Hook при внедряване прилага само липсващите и проверява отново след разгръщането. Уебсайтът запазва първоначалните си базови миграции, така че съществуващите бази данни никога не ги изпълняват два пъти.
Тестове от край до край върху изолиран стек
Една команда стартира базите данни, NATS, Valkey, Centrifugo и обектното хранилище на свободни портове, компилира изпълнимите файлове на Go, стартира уеб приложението и изпълнява 70 спецификации с Playwright с ново работно пространство за всеки тест.
Тестове на всеки слой
478 тестови функции на Go, включително тестове за изолация между две работни пространства, 109 файла с Vitest в клиента и повече от 130 файла с Pest в уебсайта.
Предпазни механизми в CI
Проверки на форматирането, ограничение от 1000 реда на Go файл и тестове на Helm charts се изпълняват в CI заедно с тестовите пакети.
Ръчни контролни точки за внедряване
CI компилира и тества автоматично, но внедряванията в предварителната и продукционната среда са отделни ръчни задачи. В продукционна среда се внедрява етикет на издание, който се създава едва след като промяната е слята.
Резервни копия, доказани с възстановявания
Всяко изпълнение на резервно копиране се наблюдава, а автоматизирано упражнение възстановява базите данни всеки месец и проверява таблиците и броя на редовете.
Една дизайн система
Уебсайтът и приложението споделят една документирана палитра, типографска скала и правила за компоненти, със светла и тъмна тема в приложението.
С помощта на AI, под човешки контрол
AI агентите за програмиране работят по файл с инструкции във всяко хранилище, който сочи към едно централно хранилище с инженерна документация. Повтаряеми работни процеси, като изпълнението на тестовете от край до край, са пакетирани като умения на агентите. Всяка промяна все така минава през същите тестове, а внедряванията остават ръчни.
Управление на сигурността в процес на подготовка
HansaChat се подготвя за сертифициране по ISO/IEC 27001 с регистър на рисковете, регистър на доказателствата и дневник на решенията. Към днешна дата не е сертифициран.
Какво твърди тази страница и какво не
Всичко по-горе описва това, което е реализирано днес и е преброено от изходните хранилища. HansaChat не твърди, че има сертификация за сигурност. Триажът на съобщения е в пилотна фаза, а push известията за затворени приложения все още не са активни.
Въпроси относно архитектурата?
Инженерите, които оценяват HansaChat, получават преки отговори от човека, който го е изградил.