feat(logos): Provider-Kette, lokaler Cache und Markenfarben

- simple-icons als kompakter Index im Repository (3.459 Marken, 2 MB gzip),
  erzeugt von scripts/vendor_simple_icons.py bzw. `make vendor-icons`
- logo.dev und Brandfetch als optionale Adapter, ohne Schlüssel übersprungen
- Favicon-Fallback und generierter Buchstaben-Avatar als Garantie
- Bei eindeutigem Offline-Treffer unterbleiben Anfragen nach außen komplett
- Cache im Dateisystem nach SHA-256, Auslieferung nur über /api/logos/{id}
  mit immutable-Header und ETag
- Markenfarbe aus SVG-Fills bzw. per k-Means (k=4) über 64x64 Pixel, dazu eine
  aufgehellte Variante mit mindestens 4,5:1 Kontrast auf dunklem Grund
- Kandidatensuche mit Vorauswahl, Auswahl, Upload und Zurücksetzen
- Bildtyp wird nur noch am Inhalt bestimmt, nicht an der gemeldeten Kopfzeile
- 60 neue Tests, insgesamt 208 grün

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014e7t8UpmoVNMtWivY5LiSH
This commit is contained in:
moneyfy
2026-09-09 13:54:21 +02:00
co-authored by Claude Opus 5
parent b586d27b77
commit 8edb69fe6a
16 changed files with 2039 additions and 7 deletions
+16 -1
View File
@@ -43,13 +43,28 @@ OIDC_SCOPES=openid profile email
# --- Logo-Service ------------------------------------------------------------
# Verzeichnis für den lokalen Logo-Cache (im Container auf das Volume gemountet).
# Logos werden ausschließlich von hier ausgeliefert im Seitenaufruf entsteht
# kein Zugriff auf fremde Dienste.
LOGO_STORAGE_DIR=/data/logos
# Optionale Provider. Ohne Key wird der jeweilige Adapter übersprungen.
# Der lokale simple-icons-Katalog deckt die meisten Marken ohne Netzzugriff ab.
# Die folgenden Provider sind optional; ohne Schlüssel wird der jeweilige
# Adapter stillschweigend übersprungen.
# logo.dev: veröffentlichbarer Token von https://www.logo.dev
# Achtung: Auf dem kostenlosen Tarif verlangt logo.dev bei kommerzieller
# Nutzung einen sichtbaren Rückverweis. Für private Nutzung entfällt das.
LOGODEV_API_KEY=
# Brandfetch: API-Schlüssel der Brand API (https://docs.brandfetch.com).
# Wird nur genutzt, wenn zur Firma eine Domain hinterlegt ist.
BRANDFETCH_API_KEY=
LOGO_HTTP_TIMEOUT_SECONDS=5
LOGO_HTTP_RETRIES=2
LOGO_MAX_UPLOAD_BYTES=1048576
# Sucht nach dem Anlegen einer Firma automatisch im Hintergrund nach einem Logo.
LOGO_AUTO_RESOLVE=true
# --- Benachrichtigungen ------------------------------------------------------
NOTIFICATIONS_ENABLED=true