# πŸ›οΈ Systemarchitektur & Technologie-Stack Dieses Dokument beschreibt die interne Architektur von MindSift, die Interaktion zwischen den Systemkomponenten, das Concurrency- und Thread-Safety-Modell sowie die Deployment-Strategie. --- ## 🧩 1. Schichten-Architektur MindSift ist als monolithische, hochperformante Single-Binary-LΓΆsung konzipiert. Das Go-Backend liefert sowohl die REST- und WebSocket-Schnittstellen aus als auch die vorkompilierte React Single Page Application (SPA) als eingebettetes statisches Dateisystem (`embed.FS`). ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Frontend (React 18) β”‚ β”‚ Vite β€’ TypeScript β€’ Tailwind CSS β€’ Lucide β€’ Motion β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ HTTPS REST / WSS WebSocket β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Go Chi Routing Layer β”‚ β”‚ CORS β€’ RealIP β€’ Recoverer β€’ Auth / Role Guard β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ Business Engine β”‚ Gorilla WebSocket β”‚ β”‚ Triage β€’ Tasks β€’ Alarms β”‚ Rooms β€’ Hub β€’ Doc-Locking β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ Storage Abstraction β”‚ β”‚ sqlite.go (modernc.org/sqlite pure Go, WAL-Mode) β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β–Ό β–Ό /data/mindsift.db /data/workspace/ (SQLite Datenbank) (Physische .md Dateien) ``` --- ## πŸ› οΈ 2. Technologie-Stack ### Backend (Go 1.23) - **HTTP Routing:** [`github.com/go-chi/chi/v5`](https://github.com/go-chi/chi) – Minimalistischer, idiomatisch schneller Router mit Middleware-Ketten. - **WebSocket Hub:** [`github.com/gorilla/websocket`](https://github.com/gorilla/websocket) – Verbindungs-Upgrade, Keep-Alive/Ping-Pong und Room-Multiplexing. - **Datenbank-Treiber:** [`modernc.org/sqlite`](https://gitlab.com/cznic/sqlite) – CGO-freier, rein in Go ΓΌbersetzter SQLite-Treiber fΓΌr einfache plattformΓΌbergreifende Kompilierung und Containerisierung ohne GCC-Toolchain. - **Authentifizierung:** [`github.com/golang-jwt/jwt/v5`](https://github.com/golang-jwt/jwt) (HMAC-SHA256 Token) und [`golang.org/x/crypto/bcrypt`](https://pkg.go.dev/golang.org/x/crypto/bcrypt) fΓΌr Passwort-Hashing. ### Frontend (React 18 SPA) - **Build-Tool:** [Vite 5](https://vitejs.dev/) fΓΌr schnelles Hot-Module-Replacement (HMR) und optimierte Production-Bundles. - **Sprache:** TypeScript 5 mit strikter Typisierung. - **Design & Layout:** [Tailwind CSS 3](https://tailwindcss.com/) in Verbindung mit dem MindSift Single-File CSS Theming System. - **Icons & Animationen:** [Lucide React](https://lucide.dev/) und [Framer Motion](https://www.framer.com/motion/) fΓΌr Gesten, Karten-Swipes und ÜbergΓ€nge. --- ## πŸ“ 3. Verzeichnisstruktur des Projekts ``` MindSift/ β”œβ”€β”€ cmd/ β”‚ └── server/ β”‚ └── main.go # Einstiegspunkt: Initialisierung, Config, Store, Start β”œβ”€β”€ internal/ β”‚ β”œβ”€β”€ api/ β”‚ β”‚ β”œβ”€β”€ server.go # HTTP-Routen, Handler-Methoden, Middleware β”‚ β”‚ └── server_test.go # Integrationstests fΓΌr alle REST- und Ingest-Routen β”‚ β”œβ”€β”€ auth/ β”‚ β”‚ β”œβ”€β”€ auth.go # JWT Validierung, Token-Erstellung, Context-Helpers β”‚ β”‚ └── apikey.go # API-Key Erzeugung (mindsift_sec_...) & SHA-256 Hashing β”‚ β”œβ”€β”€ config/ β”‚ β”‚ └── config.go # Environment-Variablen (PORT, DATA_DIR, JWT_SECRET, SMTP) β”‚ β”œβ”€β”€ domain/ β”‚ β”‚ └── models.go # Go-Structs fΓΌr Thought, Document, List, User, Team etc. β”‚ β”œβ”€β”€ storage/ β”‚ β”‚ β”œβ”€β”€ sqlite.go # DB-Schema, CRUD-Operationen, Queries, Migrationen β”‚ β”‚ └── storage_test.go # Unit-Tests fΓΌr Speicheroperationen β”‚ └── ws/ β”‚ └── hub.go # WebSocket Client, Room-Management, Locking-Mechanismus β”œβ”€β”€ frontend/ β”‚ β”œβ”€β”€ src/ β”‚ β”‚ β”œβ”€β”€ components/ # Wiederverwendbare UI-Elemente (Modals, Avatar, MenΓΌs) β”‚ β”‚ β”œβ”€β”€ context/ # MobileActionContext (Mobile Bottom Bar State) β”‚ β”‚ β”œβ”€β”€ features/ β”‚ β”‚ β”‚ β”œβ”€β”€ auth/ # SetupWizard & Login β”‚ β”‚ β”‚ β”œβ”€β”€ capture/ # InstantCaptureBar (Schnelleingabe) β”‚ β”‚ β”‚ β”œβ”€β”€ help/ # Integrierte Benutzerdokumentation β”‚ β”‚ β”‚ β”œβ”€β”€ lists/ # Geteilte Listen & Einkauf β”‚ β”‚ β”‚ β”œβ”€β”€ settings/ # Benutzer-, Admin- & Theme-Einstellungen β”‚ β”‚ β”‚ β”œβ”€β”€ teams/ # Gruppen & Mitglieder-Management β”‚ β”‚ β”‚ β”œβ”€β”€ triage/ # Triage-Deck, Aufgabenliste, Kanban & TaskModal β”‚ β”‚ β”‚ └── workspace/ # Outliner-Editor, Datei-Explorer, Wiki & Rollup β”‚ β”‚ β”œβ”€β”€ lib/ # api.ts (HTTP/WS Client), types.ts, theme.ts β”‚ β”‚ β”œβ”€β”€ themes/ # EigenstΓ€ndige Theme CSS-Dateien (dark, light, etc.) β”‚ β”‚ β”œβ”€β”€ App.tsx # Root-Komponente, Navigation, Top/Bottom Bars β”‚ β”‚ └── main.tsx # React DOM Bootstrap β”‚ β”œβ”€β”€ package.json β”‚ └── vite.config.ts β”œβ”€β”€ Doku/ # Dieses technische Wiki β”œβ”€β”€ Dockerfile # Multi-Stage Build Definition └── compose.yaml # Docker Compose Vorlage fΓΌr Produktivbetrieb ``` --- ## ⚑ 4. Thread-Safety & Concurrency-Modell Da SQLite Datei-basiert arbeitet und Go standardmÀßig hochgradig nebenlΓ€ufig (Multi-Threaded via Goroutines) operiert, sind folgende Schutzmaßnahmen implementiert: ### 1. SQLite Pragmas & WAL-Modus Im Storage-Layer ([`internal/storage/sqlite.go`](../internal/storage/sqlite.go)) wird die Datenbankverbindung beim Start zwingend mit folgenden DSN-Pragmas konfiguriert: ```go dsn := filepath.Join(dataDir, "mindsift.db") + "?_pragma=busy_timeout(10000)&" + "_pragma=journal_mode(WAL)&" + "_pragma=synchronous(NORMAL)&" + "_pragma=foreign_keys(1)" ``` - **`journal_mode(WAL)`:** Write-Ahead Logging erlaubt parallele Leser (`SELECT`), wΓ€hrend ein Schreiber (`INSERT`/`UPDATE`) aktiv ist. Leser blockieren niemals Schreiber und Schreiber blockieren niemals Leser. - **`busy_timeout(10000)`:** Sollte ein Schreibvorgang kurzzeitig blockiert sein, wartet SQLite bis zu 10.000 ms (10 Sekunden), bevor ein `SQLITE_BUSY` Fehler geworfen wird. - **`foreign_keys(1)`:** Erzwingt referenzielle IntegritΓ€t und automatische Kaskadierungs-LΓΆschungen (`ON DELETE CASCADE`). ### 2. Connection Pool Begrenzung SQLite unterstΓΌtzt nur einen einzigen Schreib-Thread zur gleichen Zeit: ```go db.SetMaxOpenConns(8) db.SetMaxIdleConns(4) db.SetConnMaxLifetime(time.Hour) ``` ### 3. Cursor-Deadlock-Vermeidung > **Kritische Backend-Regel:** Niemals verschachtelte Abfragen bei offenem `*sql.Rows`-Cursor ausfΓΌhren! In Go hΓ€lt ein offener Cursor eine Verbindung aus dem Pool besetzt. FΓΌhrt der Code innerhalb von `for rows.Next()` eine weitere Abfrage auf `s.db` aus, kann der Connection-Pool bei mehreren parallelen Benutzern innerhalb von Millisekunden einfrieren. *Pattern:* Alle Zeilen werden sofort vollstΓ€ndig in ein Go-Slice gelesen, `rows.Close()` wird ausgefΓΌhrt, und erst danach werden verknΓΌpfte EntitΓ€ten geladen. --- ## 🌐 5. Deployment & Container-Architektur MindSift wird als schlanker, autarker Docker-Container ausgeliefert: 1. **Stage 1 (Frontend Build):** `node:20-alpine` kompiliert TypeScript und generiert statische Assets nach `frontend/dist/`. 2. **Stage 2 (Backend Build):** `golang:1.23-alpine` bettet `frontend/dist/` via `//go:embed` ein, fΓΌhrt Unit-Tests aus und kompiliert ein statisches Binary (`mindsift-server`). 3. **Stage 3 (Production Runtime):** `alpine:3.20` mit `ca-certificates` und `tzdata`. Das finale Image ist ca. 45 MB groß und benΓΆtigt keine externen Datenbankserver oder AbhΓ€ngigkeiten. Alle persistenten Daten befinden sich in einem einzigen Verzeichnis `/data`: - `/data/mindsift.db` (SQLite Hauptdatenbank inklusive WAL-Journal und Shared-Memory-Dateien) - Notizen und Workspace-BlΓΆcke werden zu 100% in der SQLite-Datenbank persistiert (keine losen Markdown-Dateien auf der Festplatte).