ποΈ G100 Architecture
Multi-Tenancy with Self-Sufficient Instances
π― Architecture Principles
1. Option B: Self-Sufficient Instances
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β SHARED CORE MODULES β
β (NPM Packages / Shared Library) β
β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββββββββββ β
β β AUTH β β CONTRACT β β PAYMENT β β DOCUMENT GEN β β
β β Module β β Module β β Module β β (Adobe/PDF) β β
β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββββββββββ β
β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββββββββββ β
β β CRM β β BOOKING β β NFT β β i18n β β
β β Module β β Module β β Module β β Module β β
β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββΌββββββββββββββββ
β β β
βΌ βΌ βΌ
βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ
β FLO Instance β β MORELO Instance β β Future Instance β
βββββββββββββββββββ€ βββββββββββββββββββ€ βββββββββββββββββββ€
β β’ Own DB β β β’ Own DB β β β’ Own DB β
β β’ Own Frontend β β β’ Own Frontend β β β’ Own Frontend β
β β’ Own Domain β β β’ Own Domain β β β’ Own Domain β
β β β β β β
β π API Client β β π API Client β β π API Client β
β (Optional) β β (Optional) β β (Optional) β
βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ
β β β
βββββββββββββββββΌββββββββββββββββ
βΌ
βββββββββββββββββββββββββββββββ
β UNIFIED CONTRACT API β
β (Optional Central Hub) β
βββββββββββββββββββββββββββββββ
2. Why Self-Sufficient?
| Benefit | Description |
|---|---|
| Independence | Jede Instance kann offline arbeiten |
| Scalability | Kein Single Point of Failure |
| Flexibility | Eigene Tech-Stack Entscheidungen |
| Performance | Keine API-Latenz fΓΌr lokale Operationen |
| Privacy | Daten bleiben in Instance (GDPR) |
3. Shared vs Local
// SHARED (NPM Package)
import { createContract } from '@contractplattform/core';
// LOCAL (Instance-specific)
const contract = await createContract({
type: 'kfz_kaufvertrag',
instance: 'morelo',
...
});
// Wird lokal in Instance-DB gespeichert
await db.contracts.insert(contract);
// Optional: Sync to Master API
if (config.syncToMaster) {
await api.contracts.sync(contract);
}
ποΈ Database Strategy
Option: Separate D1 per Instance
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Cloudflare D1 β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β β flo-db β β morelo-db β β bavaria-db β β
β ββββββββββββββββ€ ββββββββββββββββ€ ββββββββββββββββ€ β
β β users β β users β β users β β
β β contracts β β contracts β β contracts β β
β β memberships β β vehicles β β yachts β β
β β properties β β dealers β β marinas β β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Advantages:
- β Complete data isolation
- β Instance-specific schema
- β Independent scaling
- β GDPR compliance easier
Disadvantages:
- β οΈ Cross-instance queries harder
- β οΈ Data duplication (users)
Alternative: Shared Users + Separate Assets
-- SHARED: master-db
CREATE TABLE users (
id TEXT PRIMARY KEY,
email TEXT UNIQUE,
name TEXT,
instance_id TEXT -- 'flo', 'morelo', 'bavaria'
);
-- INSTANCE: morelo-db
CREATE TABLE vehicles (
id TEXT PRIMARY KEY,
user_id TEXT, -- Reference to master-db
vin TEXT,
model TEXT,
...
);
π¦ NPM Package Structure
@contractplattform/
βββ core/ # Shared Logic
β βββ contracts/
β βββ auth/
β βββ types/
β
βββ ui/ # Shared UI Components
β βββ ContractForm/
β βββ SignatureField/
β βββ DocumentViewer/
β
βββ integrations/ # External APIs
β βββ stripe/
β βββ adobe/
β βββ salesforce/
β βββ ms-graph/
β
βββ cli/ # Instance Generator
βββ create-instance
Usage in Instance
{
"name": "morelo-dealer-suite",
"dependencies": {
"@contractplattform/core": "^1.0.0",
"@contractplattform/ui": "^1.0.0",
"@contractplattform/integrations": "^1.0.0"
}
}
π API Connection (Optional)
Instances kΓΆnnen optional mit Master API verbinden:
Scenario 1: Full Independence
// FLO Instance - Komplett eigenstΓ€ndig
const contract = await db.contracts.create({
type: 'membership',
...
});
// Keine API-Verbindung nΓΆtig
Scenario 2: Sync to Master
// MORELO Instance - Sync fΓΌr Analytics
const contract = await db.contracts.create({
type: 'kfz_kaufvertrag',
...
});
// Optional: Push to Master fΓΌr Cross-Instance Analytics
if (config.features.centralAnalytics) {
await api.contracts.sync({
instance_id: 'morelo',
contract: contract,
});
}
Scenario 3: Shared Services
// Bavaria Instance - Nutzt Shared Document Generation
const contract = await db.contracts.create({
type: 'yacht_kaufvertrag',
...
});
// Document Generation via Master API (Adobe Express)
const pdf = await api.documents.generate({
contract_id: contract.id,
template: 'yacht_kaufvertrag_de',
instance_id: 'bavaria',
});
π Tech Stack per Instance
FLO
Frontend: SwiftUI (iOS Native)
Backend: TBD (Node.js / Cloudflare Workers?)
Database: D1 / PostgreSQL
Auth: Firebase Auth / Custom
Payments: Stripe
Booking: MS Bookings
MORELO
Frontend: SvelteKit (PWA)
Backend: Hono (Cloudflare Workers)
Database: Cloudflare D1
Auth: JWT (Custom)
Payments: Stripe + Leasing APIs
CRM: Salesforce
Hardware: ESP32 (MQTT)
ContractPlattform
Frontend: SvelteKit
Backend: SvelteKit API Routes
Database: Prisma + PostgreSQL / D1
Auth: MS Graph OAuth
Payments: Stripe
CRM: Custom
Future (Bavaria, Porsche, etc.)
Template: Copy from MORELO
Adjust: Asset Type, Vocabulary, Integrations
Deploy: Independent Cloudflare Workers
π Authentication Strategy
Per-Instance Auth
Shared User Pool (Optional)
// Master Auth Service (Optional)
POST /api/v1/auth/login
{
"email": "max@example.com",
"password": "...",
"instance_id": "morelo"
}
Response:
{
"token": "eyJhbGc...",
"user": {
"id": "usr_123",
"email": "max@example.com",
"instances": ["morelo", "bavaria"] // Multi-Instance Access
}
}
π Data Flow Example
MORELO: Fahrzeugkauf End-to-End
sequenceDiagram
participant Kunde
participant Frontend
participant Backend
participant D1 Database
participant Salesforce
participant Adobe
participant Blockchain
Kunde->>Frontend: Konfiguriert Fahrzeug
Frontend->>Backend: POST /konfigurator
Backend->>D1 Database: Save Configuration
Kunde->>Frontend: Erstellt Angebot
Frontend->>Backend: POST /contracts
Backend->>D1 Database: Create Contract (Draft)
Backend->>Adobe: Generate PDF
Adobe-->>Backend: PDF URL
Backend->>D1 Database: Update Contract
Backend-->>Frontend: Contract + PDF
Kunde->>Frontend: Unterschreibt
Frontend->>Backend: POST /contracts/{id}/sign
Backend->>D1 Database: Update Status (Signed)
Backend->>Salesforce: Create Opportunity
Salesforce-->>Backend: Opportunity ID
Backend->>D1 Database: Link to Salesforce
Note over Backend: Bei Fahrzeug-Auslieferung
Backend->>Blockchain: Mint NFT
Blockchain-->>Backend: Token ID
Backend->>D1 Database: Update Contract (NFT)
Backend-->>Frontend: Contract Complete
π Deployment Strategy
Per Instance
# wrangler.toml (MORELO)
name = "morelo-dealer-suite"
main = "src/index.ts"
compatibility_date = "2024-01-01"
[[d1_databases]]
binding = "DB"
database_name = "morelo-db"
database_id = "xxx"
[vars]
INSTANCE_ID = "morelo"
API_URL = "https://api.contractplattform.dev" # Optional
# wrangler.toml (FLO)
name = "flo-backend"
main = "src/index.ts"
[[d1_databases]]
binding = "DB"
database_name = "flo-db"
database_id = "yyy"
[vars]
INSTANCE_ID = "flo"
API_URL = "https://api.contractplattform.dev" # Optional
Domains
morelo.contractplattform.dev β MORELO Instance
flo.contractplattform.dev β FLO Instance
bavaria.contractplattform.dev β Bavaria Instance
api.contractplattform.dev β Master API (Optional)
π Migration Path
Phase 1: Independent Instances (NOW)
- β MORELO lΓ€uft eigenstΓ€ndig
- β FLO lΓ€uft eigenstΓ€ndig
- β ContractPlattform lΓ€uft eigenstΓ€ndig
- β Keine Verbindung untereinander
Phase 2: Shared Modules (Q2 2026)
- π Extract common code to NPM packages
- π Refactor Instances to use
@contractplattform/core - β Instances bleiben eigenstΓ€ndig
Phase 3: Optional API (Q3 2026)
- π Deploy Master API
- π Instances kΓΆnnen optional syncen
- β Weiterhin full independence
Phase 4: Cross-Instance Features (Q4 2026)
- π User can have accounts in multiple instances
- π Shared Analytics Dashboard
- π Cross-Instance Notifications
Next: i18n & Vocabulary β