# 🔒 Système de Sauvegarde TowerControl

## Vue d'ensemble

TowerControl dispose d'un système de sauvegarde automatique et manuel complet pour protéger vos données SQLite.

## Fonctionnalités

- ✅ **Sauvegardes automatiques** avec planification configurable
- ✅ **Sauvegardes manuelles** via UI et CLI
- ✅ **Compression gzip** optionnelle pour économiser l'espace
- ✅ **Rétention automatique** des anciennes sauvegardes
- ✅ **Vérification d'intégrité** de la base de données
- ✅ **Restauration** complète (développement uniquement)
- ✅ **Interface graphique** dans les paramètres avancés
- ✅ **CLI** pour l'administration système

## Configuration

### Paramètres par défaut

```typescript
{
  enabled: true,              // Sauvegardes automatiques activées
  interval: 'daily',          // Fréquence: 'hourly', 'daily', 'weekly'
  maxBackups: 7,              // Nombre maximum de sauvegardes conservées
  backupPath: './backups',    // Dossier de stockage
  compression: true,          // Compression gzip activée
}
```

### Modification via l'interface

1. Aller dans **Paramètres** → **Avancé**
2. Section **💾 Sauvegarde et données**
3. Cliquer sur **"Gérer les sauvegardes"**
4. Modifier la configuration selon vos besoins

### Modification via CLI

```bash
# Voir la configuration actuelle
pnpm run backup:config

# Modifier la fréquence
pnpm tsx scripts/backup-manager.ts config-set interval=daily

# Modifier le nombre max de sauvegardes
pnpm tsx scripts/backup-manager.ts config-set maxBackups=10

# Activer/désactiver la compression
pnpm tsx scripts/backup-manager.ts config-set compression=true
```

### Personnalisation du dossier de sauvegarde

```bash
# Via variable d'environnement permanente (.env)
BACKUP_STORAGE_PATH="./custom-backups"

# Via variable temporaire (une seule fois)
BACKUP_STORAGE_PATH="./my-backups" pnpm run backup:create

# Exemple avec un chemin absolu
BACKUP_STORAGE_PATH="/var/backups/towercontrol" pnpm run backup:create
```

## Utilisation

### Interface graphique

#### Paramètres Avancés

- **Visualisation** du statut en temps réel
- **Création manuelle** de sauvegardes
- **Vérification** de l'intégrité
- **Lien** vers la gestion complète

#### Page de gestion complète

- **Configuration** détaillée du système
- **Liste** de toutes les sauvegardes
- **Actions** (supprimer, restaurer)
- **Statistiques** et métriques

### Ligne de commande

```bash
# Créer une sauvegarde immédiate
pnpm run backup:create

# Lister toutes les sauvegardes
pnpm run backup:list

# Vérifier l'intégrité de la base
pnpm run backup:verify

# Voir la configuration
pnpm run backup:config

# Démarrer le planificateur
pnpm run backup:start

# Arrêter le planificateur
pnpm run backup:stop

# Statut du planificateur
pnpm run backup:status

# Commandes avancées (pnpm tsx requis)
pnpm tsx scripts/backup-manager.ts delete <filename>
pnpm tsx scripts/backup-manager.ts restore <filename> --force
```

## Planificateur automatique

### Fonctionnement

Le planificateur fonctionne en arrière-plan et crée des sauvegardes selon la fréquence configurée :

- **Hourly** : Toutes les heures
- **Daily** : Une fois par jour (recommandé)
- **Weekly** : Une fois par semaine

### Auto-démarrage

En production, le planificateur démarre automatiquement 30 secondes après le lancement de l'application.

### Gestion

```bash
# Démarrer manuellement
pnpm run backup:start

# Arrêter
pnpm run backup:stop

# Voir le statut
pnpm run backup:status
```

## Fichiers de sauvegarde

### Format des noms

```
towercontrol_2025-01-15T10-30-00-000Z.db      # Non compressé
towercontrol_2025-01-15T10-30-00-000Z.db.gz   # Compressé
```

### Localisation

Par défaut : `./backups/` (relatif au dossier du projet)

### Métadonnées

Chaque sauvegarde contient :

- **Horodatage** précis de création
- **Taille** du fichier
- **Type** (manuelle ou automatique)
- **Statut** (succès, échec, en cours)

## Restauration

⚠️ **ATTENTION** : La restauration remplace complètement la base de données actuelle.

### Sécurités

1. **Sauvegarde automatique** de la base actuelle avant restauration
2. **Confirmation** obligatoire
3. **Environnement** : Bloqué en production via API
4. **CLI uniquement** pour les restaurations en production

### Procédure

#### Via interface (développement uniquement)

1. Aller dans la gestion des sauvegardes
2. Cliquer sur **"Restaurer"** à côté du fichier souhaité
3. Confirmer l'action

#### Via CLI

```bash
# Restaurer avec confirmation
pnpm tsx scripts/backup-manager.ts restore towercontrol_2025-01-15T10-30-00-000Z.db.gz

# Restaurer en forçant (sans confirmation)
pnpm tsx scripts/backup-manager.ts restore towercontrol_2025-01-15T10-30-00-000Z.db.gz --force
```

