Architektura
Decyzje i granice modułów.
TanStack Start obsługuje web i API w jednym procesie Node.js. Postgres jest osobną usługą. Moduły config, domain, db, ui i observability mają oddzielne odpowiedzialności. Sekrety są odczytywane wyłącznie w kodzie serwerowym.
ADR 001: jeden deploy aplikacji
Monorepo porządkuje kod, ale nie wymusza mikroserwisów. Worker pg-boss dodajemy dopiero dla długich importów lub analiz; korzysta z tego samego schematu i wspólnej logiki domenowej. Migracje wykonuje jeden proces, a worker czeka na wymagany schemat.
Eksporty SSR
SSR wybiera warunek module przed node, a lucide-react jest bundlowany. Bez tego pakiet ikon wybiera CommonJS i ładuje osobną instancję Reacta, przez co dokumentacja nie renderuje się na serwerze. Test HTTP wymaga nagłówka H1 już w odpowiedzi HTML.
Izolacja sekretu auth
Railway kopiuje zmienne przy tworzeniu PR Environment. Efektywny sekret Better Auth wyprowadzamy przez HMAC-SHA256 z głównego sekretu Railway i losowego składnika z prywatnej bazy danego środowiska. Składnik powstaje raz przy starcie aplikacji, ma 256 bitów i jest zachowywany przy restartach oraz ponownym seedzie. Nowe preview ma pustą, oddzielną bazę, więc otrzymuje nowy zakres klucza.
Składnik bazy nie jest udostępniany przez API ani logi. Odtworzenie sesji wymaga kopii bazy z tym składnikiem oraz głównego sekretu ze storage Railway. Wdrożenie tej zmiany do istniejącego środowiska unieważnia dotychczasowe sesje jeden raz; konta i notatki pozostają zachowane. Podział danych nadal egzekwuje osobna baza i sieć Railway.