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>
This commit is contained in:
co-authored by
Claude Opus 5
parent
3279dd7dac
commit
78e7f99d60
@@ -75,6 +75,37 @@ export const config = {
|
||||
*/
|
||||
publicOrigin: (process.env.PUBLIC_ORIGIN ?? '').trim().replace(/\/+$/, ''),
|
||||
|
||||
// ------------------------------------------------------------------ databaze
|
||||
|
||||
/**
|
||||
* Pripojeni do Postgresu, napr. postgres://user:pass@host:5432/csbot
|
||||
*
|
||||
* Prazdna hodnota je platny stav: aplikace jede v pameti procesu. Container,
|
||||
* ktery nenastartuje kvuli chybejici promenne, je pro AppFactory nefunkcni
|
||||
* sluzba (AGENTS.md), takze se na tom nepada.
|
||||
*/
|
||||
databaseUrl: (process.env.DATABASE_URL ?? '').trim(),
|
||||
/**
|
||||
* Klic pro sifrovani pristupovych udaju konektoru.
|
||||
*
|
||||
* Ma to byt nahodny retezec, ne heslo. Jak ho vygenerovat je
|
||||
* v documentation/14-databaze.md.
|
||||
*
|
||||
* Bez nej se konektory neukladaji do databaze ani kdyz je nastavena -
|
||||
* plaintext v tabulce je horsi nez ztrata dat pri restartu.
|
||||
*/
|
||||
secretsKey: (process.env.SECRETS_KEY ?? '').trim(),
|
||||
/**
|
||||
* Kolik spojeni si smi vzit jedna instance.
|
||||
*
|
||||
* Nizke cislo je zamer: worker nesmi drzet spojeni po dobu volani ciziho API,
|
||||
* takze i pri stovce soubeznych kroku staci par spojeni. Podrobnosti
|
||||
* v documentation/10-runtime-a-kapacita.md.
|
||||
*/
|
||||
databasePoolMax: positiveNumber(process.env.DATABASE_POOL_MAX, 10),
|
||||
/** Spravovane databaze vyzaduji TLS. */
|
||||
databaseSsl: process.env.DATABASE_SSL === 'true',
|
||||
|
||||
// ------------------------------------------------------- skripty konektoru
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user