📝 Note
pro/concertvault/architecture
Architecture — concertvault
Liens : Decisions · Journal
Vue d’ensemble
Client (Next.js 14)
↓ /api/v1/* (proxy Next.js rewrites)
nginx + Authelia
↓
FastAPI (Python 3.12) ←→ PostgreSQL 16
↓ ←→ MeiliSearch
↓ (premier play)
FFmpeg → HLS segments → nginx (statique)
↓
Media SMB mount (read-only)
Composants principaux
| Composant | Rôle |
|---|---|
backend/app/routers/ | Endpoints FastAPI (concerts, artists, collections, admin, auth, search) |
backend/app/services/scanner.py | Scan SMB, upsert DB, index MeiliSearch |
backend/app/services/enricher.py | Enrichissement artiste (MusicBrainz, TheAudioDB, Last.fm) |
backend/app/services/ffmpeg.py | Transcodage HLS au premier play |
backend/app/services/search.py | Intégration MeiliSearch |
frontend/lib/api.ts | Client HTTP typé (JWT auto-refresh, 401 → refresh → retry) |
frontend/store/ | État global Zustand |
infra/docker-compose.yml | Stack complète production |
infra/nginx/ | Reverse proxy + service segments HLS statiques |
infra/authelia/ | Auth layer reverse-proxy |
Flux de données
Scan librarie : POST /admin/scan/start → scanner.py parcourt SMB → upsert DB (SQLAlchemy) → index MeiliSearch
Streaming : GET /concerts/{id}/stream → manifest HLS → (si absent) FFmpeg transcode → nginx sert les segments .ts
Recherche : GET /search?q= → MeiliSearch → résultats concerts + artistes
Dépendances externes
- MusicBrainz API (User-Agent requis)
- TheAudioDB API (clé requise)
- Last.fm API (clé requise)
- SMB share (lecture seule, mount
MEDIA_PATH)
Schémas
Voir docs/DATABASE_SCHEMA.sql et docs/API_CONTRACT.yaml.