Zum Inhalt

Plattform-Architektur – Übersicht

Architekturprinzipien

Die Home Dev Platform folgt diesen Leitprinzipien:

  • Service-orientiert – jeder Service hat eine klar definierte Verantwortung und eigene API
  • Containerisiert – alle Komponenten laufen als Docker-Container (Docker Compose)
  • API-first / Headless – Backend-Services exponieren REST APIs, kein Server-Side-Rendering
  • Path-based Routing – ein einziger Einstiegspunkt (Traefik) routet über URL-Prefixes
  • Keine offenen Ports – Zugriff von außen ausschließlich über Cloudflare Tunnel
  • AI-assisted Development – Claude Code CLI direkt auf dem Pi als Entwicklungsumgebung

C4-Ebene 1: System Context

«person»Nutzer Zugriff über Browser(Desktop/Mobile)«person»Entwickler Christoph - Entwicklung,Betrieb, Konfiguration«external_system»Cloudflare DNS + Tunnel + TLSKein offener Port amHeimrouter«external_system»GitHub Remote Git Repositorymatu-pi/matus-toolbox«external_system»Tailscale VPN Sicherer Remote-Zugrifffür Entwicklung undWartung«system»Home Dev Platform Microservice-Plattform aufRaspberry PiTraefik · Frontend ·Backend-Services ·PostgreSQLHTTPS-ZugriffCloudflare Tunnel (keinoffener Port)git push / pullgit pull (manuell)SSH + VS Code Remote (überTailscale)VPN-VerbindungNetzwerktunnel
Akteur Beschreibung
Nutzer Greift über Browser (Desktop/Mobile) via Cloudflare auf die Plattform zu
Entwickler Christoph – Entwicklung, Betrieb und Weiterentwicklung per SSH/Tailscale
Cloudflare DNS + TLS-Terminierung + Tunnel (kein offener Port am Heimrouter)
GitHub Remote Git Repository (matu-pi/matus-toolbox)
Tailscale VPN für sicheren Remote-Zugriff des Entwicklers

Service-Landkarte

Die folgende Tabelle gibt einen vollständigen Überblick über alle dokumentierten Services – sowohl laufende als auch geplante.

Service Docs Status Laufender Container API-Prefix
Hello World docs ✅ Laufend backend :8000 /api/notes
Lunch Scraper docs ✅ Laufend backend :8000 /api/lunch
Push Alerts docs ✅ Laufend backend :8000 /api/alerts
Trading Journal docs ✅ Laufend backend :8000 /api/trading
Trading Data Layer docs ✅ Laufend trading-data-layer :8001 /data-layer
Trend Analysis docs ✅ Laufend trend-analysis :8002 /trend-analysis/api/v1
Trade Optimizer docs ✅ Laufend trade-optimizer :8004 /trade-optimizer/api/v1
Fundamental Analysis docs ⚠️ In Trend Analysis trend-analysis :8002 /trend-analysis/api/v1/fundamental
Market Interpretation docs ⚠️ In Trend Analysis trend-analysis :8002 /trend-analysis/api/v1/interpretation

Legende: - ✅ Laufend — implementiert und als Docker-Container aktiv - ⚠️ In anderem Service — implementiert, aber noch nicht als eigener Container ausgelagert


C4-Ebene 2: Container-Architektur

