Start / Methoden & Systeme / Beyond AI/FinCrimeOS: Behind the Scenes – Von 0 auf Produktion

Beyond AI/FinCrimeOS: Behind the Scenes – Von 0 auf Produktion

Titelbild zur beitrag: Beyond AI/FinCrimeOS: Behind the Scenes - Von 0 auf Produktion
Beyond AI/FinCrime OS · Build Log

Behind the Scenes:
Von 0 auf Produktion

Ein ehrlicher Bericht darüber, was gebaut wurde, was schiefging, und warum fünf Minuten Warten manchmal die einzige Lösung ist.

FinCrime Watchdog · 2026 · github.com/endvater/beyond-ai

Was ist Beyond AI/FinCrime OS?

Beyond AI/FinCrime OS ist ein Open-Source-Projekt für FinCrime Compliance über föderative KI-Agenten. Das Ziel: Compliance-Aufgaben — Sanctions Screening, Horizon Scanning, OSINT-Recherche — nicht über einen monolithischen KI-Blob abzuwickeln, sondern über spezialisierte, unabhängig deploybare Agenten, die miteinander kommunizieren.

Sprint 1 ist der Sanctions Screener. Kein Luxus-Feature, sondern das Fundament: Bevor ein System behaupten darf, es mache Compliance, muss es zumindest in der Lage sein, einen Namen gegen Sanktionslisten zu prüfen.

Das Endergebnis läuft unter sanction.endvater.de/search. Eine Testabfrage für „Wladimir Putin“ liefert zwei Treffer mit Score 0.9 — einmal aus den Sanctions-Daten, einmal aus den PEP-Daten. „Max Mustermann“ liefert null Treffer. Beides wie erwartet.

Der Weg dorthin war — nennen wir es — lehrreich.


Der Stack

Lokal (Entwicklung)

KomponenteRolle
FastAPI + uvicornAPI-Backend
yenteOpenSanctions selbst-gehostet, Port 8100
ElasticSearch 8.15Index-Backend für yente
Neo4j 5 CommunityKnowledge Graph
Ollama (kimi-k2.5:cloud)LLM-Gateway, Claude API als Fallback

Produktion (Hostinger KVM 2)

Ein einzelner Server: 8 GB RAM, 4 vCPU, 100 GB NVMe, Ubuntu 22.04. Kein Kubernetes, kein Managed Service, kein Cloud-Provider der einem monatlich einen Brief schickt. Nur ein VPS und Docker Compose.

Was diesen Server interessant macht: Er lief bereits. Darauf liefen schon Traefik v3 als Reverse Proxy, eine Neo4j-Instanz, Ollama mit einem Cloud-Relay-Modell, Chroma und weitere Services. Neu hinzugekommen sind für Beyond AI/FinCrime OS: ElasticSearch, yente und das FastAPI-Backend.

API-Endpoints

  • GET /search?q=NAME Browser-Suche mit HTML + JSON
  • POST /api/screen REST API für programmatischen Zugriff
  • GET /api/status Health-Check

Netzwerk-Topologie

Docker-Compose-Projekte leben standardmäßig in ihrer eigenen Netzwerk-Blase. Das ist gut für Isolation, schlecht wenn man Services aus anderen Projekten wiederverwenden will. Da auf diesem Server bereits Traefik, Neo4j und Ollama aus anderen Projekten laufen, muss der beyond-ai-api-Container explizit in deren Netzwerke eingehängt werden.

Ein Container, vier Netzwerke. Das ist kein Designfehler, sondern die bewusste Entscheidung, geteilte Infrastruktur zu nutzen statt alles zu duplizieren.

Container-Netzwerk-Topologie
beyond-ai-api
┃ ┃ ┃ ┃
beyond-ai-internal proxy (Traefik) neo4j4ruth_default ollama-eksw_default
↓
yente + ES SSL-Terminierung Neo4j 5 Ollama (kimi-k2.5)

