Daten Suche Backups & Integrationen¶
Projekt-Datenbankschema (PostgreSQL, Schema: core)
Allgemein
- Datenbank: mf_app
- Schema: core
- Standardsuchpfad: core, public
Tabellen
- securities
- Zweck: Stammdaten je Wertpapier
- Spalten: isin (PK), name, country, sector, industry, currency, active_flag (bool, default true), added_at (timestamptz)
- Schlüssel: PK (isin)
- listings
- Zweck: Zuordnung ISIN ↔ Börsenlisting
- Spalten: isin (FK → securities.isin, ON DELETE CASCADE), mic, ticker, primary_flag (bool), source, valid_from (date), valid_to (date)
- Schlüssel: PK (isin, mic)
- Indizes: UX ux_listings_primary_one (isin) WHERE primary_flag
- fx_rates
- Zweck: Wechselkurse für EUR‑Umrechnung
- Spalten: date, base (default 'EUR'), quote, rate, source, fetched_at (timestamptz)
- Schlüssel: PK (date, base, quote)
- prices_daily
- Zweck: Tageskurse und Indikatoren je Listing
- Spalten: isin (FK), date, mic, close_local, close_eur, adj_close_eur, volume, sma200, high_52w, high_3d, drawdown, source
- Schlüssel: PK (isin, date, mic)
- Indizes: idx_prices_daily_isin_date (isin, date)
- corporate_actions
- Zweck: Splits/Dividenden für Adjustierungen
- Spalten: isin (FK), date, type ('split'|'dividend'), ratio, amount, currency, note, source
- Schlüssel: PK (isin, date, type)
- liquidity
- Zweck: Liquiditätskennzahlen (Ø‑Umsatz/Volumen)
- Spalten: isin (FK), window_days (30|90), avg_turnover_local, avg_turnover_eur, avg_volume, last_updated (timestamptz)
- Schlüssel: PK (isin, window_days)
- fundamentals
- Zweck: Fundamentaldaten für Magic‑Formula
- Spalten: isin (FK), period_end (date), period_type ('TTM'|'Annual'|'Quarterly'), ebit, total_debt, cash, nwc, ppe, total_assets, current_liab, shares_out, source, confidence ('high'|'med'|'low'), last_updated (timestamptz)
- Schlüssel: PK (isin, period_end, period_type)
- mf_rank
- Zweck: Magic‑Formula‑Ranking je Region/Monat
- Spalten: region, run_month (date), isin (FK), earn_yield, cap_return, rank_ey, rank_cr, rank_sum, percentile, confidence ('high'|'med'|'low')
- Schlüssel: PK (region, run_month, isin)
- Indizes: idx_mf_rank_region_month_pct (region, run_month, percentile)
- signals
- Zweck: Täglicher Signalstatus mit Regelaufschlüsselung
- Spalten: isin (FK), asof_date (date), status ('yes'|'no'), rule_breakdown (jsonb), reason (text), cooldown_until (date), last_flip_at (date)
- Schlüssel: PK (isin, asof_date)
- alerts_log
- Zweck: Protokoll der verschickten Alerts
- Spalten: alert_id (bigserial, PK), isin (FK), timestamp (timestamptz, default now), prev_status ('yes'|'no'), new_status ('yes'|'no'), channel, delivered, message_id
- market_state
- Zweck: Fear-&-Greed‑Wert/Quelle pro Tag
- Spalten: date (PK), fear_greed_value, delta_5d, source, components (jsonb), fetched_at (timestamptz)
- news_cache
- Zweck: Cache von Schlagzeilen je ISIN (für manuelle KI-Auswertung)
- Spalten: id (bigserial, PK), isin (FK), fetched_at (timestamptz), headline, url, source, sentiment
- ai_evaluations
- Zweck: Manuelle KI‑Bewertungen mit Begründung
- Spalten: eval_id (bigserial, PK), isin (FK), timestamp (timestamptz), inputs_ref (jsonb), recommendation ('yes'|'no'|'hold'), rationale (text), model_version
- config
- Zweck: Konfiguration/Parameter
- Spalten: key (PK), value, scope (default 'global'), updated_at (timestamptz)
- job_runs
- Zweck: Monitoring der n8n‑Jobläufe
- Spalten: job_name, started_at (timestamptz, default now), finished_at (timestamptz), status ('ok'|'fail'|'partial'), rows_affected, error_message
- Schlüssel: PK (job_name, started_at)
- data_quality
- Zweck: Tracking von Datenqualitäts‑Issues
- Spalten: entity, ref_key, issue_type, severity ('low'|'med'|'high'), note, detected_at (timestamptz, default now), resolved_at (timestamptz)
- Schlüssel: PK (entity, ref_key, detected_at)
Hinweise
- Alle FK auf securities haben ON DELETE CASCADE.
- Preise/Indikatoren werden täglich aktualisiert (EU 18:30, US 23:30 Europe/Berlin).
- MF‑Ranking monatlich (5. US‑Handelstag).
- Fear & Greed: Original mit Proxy‑Fallback (Quelle im Feld source markiert).
- Confidence‑Flags in fundamentals/mf_rank kennzeichnen Datenqualität (US=high, EU je nach Quelle).
Daten Suche Backups & Integrationen¶
Seitenregeln¶
- Single Source of Truth für Persistenz (DB/Storage/Indices), Datenflüsse nach außen (APIs/Webhooks) und Sicherung/Wiederherstellung.
- Technische Verträge/Endpunkte dokumentieren; keine Policy‑Texte (z. B. DSGVO → „Sicherheit & Compliance“).
- Backups/Restore praxisnah dokumentieren und regelmäßig verproben; Tests hier protokollieren.
- Keine Geheimniswerte; nur Referenzen/Orte.
- Aktualisieren bei: Schema‑Änderungen (high level), neue/angepasste APIs/Webhooks, Backup‑Plan‑Anpassungen.
- Verweise auf: „Betrieb, Observability & Notfälle“ (Restore‑Runbooks), „Sicherheit & Compliance“ (Datenklassen/Retention‑Policy).
- Benenne betroffene Dateien inkl. Pfad als Unterpunkte, wenn für zukünftige Änderungen relevant.
Zweck und Abgrenzung¶
- Zweck: Dokumentation aller Datenhaltungen (DB/Volumes), externen Datenquellen (APIs), Import-/Exportpfade sowie Backup/Restore‑Vorgehen für „n8n aktien“.
- Abgrenzung: Keine Sicherheits‑/Compliance‑Regeln (eigene Seite). Keine ToDo‑Listen (eigene Seite).
Primärdatenbanken (Typ/Version, Schemata high level)¶
- PostgreSQL 16 (Container: n8n-n8n-postgres-1; Image: postgres:16-alpine)
- Datenbank: mf_app (Owner: mf_app; Encoding: UTF8)
- Schema: core (Standard search_path: core, public)
- Haupttabellen (Auszug; vollständig auf „Architektur & Entscheidungen“):
- core.securities, core.listings, core.fx_rates, core.prices_daily, core.corporate_actions
- core.liquidity, core.fundamentals, core.mf_rank, core.signals, core.alerts_log
- core.market_state, core.news_cache, core.ai_evaluations, core.config
- core.job_runs, core.data_quality
- Indizes:
- idx_prices_daily_isin_date (prices_daily: isin, date)
- idx_mf_rank_region_month_pct (mf_rank: region, run_month, percentile)
- ux_listings_primary_one (unique WHERE primary_flag)
Datei‑/Objektspeicher/Volumes¶
- PostgreSQL-Volume: n8n_n8n_pg_data
- Mount im Container: /var/lib/postgresql/data
- Host-Pfad (Docker-managed): /var/lib/docker/volumes/n8n_n8n_pg_data/_data
- n8n (Flows/Credentials): im n8n‑Container (Standard n8n‑Persistenz gemäß Deployment)
Suche/Indexe¶
- Postgres als einzige Such-/Abfrage‑Schicht (kein externer Suchindex).
- Performance‑relevante Indizes siehe oben (prices_daily, mf_rank, listings).
Exporte/Importe (Formate, Verträge)¶
- Importe (laufend, automatisiert via n8n):
- Kurse (Stooq): CSV (HTTP GET, s={TICKER}.de, i=d) → Parsing in Zeilen → Upsert core.prices_daily.
- Kurse (Alpha Vantage, Fallback): JSON (function=TIME_SERIES_DAILY, datatype=json, outputsize=compact) → Parsing → Upsert core.prices_daily.
- Marktproxy (VIX via Stooq): CSV (s=vi.c) → Parsing → Mapping zu Fear-&-Greed‑Proxy → Upsert core.market_state.
- Listing‑Mapping (OpenFIGI): JSON (POST /v3/mapping; idType=ID_ISIN, idValue, micCode=XETR) → Set → Upsert core.securities/core.listings.
- Eingabe (manuell):
- ISIN via n8n‑Form („Form: Add ISIN“) → Workflow „mf_workflow - Add Security (ISIN → Listing → Prices)“.
- Exporte:
- Aktuell keine periodischen Exporte konfiguriert (Abfragen erfolgen direkt gegen Postgres; Dashboards lesen live).
Backups (Was/Wann/Womit, Aufbewahrung)¶
- PostgreSQL:
- Aktueller Stand: keine automatisierten Backups konfiguriert (Fakt).
- Empfohlener Ist‑Pfad (manuell bereits verprobt möglich):
- Logischer Dump: pg_dump -Fc -d mf_app → Artefakt: ./backups/mf_app_YYYYMMDD.dump
- Volume‑Snapshot (Docker/Host): Snapshot des Volumes n8n_n8n_pg_data
- Aufbewahrung: noch nicht formal festgelegt (siehe ToDo‑Seite für Planung).
- n8n:
- Workflow‑Exports: manuell via UI (JSON‑Export je Workflow), noch keine Automatisierung.
Restore‑Prozeduren und Testprotokoll¶
- PostgreSQL:
- Restore (logischer Dump): createdb mf_app_restore → pg_restore -d mf_app_restore ./backups/mf_app_YYYYMMDD.dump
- Aktueller Teststatus: kein Restore‑Test ausgeführt (Fakt).
- n8n:
- Workflow‑Import via UI (JSON), kein Testlauf dokumentiert (Fakt).
APIs und Webhooks (Auth, Limits, Versionierung)¶
- OpenFIGI
- Endpoint: https://api.openfigi.com/v3/mapping (POST)
- Auth: Header Auth (X-OPENFIGI-APIKEY; Credential „openfigi_api“; Allowed Domain: api.openfigi.com)
- Format: JSON; Body ist Array (idType, idValue, optional micCode)
- Nutzung: Primärlisting/Ticker‑Mapping (XETR bevorzugt)
- Alpha Vantage
- Endpoint: https://www.alphavantage.co/query (GET)
- Auth: Query Auth (apikey=…; Credential „alpha_vantage“; Allowed Domains: www.alphavantage.co)
- Nutzung: TIME_SERIES_DAILY (datatype=json, compact) als Fallback für Kurse
- Limits: Free‑Tier Rate‑Limits (Fehlermeldungen berücksichtigt)
- Stooq
- Endpoint: https://stooq.com/q/d/l/ (GET)
- Auth: keine
- Nutzung: Daily‑Kurse (CSV), VIX‑Proxy (Symbol vi.c)
- Webex
- Status: noch nicht angebunden (Bot noch nicht erstellt)
- SimFin, Financial Modeling Prep (FMP)
- Credentials vorhanden (Query Auth); derzeit noch nicht in Workflows eingebunden (Fakt).
Integrationen zu Drittsystemen (Verträge/Kompatibilität)¶
- n8n (Community Edition)
- Workflows produktiv:
- „mf_workflow - Add Security (ISIN → Listing → Prices)“
- Knoten (Auszug, in Reihenfolge): Form: Add ISIN → OpenFIGI: ISIN → XETR mapping → Set: ISIN+Name+Ticker+MIC → PG: Upsert security → PG: Upsert listing (XETR) → AlphaVantage: Daily (compact, JSON) → Code: Parse AV JSON → rows → PG: Upsert prices (AV, last 100) → Stooq: Daily CSV (full) → Code: Parse Stooq CSV → rows → PG: Upsert prices (Stooq, full) → PG: Update indicators (SMA200/52W/3D) → PG: Compute signal (price-only test) → PG: Inspect last signal (Utility)
- „Market State Update“
- Knoten: VIX Fetch (Stooq vi.c) → VIX Parse (Proxy‑Berechnung) → Market State Upsert (Postgres)
- „mf_workflow - Add Security (ISIN → Listing → Prices)“
- Credentials (ausgewählte): openfigi_api (Header Auth), alpha_vantage (Query Auth), simfin (Query Auth), fmp (Query Auth), Postgres (mf_app)
- Workflows produktiv:
- Metabase
- Status: noch nicht installiert/angebunden (Fakt).