# Deployment Guide - Linux BenchTools

Guide de déploiement complet pour Linux BenchTools.

## 📋 Prérequis

### Serveur hôte

- **OS** : Linux (Debian 11+, Ubuntu 20.04+ recommandé)
- **RAM** : Minimum 512 MB (1 GB recommandé)
- **Disque** : Minimum 2 GB d'espace libre
- **Réseau** : Accès réseau local pour les clients

### Logiciels requis

- Docker 20.10+
- Docker Compose plugin 2.0+
- Git (optionnel, pour clonage)

### Installation des prérequis

```bash
# Installer Docker
curl -fsSL https://get.docker.com | sh

# Ajouter l'utilisateur au groupe docker
sudo usermod -aG docker $USER

# Se déconnecter/reconnecter pour appliquer les changements
# ou utiliser:
newgrp docker

# Vérifier l'installation
docker --version
docker compose version
```

## 🚀 Déploiement Standard

### 1. Récupérer le code

```bash
# Via Git
git clone https://gitea.maison43.duckdns.org/gilles/linux-benchtools.git
cd linux-benchtools

# Ou télécharger et extraire l'archive
```

### 2. Exécuter l'installation

```bash
./install.sh
```

Le script crée automatiquement :
- `.env` avec un token API aléatoire sécurisé
- Répertoires `backend/data/` et `uploads/`
- Images Docker
- Conteneurs en arrière-plan

### 3. Vérifier le déploiement

```bash
# Vérifier les conteneurs
docker compose ps

# Tester le backend
curl http://localhost:8007/api/health

# Tester le frontend
curl -I http://localhost:8087
```

## 🔧 Déploiement Personnalisé

### Configuration avancée

Créez un fichier `.env` personnalisé avant l'installation :

```bash
# .env
API_TOKEN=votre-token-personnalise-securise
DATABASE_URL=sqlite:////app/data/data.db
UPLOAD_DIR=/app/uploads
BACKEND_PORT=8007
FRONTEND_PORT=8087
```

### Ports personnalisés

```bash
# Modifier .env
BACKEND_PORT=9000
FRONTEND_PORT=9001

# Redémarrer
docker compose down
docker compose up -d
```

### Reverse Proxy (Nginx/Traefik)

#### Exemple Nginx

```nginx
# /etc/nginx/sites-available/benchtools

upstream benchtools_backend {
    server localhost:8007;
}

upstream benchtools_frontend {
    server localhost:8087;
}

server {
    listen 80;
    server_name bench.maison43.local;

    # Frontend
    location / {
        proxy_pass http://benchtools_frontend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    # Backend API
    location /api/ {
        proxy_pass http://benchtools_backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    # WebSocket support (si besoin futur)
    location /ws/ {
        proxy_pass http://benchtools_backend;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}
```

```bash
# Activer le site
sudo ln -s /etc/nginx/sites-available/benchtools /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
```

## 📊 Monitoring et Logs

### Consulter les logs

```bash
# Tous les services
docker compose logs -f

# Backend uniquement
docker compose logs -f backend

# Dernières 100 lignes
docker compose logs --tail=100 backend

# Logs depuis une date
docker compose logs --since 2025-12-07T10:00:00 backend
```

### Métriques système

```bash
# Utilisation des ressources
docker stats

# Espace disque
du -sh backend/data uploads
```

## 🔄 Maintenance

### Backup

```bash
#!/bin/bash
# backup.sh

BACKUP_DIR="./backups/$(date +%Y%m%d_%H%M%S)"
mkdir -p "$BACKUP_DIR"

# Backup base de données
docker compose exec backend sqlite3 /app/data/data.db ".backup /app/data/backup.db"
docker cp linux_benchtools_backend:/app/data/backup.db "$BACKUP_DIR/"

# Backup uploads
cp -r uploads "$BACKUP_DIR/"

# Backup .env
cp .env "$BACKUP_DIR/"

echo "Backup créé dans $BACKUP_DIR"
```

### Restore

```bash
# Arrêter les services
docker compose down

# Restaurer la base
cp backup/data.db backend/data/data.db

# Restaurer les uploads
cp -r backup/uploads ./

# Redémarrer
docker compose up -d
```

### Mise à jour

```bash
# Récupérer les dernières modifications
git pull

# Reconstruire et redémarrer
docker compose up -d --build

# Ou sans interruption (rolling update)
docker compose build
docker compose up -d --no-deps --build backend
docker compose up -d --no-deps --build frontend
```

### Nettoyage

```bash
# Supprimer les anciens benchmarks (exemple : > 6 mois)
docker compose exec backend sqlite3 /app/data/data.db \
  "DELETE FROM benchmarks WHERE run_at < datetime('now', '-6 months');"

# Nettoyer les images Docker inutilisées
docker image prune -a

# Nettoyer les volumes inutilisés
docker volume prune
```

## 🔒 Sécurité

### Recommandations

1. **Token API** : Utiliser un token fort généré aléatoirement
2. **Firewall** : Limiter l'accès aux ports 8007/8087 au réseau local
3. **Reverse Proxy** : Utiliser HTTPS si exposition Internet
4. **Backup** : Backup régulier de la base et des uploads
5. **Mises à jour** : Maintenir Docker et le système à jour

### Firewall (UFW)

```bash
# Autoriser seulement le réseau local
sudo ufw allow from 192.168.1.0/24 to any port 8007
sudo ufw allow from 192.168.1.0/24 to any port 8087
```

### HTTPS avec Let's Encrypt

Si exposé sur Internet :

```bash
# Installer Certbot
sudo apt install certbot python3-certbot-nginx

# Obtenir un certificat
sudo certbot --nginx -d bench.votredomaine.com
```

## 📈 Scaling

### Augmenter les performances

```yaml
# docker-compose.yml

services:
  backend:
    # ...
    deploy:
      resources:
        limits:
          cpus: '2'
          memory: 2G
        reservations:
          cpus: '1'
          memory: 1G
```

### Multiple workers

Modifier le Dockerfile backend :

```dockerfile
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8007", "--workers", "4"]
```

## 🐛 Troubleshooting

### Port déjà utilisé

```bash
# Trouver le processus
sudo lsof -i :8007

# Changer le port dans .env
BACKEND_PORT=8008

# Redémarrer
docker compose down && docker compose up -d
```

### Base de données verrouillée

```bash
# Arrêter le backend
docker compose stop backend

# Vérifier les processus SQLite
docker compose exec backend sh -c "ps aux | grep sqlite"

# Redémarrer
docker compose start backend
```

### Espace disque plein

```bash
# Nettoyer les logs Docker
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"

# Nettoyer les anciens benchmarks
docker compose exec backend sqlite3 /app/data/data.db \
  "DELETE FROM benchmarks WHERE run_at < datetime('now', '-3 months');"
```

## 📞 Support

- Documentation : Fichiers `.md` dans le dépôt
- Issues : Gitea repository
- Logs : `docker compose logs`

## ✅ Checklist de déploiement

- [ ] Docker et Docker Compose installés
- [ ] Ports 8007 et 8087 disponibles
- [ ] Espaces disque suffisant (>2GB)
- [ ] `install.sh` exécuté avec succès
- [ ] Health check OK (`curl localhost:8007/api/health`)
- [ ] Frontend accessible (`http://localhost:8087`)
- [ ] Token API noté en lieu sûr
- [ ] Backup configuré
- [ ] Firewall configuré (optionnel)
- [ ] Reverse proxy configuré (optionnel)

Bon déploiement ! 🚀