RAM-Budget auf 8 GB

ServiceRAMStatus
neo4j~1,0 GBwiederverwendet
ollama (kimi-k2.5:cloud)~0,3 GBwiederverwendet
chroma + openclaw + traefik~0,5 GBwiederverwendet
ElasticSearch1,0 GBneu
yente~0,4 GBneu
beyond-ai-api~0,2 GBneu
OS + Docker~1,5 GBbasis
Gesamt~4,9 GB✅

ElasticSearch ist mit 1 GB Heap-Größe konfiguriert — das absolute Minimum, aber für den Use Case ausreichend. yente indiziert bei jedem Start die Datensätze neu in ES, das ist der teuerste Moment.


Die Probleme

Kein Produktions-Deployment läuft beim ersten Versuch durch. Wer das behauptet, lügt oder hat sehr kurze Deployments. Hier ist, was tatsächlich passiert ist:

01

Docker Desktop lief nicht

Bevor auch nur eine Zeile Code geprüft werden konnte: Docker Desktop war auf dem Entwicklungsrechner nicht aktiv. Kein Container, keine hilfreiche Fehlermeldung, nur stille Verweigerung.

Docker Desktop starten. Erwähnenswert, weil es die Art von Problem ist, über die man nicht schreibt — und dann sitzt man zwanzig Minuten davor.
02

Das Repository hatte kein Dockerfile

Das GitHub-Repo existierte, aber ohne die nötigen Build-Artefakte. Kein Dockerfile, keine requirements.txt, keine main.py. Diese mussten von Grund auf erstellt werden:

sanctions/src/main.py ── FastAPI-Backend requirements.txt ── fastapi, uvicorn, httpx Dockerfile ── Python 3.11-slim

Das ist kein Bug, sondern der Zustand eines Projekts in einem frühen Sprint — die Infrastruktur wird zusammen mit dem Code entwickelt.

03

Falscher ENV-Variablenname bei yente

yente nimmt eine ElasticSearch-URL als Konfiguration entgegen. Die naheliegende Vermutung:

YENTE_ELASTICSEARCH__URL=http://elasticsearch:9200 ← falsch

Funktioniert nicht. yente ignoriert diese Variable stillschweigend. Der korrekte Name:

YENTE_INDEX_URL=http://elasticsearch:9200 ← korrekt
Gefunden durch Inspektion des yente-Quellcodes — nicht durch Dokumentation. Einer dieser Momente, in denen man sich fragt, ob Dokumentation für Menschen geschrieben wird oder als theoretisches Konzept existiert.
04

Falsches yente Manifest-Format

yente benötigt ein Manifest, das die zu ladenden Datensätze beschreibt. Die index.json von OpenSanctions direkt zu referenzieren lag nahe — enthält sie doch Metadaten zu allen Datensätzen. Das Problem: Sie enthält keine direkt verwendbaren FtM-Entity-Ressourcen im erwarteten Format.

datasets: – name: sanctions entities_url: https://data.opensanctions.org/datasets/latest/sanctions/entities.ftm.json – name: peps entities_url: https://data.opensanctions.org/datasets/latest/peps/entities.ftm.json
Pragmatisch, aber fragil — bei einer Breaking-Change an der URL-Struktur bricht das Manifest. Für Sprint 1 akzeptabel.
05

Falsches HTTP-Verb für yente /match

Die yente-Dokumentation erwähnt einen /match-Endpoint. Getestet mit GET, wie man es für eine Suche intuitiv erwartet. Funktioniert nicht. yente /match erwartet POST mit einem spezifischen FtM-Body:

{ „queries“: { „q1“: { „schema“: „Person“, „properties“: { „name“: [„Wladimir Putin“] } } } }
Das FtM-Format (FollowTheMoney) ist das Datenmodell von OpenSanctions. schema meint hier nicht JSON-Schema, sondern den Entitätstyp — Person, Organization, Vessel.
06