## Vérification d'intégrité

### Quand l'utiliser

- Après une restauration
- Avant une opération critique
- En cas de doute sur la base de données
- Dans une tâche de maintenance

### Commandes

```bash
# Via pnpm script
pnpm run backup:verify

# Via CLI complet
pnpm tsx scripts/backup-manager.ts verify
```

### Vérifications effectuées

1. **Test de connexion** à la base
2. **PRAGMA integrity_check** SQLite
3. **Validation** de la structure
4. **Rapport** détaillé

## Maintenance

### Nettoyage automatique

Le système supprime automatiquement les anciennes sauvegardes selon `maxBackups`.

### Nettoyage manuel

```bash
# Supprimer une sauvegarde spécifique
pnpm tsx scripts/backup-manager.ts delete towercontrol_2025-01-15T10-30-00-000Z.db.gz

# Forcer la suppression
pnpm tsx scripts/backup-manager.ts delete towercontrol_2025-01-15T10-30-00-000Z.db.gz --force
```

### Surveillance des logs

Les opérations de sauvegarde sont loggées dans la console de l'application.

## Dépannage

### Problèmes courants

#### Erreur "sqlite3 command not found"

```bash
# Sur macOS
brew install sqlite

# Sur Ubuntu/Debian
sudo apt-get install sqlite3
```

#### Permissions insuffisantes

```bash
# Vérifier les permissions du dossier de sauvegarde
ls -la backups/

# Modifier si nécessaire
chmod 755 backups/
```

#### Espace disque insuffisant

```bash
# Vérifier l'espace disponible
df -h

# Supprimer d'anciennes sauvegardes
pnpm tsx scripts/backup-manager.ts list
pnpm tsx scripts/backup-manager.ts delete <filename>
```

### Logs de debug

Pour activer le debug détaillé, modifier `services/database.ts` :

```typescript
export const prisma =
  globalThis.__prisma ||
  new PrismaClient({
    log: ['query', 'info', 'warn', 'error'], // Debug activé
  });
```

## Sécurité

### Bonnes pratiques

1. **Stockage externe** : Copier régulièrement les sauvegardes hors du serveur
2. **Chiffrement** : Considérer le chiffrement pour les données sensibles
3. **Accès restreint** : Limiter l'accès au dossier de sauvegarde
4. **Tests réguliers** : Vérifier la restauration périodiquement

### Variables d'environnement

```bash
# Configuration des chemins de base de données
DATABASE_URL="file:./prisma/dev.db"        # Pour Prisma
BACKUP_DATABASE_PATH="./prisma/dev.db"     # Base à sauvegarder (optionnel)
BACKUP_STORAGE_PATH="./backups"            # Dossier des sauvegardes (optionnel)
```

### Docker

En environnement Docker, tout est centralisé dans le dossier `data/` :

```yaml
# docker-compose.yml
environment:
  DATABASE_URL: 'file:./data/prod.db' # Base de données Prisma
  BACKUP_DATABASE_PATH: './data/prod.db' # Base à sauvegarder
  BACKUP_STORAGE_PATH: './data/backups' # Dossier des sauvegardes
volumes:
  - ./data:/app/data # Bind mount vers dossier local
```

**Structure des dossiers :**

```
./data/                    # Dossier local mappé
├── prod.db               # Base de données production
├── dev.db                # Base de données développement
└── backups/              # Sauvegardes (créé automatiquement)
    ├── towercontrol_*.db.gz
    └── ...
```

## API

### Endpoints disponibles

```
GET    /api/backups              # Lister les sauvegardes
POST   /api/backups              # Actions (create, verify, config, scheduler)
DELETE /api/backups/[filename]   # Supprimer une sauvegarde
POST   /api/backups/[filename]   # Restaurer (dev seulement)
```

### Exemples d'utilisation

```typescript
// Créer une sauvegarde
const response = await fetch('/api/backups', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ action: 'create' }),
});

// Lister les sauvegardes
const response = await fetch('/api/backups');
const data = await response.json();
```

## Architecture

```
services/
├── backup.ts           # Service principal de sauvegarde
└── backup-scheduler.ts # Planificateur automatique

src/app/api/backups/
├── route.ts           # API endpoints principaux
└── [filename]/route.ts # Actions sur fichiers spécifiques

clients/
└── backup-client.ts   # Client HTTP pour l'interface

components/settings/
├── AdvancedSettingsPageClient.tsx    # Vue d'ensemble dans paramètres
└── BackupSettingsPageClient.tsx      # Gestion complète

scripts/
└── backup-manager.ts  # CLI d'administration
```

## Roadmap

### Version actuelle ✅

- Sauvegardes automatiques et manuelles
- Interface graphique complète
- CLI d'administration
- Compression et rétention

### Améliorations futures 🚧

- Sauvegarde vers cloud (S3, Google Drive)
- Chiffrement des sauvegardes
- Notifications par email
- Métriques de performance
- Sauvegarde incrémentale