«system_boundary»«boundary»Raspberry Pi - Docker Host[System]«container_boundary»«boundary»Application Services[Container]«container»Traefik[Reverse Proxy v2.11] Routing via PathPrefix,Port 80 nach außen«container»Frontend[React/Vite PWA] Single Page App,Path: /«container»PostgreSQL[PostgreSQL 15] Schema public: notesSchema market_data:forex_ohlcv,economic_events,economic_indicators,correlation_data«container»Backend[FastAPI :8000] Hello World · Lunch ScraperPush Alerts · Trading JournalAuth · Users · Logs · SystemPath: /api  strip  /«container»Trading Data Layer[FastAPI :8001] Forex/Economic CollectorPath: /data-layer  strip  /«container»Trend Analysis[FastAPI :8002] Technische Indikatoren,Fundamental Analysis,Interpretation, Trade-SetupPath: /trend-analysis  strip /«container»Trade Optimizer[FastAPI :8004] Score-Aggregation, MTF,Mustererkennung (5min)Path: /trade-optimizer strip  /«person»Nutzer«person»Entwickler«external_system»Cloudflare Tunnel TLS-Terminierung, keinoffener PortHTTPSCloudflare TunnelPathPrefix /PathPrefix /apiPathPrefix /data-layerPathPrefix /trend-analysisPathPrefix /trade-optimizerHTTP intern (asyncio.gather)Score, MTF, Trade-SetupSchreiben: OHLCV, Events,IndikatorenLesen: OHLCV fürIndikatorenLesen: 5min OHLCV fürMustererkennungLesen/Schreiben: notesSSH/Tailscale - Verwaltung

Laufende Container (Stand: 2026-06-26)

Container Image / Port Path-Prefix Netzwerk Beschreibung
Traefik traefik:v2.11 :80 web Reverse Proxy, Routing-Einstiegspunkt
Frontend React/Vite :80 / web Single Page App (PWA), alle UI-Tabs
Backend FastAPI :8000 /api web + internal Hello World, Lunch Scraper, Push Alerts, Trading Journal, Auth, User-Mgmt, Logs
Trading Data Layer FastAPI :8001 /data-layer web + internal Forex/Economic Datensammler (Scheduler)
Trend Analysis FastAPI :8002 /trend-analysis web + internal Technische Indikatoren, Fundamentalanalyse, Marktinterpretation
Trade Optimizer FastAPI :8004 /trade-optimizer web + internal Score-Aggregation, MTF, Mustererkennung
PostgreSQL postgres:15 internal (nur) Persistenz für alle Services

Docker-Netzwerke

Netzwerk Teilnehmer Zweck
web Traefik + alle App-Services + Frontend HTTP-Kommunikation über Traefik
internal Alle App-Services + PostgreSQL DB-Zugriff (PostgreSQL nicht von außen erreichbar)

Routing

