Files
serv_benchmark/06_backend_architecture.md
2025-12-07 14:16:58 +01:00

217 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 06 Architecture Backend & Déploiement (FastAPI + Uvicorn + Docker)
Objectif : définir la structure technique du backend, l'organisation du code, les dépendances,
le déploiement via Docker, et les bonnes pratiques de maintenance.
---
# 1. Architecture générale du backend
Le backend repose sur :
- Python **3.11+**
- **FastAPI** (framework web)
- **Uvicorn** (serveur ASGI)
- **SQLite** (stockage local)
- **SQLAlchemy** (ORM)
- **Pydantic** (validation des schémas)
- Docker (déploiement)
- Arborescence claire modulaire
---
# 2. Arborescence recommandée
```
backend/
├── app/
│ ├── api/
│ │ ├── benchmark.py
│ │ ├── devices.py
│ │ ├── docs.py
│ │ ├── links.py
│ │ └── __init__.py
│ │
│ ├── core/
│ │ ├── config.py
│ │ ├── security.py
│ │ └── __init__.py
│ │
│ ├── models/
│ │ ├── device.py
│ │ ├── hardware_snapshot.py
│ │ ├── benchmark.py
│ │ ├── manufacturer_link.py
│ │ ├── document.py
│ │ └── __init__.py
│ │
│ ├── schemas/
│ │ ├── benchmark.py
│ │ ├── device.py
│ │ ├── hardware.py
│ │ ├── document.py
│ │ ├── link.py
│ │ └── __init__.py
│ │
│ ├── db/
│ │ ├── base.py
│ │ ├── session.py
│ │ ├── init_db.py
│ │ └── __init__.py
│ │
│ ├── utils/
│ │ ├── scoring.py
│ │ └── __init__.py
│ │
│ ├── main.py
│ └── __init__.py
├── Dockerfile
├── requirements.txt
└── README.md
```
---
# 3. Dépendances backend (requirements.txt)
```
fastapi
uvicorn
sqlalchemy
alembic
pydantic
python-multipart
jinja2
aiofiles
```
---
# 4. Fonctionnement principal
## 4.1 main.py
- Initialise FastAPI
- Charge les routes `/api/*`
- Initialise la base SQLite
- Expose un `GET /api/health`
---
# 5. Configuration (core/config.py)
Variables chargées via environnement :
- `API_TOKEN`
- `DATABASE_URL``sqlite:///./data.db`
- `UPLOAD_DIR``./uploads`
---
# 6. Déploiement Docker
## 6.1 Dockerfile
```
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app ./app
RUN mkdir -p /app/uploads /app/data
ENV API_TOKEN=CHANGE_ME
ENV DATABASE_URL=sqlite:////app/data/data.db
ENV UPLOAD_DIR=/app/uploads
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8007"]
```
---
## 6.2 docker-compose.yml
```
version: "3.9"
services:
backend:
build: ./backend
container_name: linux_benchtools_backend
ports:
- "8007:8007"
volumes:
- ./backend/data:/app/data
- ./backend/uploads:/app/uploads
environment:
API_TOKEN: "SUPER_SECRET_TOKEN"
DATABASE_URL: "sqlite:////app/data/data.db"
UPLOAD_DIR: "/app/uploads"
restart: unless-stopped
```
---
# 7. Gestion des documents (PDF, images)
- Stockés dans `/app/uploads`
- Nommage unique (hash)
- Entrée correspondante dans la BDD
- Accessibles via `/api/docs/{id}/download`
---
# 8. Pipeline dun benchmark
1. Le client exécute `bench.sh`
2. Un JSON complet est envoyé vers POST `/api/benchmark`
3. Vérification du token
4. Recherche ou création du device
5. Création dun hardware snapshot
6. Création dun benchmark
7. Calcul / stockage du score global
8. Réponse `{status: "ok", ...}`
---
# 9. Module scoring (utils/scoring.py)
Calcule :
```
global_score =
cpu * 0.30 +
mem * 0.20 +
disk * 0.25 +
net * 0.15 +
gpu * 0.10
```
Utilise les scores normalisés reçus depuis le client.
---
# 10. Sécurité
- API Token unique pour tous les clients
- Upload limité en taille
- CORS restreint au LAN si besoin
- Aucun endpoint destructif sans authentification
---
# 11. Maintenance
- Backup SQLite via cron
- Logs Docker
- Vérification santé via `/api/health`
- Ajout futur : export JSON/CSV global