JiriUhlirandClaude Opus 5 78e7f99d60 Konektory do Postgresu, pristupove udaje sifrovane
Pristupove udaje konektoru se ukladaji do databaze a prezijou restart. Popis
v documentation/14-databaze.md.

Databaze je volitelna a rezimy jsou oddelene:
- postgres kdyz je DATABASE_URL i SECRETS_KEY
- memory jinak, tedy pri nasazenem mockupu a lokalnim vyvoji bez DB

Rozhodnuti je jen na jednom miste (src/data/connectorStore.ts). Nikde jinde se
nezjistuje, jestli databaze je - kdyby se to rozlezlo po kodu, jedno misto by se
zapomnelo a chovalo by se pak jinak nez zbytek.

Chybejici databaze nesmi shodit start: container, ktery nenastartuje, je pro
AppFactory nefunkcni sluzba. Misto toho se do logu napise proc a portal to ukaze
na strance Konektory. Stejne tak kdyz migrace selzou - psat do rozbiteho
schematu je horsi nez neukladat.

Databaze potrebuje oboji. Bez SECRETS_KEY by se udaje ukladaly v plaintextu
a to je horsi nez ztratit je pri restartu: tabulku vidi kazda zaloha a kazdy
dump pri ladeni.

Pridano:
- pool v src/db/pool.ts vcetne transakci a dbFor(tenantId) jako sev pro budouci
  oddelenou databazi jednoho klienta
- migrace ze src/db/migrations/*.sql pod pg_advisory_lock, jinak je pri rolling
  deployi pusti vsechny instance naraz. Jeden soubor je jedna transakce
- sifrovani AES-256-GCM s nahodnym IV a verzi klice. Nerozsifrovatelna hodnota
  nepada, chova se jako nevyplnena a zaloguje se - jeden rozbity konektor nesmi
  shodit seznam ostatnich
- /health/ready s pingem do DB. /health na databazi zamerne nezavisi, kratky
  vypadek by jinak vedl k restartovani containeru
- GET /api/dashboard/storage a hlaska v portalu o tom, ze data jsou jen v pameti
- jediny vychozi konektor na firmu a sluzbu hlida castecny unikatni index, ne jen
  kod. Dva soubezne zapisy by jinak udelaly dva vychozi

Zmeneno: cteni i zapis konektoru je asynchronni, vcetne validace stromu.

Overeno proti Postgresu 16 v kontejneru: migrace, sifrovani v tabulce, preziti
restartu, rozsifrovani spravnym klicem, degradace pri spatnem klici, PATCH bez
tajneho pole, prepnuti a smazani vychoziho konektoru, pametovy rezim bez
DATABASE_URL. Kontejner po overeni smazan.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-12 15:08:25 +02:00
2026-07-31 14:42:26 +00:00

csbot-prototype

Web a klientsky portal firmy zamerene na automatizace, voiceboty, integrace, dashboardy, tickety a incident management.

Jedna aplikace v jednom containeru: Express obsluhuje API i zbuildovanou React aplikaci. Bezi v AppFactory za reverse proxy na /apps/<app-id>.

Rychly start

npm install
npm run build
npm start

Aplikace nasloucha na 0.0.0.0:3000.

Lokalni vyvoj s hot reloadem (API na 3000, web na 5173):

npm run dev

Povinne endpointy

Cesta Ucel
/health Health check pro AppFactory, vraci 200
/docs Swagger UI
/openapi.json OpenAPI definice

Verejne pres proxy jako /apps/<app-id>/health a /apps/<app-id>/docs.

Demo prihlaseni

E-mail Heslo Role
admin@automia.cz demo1234 interni spravce
klient@firma.cz demo1234 klient

Environment variables

Promenna Povinna Vychozi Popis
PORT ne 3000 Port containeru, urcuje AppFactory sablona
ROOT_PATH ne prazdne Prefix proxy, napr. /apps/csbot-prototype
JWT_SECRET ano v produkci - Podpis tokenu, bez nej aplikace nenastartuje
JWT_EXPIRES_IN ne 8h Platnost tokenu
PUBLIC_ORIGIN ne prazdne Verejna domena pro absolutni adresy webhooku
CORS_ORIGIN ne localhost Povolene originy, jen pro lokalni vyvoj

Secrets se nikdy nelogují ani neukladaji do kodu.

Skripty

Prikaz Co dela
npm run build Zbuilduje server i web do dist/
npm start Spusti zbuildovanou aplikaci
npm run dev Vyvoj s hot reloadem
npm run typecheck Kontrola typu bez generovani vystupu

Dokumentace

Podrobnosti jsou ve slozce documentation/. Pred upravou projektu staci precist ji, neni nutne prochazet cely kod.

Pravidla pro AI asistenty a nastroje jsou v AGENTS.md.

S
Description
No description provided
Readme
2.8 MiB
Languages
TypeScript 91.8%
JavaScript 6.4%
HTML 1.5%
CSS 0.3%