Datenindizierung dauert fünf Minuten

Beim ersten Start lädt yente die kompletten Datensätze herunter und indiziert sie in ElasticSearch. Das sind etwa 1,7 Millionen Entitäten. Das dauert.

Kein Fehler, keine Fehlermeldung, kein Fortschrittsbalken der Mut macht. Wer nicht weiß, dass das normal ist, fängt an, Container neu zu starten — was die Indizierung von vorne beginnen lässt.

Geduld. Das ist unbefriedigend, aber wahr.
07

Let’s Encrypt ACME-Challenge schlägt fehl

Das komplizierteste Problem. Traefik war so konfiguriert, dass globale HTTP→HTTPS-Redirects auf Entrypoint-Ebene aktiv waren:

–entrypoints.web.http.redirections.entrypoint.to=websecure

Klingt vernünftig. Das Problem: Let’s Encrypt validiert neue Domains über HTTP-01-Challenges. Der ACME-Client fragt über HTTP an, bekommt einen 301 auf HTTPS zurück, folgt dem Redirect, landet bei einer 404, und die Challenge schlägt fehl.

# Per-Router Redirect statt globaler Redirect labels: – „traefik.http.routers.beyond-ai-http.rule=Host(`sanction.endvater.de`)“ – „traefik.http.routers.beyond-ai-http.entrypoints=web“ – „traefik.http.routers.beyond-ai-http.middlewares=redirect-to-https“
Die globalen Redirect-Zeilen entfernen, stattdessen per-Router Redirects als Labels. So greift der Redirect erst nach der SSL-Terminierung, nicht davor — und Let’s Encrypt kann die Challenge ungestört abarbeiten.
08

Alle neuen Files mussten erst ins Repository

Klingt trivial, ist eine echte Stolperfalle: Der Server klont das GitHub-Repository. Was nicht committed und gepusht ist, existiert auf dem Server nicht.

Dockerfile, docker-compose.prod.yml, manifest.yml — alles lokal erstellt, lokal getestet, aber noch nicht im Remote-Repo.

Lokal entwickeln → committen → pushen → auf dem Server pullen → deployen. Das ist offensichtlich in der Theorie und wird in der Praxis regelmäßig übersprungen.

Was am Ende läuft

Zwei Suchanfragen als Smoke-Test:

q = „Wladimir Putin“
2 Treffer
Score 0.9 · Sanctions + PEP
Putin steht auf EU-Sanktionslisten und ist als PEP klassifiziert.
q = „Max Mustermann“
0 Treffer
Keine Einträge.
Ebenfalls korrekt.

Die Endpoints sind erreichbar, SSL-Zertifikat von Let’s Encrypt wird über Traefik automatisch erneuert. Kein manueller Aufwand für Zertifikate.


Ausblick: Sprint 2 & Sprint 3

Sprint 2

Horizon Scanning

Automatisiertes Monitoring von FATF-Veröffentlichungen, EU-Regulierungsentwürfen, BaFin-Rundschreiben. Das System erkennt neue Compliance-relevante Developments frühzeitig und bereitet sie strukturiert auf.

Ollama Claude Fallback Klassifikation Relevanz-Scoring
Sprint 3

OSINT

Strukturierte Informationsgewinnung aus offenen Quellen für Enhanced Due Diligence. Negative News Screening, Corporate-Ownership-Graphen, Verbindungsanalyse.

Neo4j Graph-Analyse EDD News Screening

Der gesamte Code ist öffentlich: github.com/endvater/beyond-ai

Dieser Artikel dokumentiert den tatsächlichen Entwicklungsprozess — einschließlich der Fehler. Kein Vendor-Whitepaper, kein „es lief einfach“. Wer selbst baut, kennt das.

KI-Experiment · FinCrime Watchdog · Redaktion: Jürgen Schiller García · Modell: Claude (Anthropic)
Markiert: