Architecture de Letter Box
1. Vue d’ensemble
L’application repose sur une architecture multi-couches :
- Frontend : React 18 (Vite, Axios) – dossier
frontend/ - Backend : FastAPI + SQLAlchemy – dossier
backend/ - Base de données : PostgreSQL 15 – dossier
db/ - Scraper : Scrapy + MongoDB – dossier
scraper/ - Orchestration : Docker Compose (local), Kubernetes (prod/devops)
Chaque composant est conteneurisé et communique via un réseau Docker ou un cluster Kubernetes.
2. Architecture logique
flowchart LR Client --> Frontend Frontend --> Backend Backend --> PostgreSQL Scraper --> Backend
3. Séparation des responsabilités
Frontend
- Interface utilisateur moderne (React, Vite)
- Appels API via Axios (
src/api.js) - Gestion du state avec Hooks
- Exemple d’appel API :
// frontend/src/api.js
import axios from 'axios';
export const getMovies = () => axios.get('/api/movies');Backend
- API REST (FastAPI,
main.py) - Modélisation ORM (SQLAlchemy)
- Endpoints CRUD, health check (
/health) - Tests unitaires (
test_import_movies.py) - Exemple d’endpoint :
# backend/main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/health")
def health():
return {"status": "ok"}Base de données
- PostgreSQL 15, schéma défini dans
db/init.sql - Migrations automatisées (
migrate.py) - Index sur les champs critiques (title, release_date)
- Exemple de table :
-- db/init.sql
CREATE TABLE movies (
id SERIAL PRIMARY KEY,
title TEXT NOT NULL,
release_date DATE,
...
);Scraper
- Extraction de données AlloCiné (Scrapy)
- Export JSON et insertion MongoDB
- Scripts d’intégration (
integration_pipeline.py) - Exemple d’utilisation :
# scraper/integration_pipeline.py
from mongo_extractor import extract_movies
movies = extract_movies()
# ... intégration dans la base4. Ports utilisés
| Composant | Port |
|---|---|
| Frontend | 3000 |
| Backend | 8001 |
| PostgreSQL | 5432 |
| MongoDB | 27017 |
| Quartz (doc) | 8080 |
5. Exemple de flux applicatif
- Un utilisateur consulte le frontend (port 3000), qui interroge l’API backend (port 8001).
- Le backend lit/écrit dans PostgreSQL (port 5432).
- Le scraper importe des films depuis AlloCiné, stocke dans MongoDB, puis exporte vers le backend.
Cette architecture garantit la modularité, la scalabilité et la maintenabilité du projet.