Homelab MSI

Architektur · Homelab · August 2026

Linux-Host wing im Heimnetz. Öffentliche Dienste laufen hinter einem ausgehenden Cloudflare Named Tunnel — der Router bleibt zu.

Host wing · 192.168.0.104 Domain b2badgen.com Tunnel ausgehend, kein Port-Forward Stack Docker · systemd --user
MSI Homelab Gesamt-Setup: Nutzer, Cloudflare-Edge, MSI-Host, LAN und Datenquellen
Gesamtbild — antippen zum Vergrößern. Darunter dieselben Bausteine, lesbar in der Blog-Spalte.
Prinzip: Der MSI holt Verbindungen über Cloudflare heraus. Öffentlich sind nur stockwing.b2badgen.com (App + MCP) und grok.b2badgen.com (Terminal). Filme und LAN-Direktzugriff bleiben im Heimnetz.

Internet-Edge (Cloudflare)

basic auth StockWing Web

  • Named Tunnel → Caddy :80 → Next.js
  • Login: wingman1 (Caddy basic_auth)

secret path MCP + Sheets-API

https://stockwing.b2badgen.com/s/<geheim>/mcp
  • Tunnel-Pfad ^/s/… → MCP :3101 (ohne Caddy-Auth)
  • Grok-Tool get_stock_brief
  • REST: /search, /sheet, /brief

basic auth Grok Web-Terminal

  • Named Tunnel → ttyd :7681 → interaktive Shell
  • dort: grok wie lokal am MSI

MSI Linux-Host · wing

docker compose StockWing App-Host

Caddy :80Reverse-Proxy · basic_auth · Access-Log
app (Next.js) :3000UI · /api/search · /api/stock · DCF · Guidance
pyservice (FastAPI) :8001yfinance · SEC/EDGAR · Finnhub · FRED · SimFin

svc Begleitdienste

  • stockwing-mcp — Node :3101, ruft stockwing-brief.py
  • grok-terminal — ttyd :7681, nur localhost
  • cloudflared-app-host — Named Tunnel, Hosts stockwing + grok
  • ollama.service — lokales LLM, Fallback / offline

Ports (lokal / LAN)

:80 Caddy / StockWing :3101 MCP (localhost) :7681 ttyd (localhost) :8096 Jellyfin (LAN)

Wer nutzt was

Thomas (Owner)

  • MSI vor Ort / Desktop-Icons
  • StockWing Web + Grok-Terminal
  • Nutzungs- & Watchlist-Mails
  • Grok CLI + MCP-Tools (lokal)

Yannick (Dev)

  • Code per Git / E-Mail-Patch
  • StockWing testen (Web)
  • Deploy-Mails → MSI
  • optional SSH im Heimnetz

Andere / unterwegs

  • Browser → stockwing.b2badgen.com
  • Chrome → grok.b2badgen.com
  • Grok App → StockWing-MCP
  • Handy/TV → Jellyfin (nur WLAN)

Automation & Mail

timer Tägliche Nutzung

  • 06:30 UTC → Caddy-Access-Log
  • Mail an Thomas + Yannick
  • Ticker, Sessions, Browser

timer Watchlist-Essay

  • 07:00 UTC → HTML-Report
  • Snapshots unter data/watchlist-essay/

Deploy-Pfade

  • deploy.sh (git pull + build)
  • Mail-Deploy (Yannick → Grok)
  • Desktop: StockWing-Mail-Deploy

Nur Heimnetz (LAN)

lan Jellyfin Media

http://192.168.0.104:8096
  • Docker: media-server/ · Filme: WD Elements USB
  • Mount: /mnt/wd-elements
  • Desktop: Filme-Stream starten/stoppen
  • kein Cloudflare / nicht öffentlich

LAN-Direktzugriff StockWing

http://192.168.0.104/
  • gleiche Caddy-Auth wie öffentlich

Desktop-Shortcuts

  • StockWing starten / stoppen
  • StockWing-Mail-Deploy
  • Filme-Stream starten / stoppen

Sicherheitsmodell

  • Kein Port-Forward am Router
  • Tunnel nur ausgehend
  • Web-App: Basic Auth
  • MCP: langer geheimer URL-Pfad
  • ttyd: eigenes Passwort + nur localhost
  • Secrets nur unter private/ & .env
  • Jellyfin bleibt im LAN

Externe Datenquellen

Marktdaten (pyservice)

  • Yahoo Finance (Default), SEC EDGAR
  • Finnhub, Alpha Vantage, SimFin, FRED, FMP

Cloud-Integrationen (Grok MCP)

  • Gmail · Calendar · Drive · Outlook · Tasks · Voice
  • StockWing-Brief (dieses Setup)

Wichtige Pfade

  • ~/app-host/ — App, Caddy, Scripts, Secrets
  • ~/app-host/data/caddy-logs/ — Zugriffe StockWing
  • ~/app-host/private/ — Passwörter, MCP-Token
  • ~/.cloudflared/config.yml — Tunnel-Ingress
  • ~/.grok/skills/stockwing-analyse/ — Analyse-Skill
  • ~/Backups/ — MSI-StockWing-Backups

Dienste (systemd --user, aktiv): cloudflared-app-host · grok-terminal · stockwing-mcp · ollama · stockwing-daily-usage.timer · stockwing-watchlist-essay.timer · cloudflared-stockwing-mcp (Quick-Tunnel-Fallback)

Dokumentation auf dem Host: ~/app-host/README.md · GROK-TERMINAL.md · DEPLOY.md · MAIL-DEPLOY.md · mcp-stockwing/README.md · media-server/README.md