Traefik Path-Based RoutingNutzerCloudflareTraefikFrontendBackendTradingTrendTradeNutzerNutzerCloudflareTunnelCloudflareTunnelTraefik:80Traefik:80Frontend:80Frontend:80Backend:8000Backend:8000TradingData Layer:8001TradingData Layer:8001TrendAnalysis:8002TrendAnalysis:8002TradeOptimizer:8004TradeOptimizer:8004HTTPS RequestHTTP (Tunnel)PathPrefix(/) - Prio Standard→ React SPAPathPrefix(/api) - strip /api→ FastAPI /health, /notesPathPrefix(/data-layer) - strip /data-layer→ /health, /collectors/*PathPrefix(/trend-analysis) - strip /trend-analysis→ /api/v1/interpretation, /fundamental/*, /trade-setup, /calendar/*PathPrefix(/trade-optimizer) - strip /trade-optimizer→ /api/v1/trade-optimizer/analyze, /librarydata-layer, trend-analysis, trade-optimizerhaben priority=100 (vor dem catch-all /)

Traefik routet ausschließlich über PathPrefix-Regeln. Services mit priority=100 werden vor dem catch-all Prefix / (Frontend) bevorzugt.

Eingehender Pfad Ziel-Service Strip-Prefix Effektiver Pfad im Service
/ Frontend :80 /
/api/... Backend :8000 /api /...
/data-layer/... Trading Data Layer :8001 /data-layer /...
/trend-analysis/... Trend Analysis :8002 /trend-analysis /...
/trade-optimizer/... Trade Optimizer :8004 /trade-optimizer /...

Service-Kommunikation

Service-Kommunikation (inter-service)NutzerFrontendTrend AnalysisTrade OptimizerTrading Data LayerPostgreSQLNutzer(Browser)Nutzer(Browser)Frontend(React SPA)Frontend(React SPA)Trend Analysis:8002Trend Analysis:8002Trade Optimizer:8004Trade Optimizer:8004Trading Data Layer:8001Trading Data Layer:8001PostgreSQLmarket_dataPostgreSQLmarket_dataTrendanalyse / Fundamentalanalyse (direkt vom Frontend)Tab: Trend AnalysisGET /trend-analysis/api/v1/interpretation?pair=EUR/USD&timeframe=1hGET /trend-analysis/api/v1/fundamental/score?pair=EUR/USDSELECT forex_ohlcv, economic_indicatorsScore, Kategorie, IndikatorenTrade Optimizer (kombinierter Abruf)Tab: Trade OptimizerGET /trade-optimizer/api/v1/trade-optimizer/analyze?pair=EUR/USDasyncio.gather (parallel)GET /api/v1/interpretation?pair=...&timeframe=1h (Trend Score)GET /api/v1/fundamental/score?pair=... (Fundamental Score)GET /api/v1/interpretation?pair=...&timeframe=15min (MTF)GET /api/v1/interpretation?pair=...&timeframe=4h (MTF)GET /api/v1/interpretation?pair=...&timeframe=daily (MTF)SELECT forex_ohlcv WHERE timeframe=5min (Mustererkennung)trend, fundamental, mtf, setup, patternsGET /trade-optimizer/api/v1/trade-optimizer/libraryPATTERN_LIBRARY (statisch)Datensammlung (Hintergrund, kein User-Trigger)INSERT forex_ohlcv (5min OHLCV, Scheduler)INSERT economic_eventsINSERT economic_indicators

Frontend → Services (via Traefik)

Das Frontend kommuniziert direkt mit den Services über die öffentlichen Pfade:

Frontend → /trend-analysis/api/v1/interpretation?pair=EUR/USD&timeframe=1h
Frontend → /trend-analysis/api/v1/fundamental/score?pair=EUR/USD
Frontend → /trade-optimizer/api/v1/trade-optimizer/analyze?pair=EUR/USD
Frontend → /trade-optimizer/api/v1/trade-optimizer/library

Trade Optimizer → Trend Analysis (intern, parallel)

Der Trade Optimizer ruft beim /analyze-Request fünf Trend-Analysis-Endpoints parallel auf (asyncio.gather + httpx):

to → http://trend-analysis:8002/api/v1/interpretation?pair=...&timeframe=1h   (Trend Score)
to → http://trend-analysis:8002/api/v1/fundamental/score?pair=...              (Fundamental Score)
to → http://trend-analysis:8002/api/v1/interpretation?pair=...&timeframe=15min (MTF)
to → http://trend-analysis:8002/api/v1/interpretation?pair=...&timeframe=4h   (MTF)
to → http://trend-analysis:8002/api/v1/interpretation?pair=...&timeframe=daily (MTF)

Trading Data Layer (Hintergrund-Scheduler)

Der Trading Data Layer sammelt Daten ohne User-Trigger: - Forex OHLCV (5min-Kerzen, 4 Währungspaare) → market_data.forex_ohlcv - Economic Events (Wirtschaftskalender) → market_data.economic_events - Economic Indicators (Makrodaten) → market_data.economic_indicators


Datenarchitektur

Schema public (Hello World Backend)

Tabelle Beschreibung
notes Einfache Notizen (id, title, content, created_at)

Schema market_data (Trading Services)

Tabelle Beschreibung Schreiber Leser
forex_ohlcv OHLCV-Kerzen je Währungspaar und Timestamp Trading Data Layer Trend Analysis, Trade Optimizer
economic_events Wirtschaftskalender-Ereignisse Trading Data Layer Trend Analysis
economic_indicators Makroökonomische Indikatoren (CPI, Zinsen etc.) Trading Data Layer Trend Analysis
correlation_data Rohstoff-/Korrelationsdaten Trading Data Layer Trend Analysis

C4-Ebene 3: Komponentenbeschreibung

Service-Struktur (Muster je Service)Jeder Application ServiceTrading Services (konkret)React SPA(Frontend)Traefik(Proxy)FastAPI(Backend)PostgreSQL(Datenbank)Frontend(React/Vite)TraefikTrend Analysis :8002Trade Optimizer :8004Trading Data Layer :8001PostgreSQLmarket_data

Traefik

Verantwortung: Einziger nach außen exponierter Einstiegspunkt (Port 80).
Routing per PathPrefix, Strip-Prefix-Middleware, Docker-Label-Discovery.
Konfiguration: traefik/traefik.yml (kein Dashboard, kein HTTPS intern – TLS liegt bei Cloudflare).

Frontend (React/Vite PWA)

Verantwortung: Single Page Application mit allen UI-Tabs.
Tabs: Trendanalyse · Fundamentalanalyse · Trade Optimizer · Dokumentation
Routing: clientseitig (React). API-Calls direkt gegen Traefik-Pfade.

Backend

Verantwortung: Zentraler App-Service, der mehrere fachliche Domänen als Router-Module bündelt.

Router Prefix Beschreibung
auth /auth Login, JWT-Token, /me
users /users User-CRUD, Rollenverwaltung
notes /notes Hello-World CRUD (Referenzimplementierung)
lunch /lunch Lunch-Scraper: Accounts, Scrape-Trigger, Bestellübersicht
trading /trading Trading Journal: Trade-CRUD, Statistiken
alerts /alerts Push Alerts: VAPID, Subscriptions, Trigger-Regeln, Reminder
logs /logs Log-Viewer
system /system System-Übersicht

Trend Analysis (inkl. Fundamentalanalyse und Marktinterpretation)

Verantwortung: Alle marktanalytischen Berechnungen – technisch, fundamental und interpretativ.
Enthält aktuell die Funktionalität dreier dokumentierter Services: Trend Analysis, Fundamental Analysis und Market Interpretation.

Endpoint-Gruppe Logischer Service Beschreibung
/api/v1/ohlcv, /heikin-ashi Trend Analysis Rohdaten aus DB
/api/v1/indicators/* Trend Analysis EMA, RSI, MACD, Bollinger Bands, SuperTrend, Squeeze, Force Index
/api/v1/interpretation Market Interpretation Gesamtinterpretation (Score, Kategorie, Indikatoren) je Zeitrahmen
/api/v1/trade-setup Trend Analysis Entry/SL/TP-Level basierend auf Indikatoren
/api/v1/fundamental/* Fundamental Analysis Makro-Score, Sentiment, Treiber
/api/v1/calendar/today Fundamental Analysis Wirtschaftskalender für heute

Trading Data Layer

Verantwortung: Datenbeschaffung und -persistierung (Hintergrundprozess).
Sammelt Forex OHLCV (5min), Economic Events und Indikatoren via externen APIs.
Betrieben mit internem Scheduler (kein Cron auf Host-Ebene nötig).

Trade Optimizer

Verantwortung: Ableitung von Trade-Setups und Mustererkennung.

Endpoint Beschreibung
/api/v1/trade-optimizer/analyze Kombinierter Haupt-Endpoint (trend + fundamental + MTF + setup + patterns)
/api/v1/trade-optimizer/library Statische Musterbibliothek (14 Muster mit SVG + Erklärungen)
/api/v1/trade-optimizer/setup Nur Setup-Ableitung
/api/v1/trade-optimizer/patterns Nur Mustererkennung
/health Datenbankstatus

PostgreSQL

Verantwortung: Einzige persistente Datenhaltung.
Nur im internal-Netzwerk erreichbar. Healthcheck via pg_isready vor Service-Start.


Sicherheitsarchitektur

Mechanismus Beschreibung
Cloudflare Tunnel Kein offener Port am Heimrouter; TLS-Terminierung bei Cloudflare
Netzwerk-Isolation PostgreSQL nur im internal-Netzwerk, nicht von außen erreichbar
Kein direkter Zugriff Alle externen Requests gehen über Traefik
Secret Management Credentials als Umgebungsvariablen (.env), nicht im Code
HTTPS TLS vollständig bei Cloudflare, intern HTTP

Remote Development Setup

Remote Development SetupEntwicklerLaptopTailscale VPNRaspberry PiDockerClaude CLIEntwicklerEntwicklerLaptop(macOS/Linux)Laptop(macOS/Linux)Tailscale VPNTailscale VPNRaspberry Pi(SSH :22)Raspberry Pi(SSH :22)DockerEnvironmentDockerEnvironmentClaude CLI(claude-code)Claude CLI(claude-code)VS Code (lokal)VPN-VerbindungTailscale-NetzwerkSSH Remote Development(VS Code Remote SSH Extension)Claude Code CLI(claude-sonnet-4-6)Service-Entwicklungdocker compose up --build -d <service>docker compose logs -f <service>docker compose exec <service> bashKI-gestützte EntwicklungDirekter Datei-Zugriff auf /home/matu/projectsKein separates Deployment notwendig
Komponente Details
Laptop → Pi VS Code Remote SSH via Tailscale
Versionierung Git auf dem Pi, Remote: GitHub (git pull manuell nach Push)
KI-Unterstützung Claude Code CLI (claude-sonnet-4-6) direkt auf dem Pi
Container-Entwicklung docker compose up --build -d <service> nach Code-Änderung

Wichtig: docker compose restart übernimmt keine Code-Änderungen (reused Image).
Immer docker compose up --build -d <service> verwenden.


Deployment-Workflow

Deployment-WorkflowEntwicklerGitHubRaspberry PiDockerEntwickler(Laptop)Entwickler(Laptop)GitHub(remote)GitHub(remote)Raspberry Pi(SSH)Raspberry Pi(SSH)DockerComposeDockerComposeCode-Änderung deployengit push origin masterSSH (über Tailscale)git pullBei Remote liegt immer ein Commit vor→ git stash && git pull --rebase && git stash popdocker compose up --build -d <service>--build: rebuild Image (Code-Änderungen einschließen)-d: detachedNICHT: docker compose restart(nimmt keine Code-Änderungen mit!)Build Image + Start ContainerService läuftNeuen Service hinzufügendocker compose up --build -d <neuer-service>Service muss in docker-compose.yml definiert seinmit Traefik labels (PathPrefix, strip-prefix, Port)
# 1. Änderungen pushen
git push origin master

# 2. Auf Pi: aktuellen Stand holen
git stash && git pull --rebase && git stash pop && git push

# 3. Service neu bauen und starten
docker compose up --build -d <service>

# 4. Logs prüfen
docker compose logs -f <service>

Technologiestack

Schicht Technologie
Host Raspberry Pi (ARM64)
Runtime Docker + Docker Compose
Reverse Proxy Traefik v2.11
Backend-Services Python 3.11 + FastAPI + SQLAlchemy (async)
Frontend React 18 + Vite + Custom CSS
Datenbank PostgreSQL 15 (Alpine)
Externer Zugriff Cloudflare Tunnel
Remote Development Tailscale VPN + VS Code Remote SSH + Claude Code CLI
Versionierung Git → GitHub

Changelog

Version Datum Änderungen
1.0 2026-06-26 Initiale Version – konsolidiert und ersetzt phase2.md; beschreibt implementierten Ist-Stand mit allen laufenden Services; vollständige Service-Landkarte inkl. geplanter und zusammengelegter Services