Wie eurocoeff seine Daten täglich aktualisiert
Eines der häufigsten Fragen, die uns erreichen: Woher kommen die Daten auf eurocoeff, und wie kann ich sicher sein, dass sie korrekt sind? Diese Seite beschreibt im Detail die Daten-Pipeline, die Quellen und die Validierungsschritte. Wir haben sie absichtlich transparent gehalten — sowohl weil Vertrauen die Basis für Datenseiten ist, als auch weil ehrlicher Methodik-Disclosure ein zentraler Aspekt der UEFA-Koeffizientendebatte ist.
Die Daten-Quelle
eurocoeff bezieht Spielergebnisse aus zwei Hauptquellen:
- football-data.org — eine etablierte, lizenzierte API für Live-Spielergebnisse, Tabellen und Wettbewerbsdaten. Diese liefert die Echtzeit-Updates während der CL-, EL- und UECL-Spieltage.
- 5-jahres-wertung.de — eine deutsche Schwesterseite, die historische Koeffizientendaten der UEFA seit den 1970er Jahren pflegt. Diese liefert die historische Basis für unsere Archive und stellt die Daten zur Verfügung, die direkt aus offiziellen UEFA-Veröffentlichungen abgeleitet sind.
Wir scrapen nicht direkt von uefa.com. Stattdessen arbeiten wir mit Datenanbietern, die offizielle UEFA-Daten lizenziert beziehen, und ergänzen das mit der umfangreichen historischen Datenbank von 5-jahres-wertung.de.
Die Pipeline-Architektur
Hier ist der genaue Ablauf, der jede Nacht und während der Spieltage läuft:
- 06:15 UTC täglich: Ein Cron-Job auf einem Hostinger-VPS startet einen Docker-Container mit dem Scraper. Der Scraper holt aktuelle Spielergebnisse und Tabellenstände von den Quellen.
- Datenbank-Update: Die geholten Daten werden in eine PostgreSQL-16- Datenbank geschrieben (eurocoeff-postgres Container). Diese Datenbank dient als Source-of-Truth und enthält die volle Historie aller Scrape-Runs für Audit-Zwecke.
- API-Endpoint: Ein Fastify-API-Container (eurocoeff-api, Port 3210) stellt die aktuellen Daten als JSON-Endpoint bereit, gesichert durch einen API-Token.
- GitHub Actions Trigger: Nach erfolgreichem Scrape sendet der VPS einen repository_dispatch-Trigger an den GitHub-Workflow von eurocoeff. Dieser Workflow:
-
Build und Deploy:
- Holt die aktuellen Daten vom VPS-API
- Schreibt sie in
src/data/uefa-data.json - Führt
bun run buildaus, der eine vollständige statische Site generiert - Pusht den Build nach GitHub
- Cloudflare Pages erkennt den Push und deployt automatisch (typischerweise innerhalb von 2-3 Minuten)
Während aktiver Champions-League-, Europa-League- oder Conference-League- Matchdays läuft die Pipeline häufiger — typischerweise alle 30 Minuten zwischen 18:00 und 24:00 UTC, um Live-Tabellenupdates und das Matchday-Widget aktuell zu halten.
Validierung und Fehlerbehandlung
Mehrere Validierungsschritte verhindern fehlerhafte Daten auf der Live-Seite:
- JSON-Schema-Validierung: Bevor neue Daten in die Datenbank geschrieben werden, prüft der Scraper die Struktur (alle erwarteten Felder vorhanden, numerische Werte im plausiblen Bereich, keine null-Werte für Pflichtfelder).
- Sanity Checks gegen die Vorgängerwerte: Wenn der Verbandskoeffizient eines Landes sich gegenüber dem letzten Snapshot um mehr als 5 Punkte ändert, wird ein Alert ausgelöst und der Build stoppt. Solche Sprünge sind im normalen Saisonverlauf unmöglich und signalisieren einen Scraping-Fehler.
- Build-Failure-Recovery: Wenn der GitHub-Workflow scheitert, bleibt der letzte erfolgreiche Build live. Die Site wird nie mit halbgaren Daten deployed.
- Manuelle Korrektur-Pfad: Bei gemeldeten Datenfehlern (etwa über die Kontaktseite) gibt es einen schnellen Override-Pfad. Korrekturen werden in der Regel innerhalb von 24 Stunden eingespielt.
Was wir nicht tun
Aus Transparenzgründen ein paar bewusste Einschränkungen:
- Wir machen keine prädiktiven Berechnungen für unentschiedene Spiele — die Liga-Phase-Punkte werden erst nach Schlusspfiff in die Datenbank geschrieben. Das bedeutet, während eines laufenden Spiels gilt der vorherige Stand. Das ist bewusst, um falsche Stände während des Spiels zu vermeiden.
- Wir haben keine Live-Wettquoten. eurocoeff ist eine reine Daten- und Analyse-Site, keine Wett- oder Tipp-Plattform.
- Wir generieren keine zukünftigen Spielergebnisse durch Prognose-Modelle in der 5-Jahres-Wertung. Der "Was-wäre-wenn-Simulator" auf der Hauptseite ist explizit als manuelles Eingabe-Tool gestaltet — du wählst ein Szenario, wir zeigen die Konsequenz.
Genauigkeit und bekannte Limits
Die Werte auf eurocoeff stimmen typischerweise auf zwei Nachkommastellen mit den offiziellen UEFA-Werten überein. Abweichungen können in den folgenden Fällen auftreten:
- Tag der Spielergebnis-Verifikation: Wenn UEFA ein Spielergebnis offiziell korrigiert (selten, aber möglich), kann eurocoeff bis zu 24 Stunden brauchen, bis die Korrektur reflektiert ist.
- Strafpunktabzüge: UEFA verhängt gelegentlich Punktabzüge für Klubs (FFP-Verstöße, Geisterspiele). Diese werden manuell nachgepflegt und sind nicht automatisiert.
- Frühe Saison-Disambiguierung: In den ersten Wochen einer neuen Saison kann es kleine Diskrepanzen geben, bis alle Qualifikationsrunden vollständig in unsere Datenbank übernommen sind.
Technische Architektur (Zusammenfassung)
Für die technisch interessierten Leser die Stack-Übersicht:
- VPS-Pipeline: Hostinger-VPS, Docker Compose, PostgreSQL 16, Fastify-API
- CI/CD: GitHub Actions, repository_dispatch-Trigger
- Frontend: React 18, Vite 5, TypeScript, Tailwind CSS
- Hosting: Cloudflare Pages (statisch), automatisches Deploy auf main-Branch
- Datenformat: Single-File JSON-Snapshot (~720 KB), eingebunden zur Build-Zeit
Mehr Detail zur Architektur findest du in der About-Seite.
Feedback und Korrekturen
Wenn du eine Datenungenauigkeit findest oder einen Methodik-Vorschlag hast, schreib uns an [email protected]. Wir nehmen Korrekturen ernst und sind transparent darüber, wenn wir einen Fehler einbauen — der nächste Snapshot reflektiert die Korrektur.