# Guide de déploiement FailDaily

## 📋 Vue d'ensemble

FailDaily dispose de **deux configurations Docker Compose** selon l'architecture du serveur :

| Fichier | Architecture | Usage |
|---------|---------------|-------|
| `docker/docker-compose.ovh.yml` | **Serveur MUTUALISÉ** | Plusieurs applications sur le même serveur (cas actuel OVH) |
| `docker-compose.ssl-production.yml` | **Serveur EXCLUSIF** | Serveur vierge dédié uniquement à FailDaily |

## 🔍 Comprendre la différence

### `docker/docker-compose.ovh.yml` - Serveur MUTUALISÉ (ton OVH actuel)

**Situation :** Ton serveur OVH héberge **plusieurs applications** :
```
┌─────────────────────────────────────────┐
│   UN SEUL Traefik (ports 80/443)       │
├─────────────────────────────────────────┤
│ faildaily.com → FailDaily               │
│ web-sentinel.com → Web Sentinel         │
│ videodownloader.com → VideoDownloader   │
│ coolcare.com → CoolCare                 │
│ signature.com → Signature Électronique  │
└─────────────────────────────────────────┘
```

**Caractéristiques :**
- ✅ Traefik **déjà existant** (partagé entre toutes les apps)
- ✅ Réseau Docker `faildaily-network` (connecté au Traefik global)
- ✅ **Pas de conflit de ports** (Traefik gère déjà 80/443)
- ✅ Volumes et bases de données existants
- ✅ FailDaily s'intègre aux apps existantes

### `docker-compose.ssl-production.yml` - Serveur EXCLUSIF FailDaily

**Situation :** Un serveur **vierge** ou **dédié uniquement** à FailDaily :
```
┌─────────────────────────────────────────┐
│   Serveur vierge (rien d'installé)     │
│                                         │
│   Traefik créé PAR ce fichier          │
│   faildaily.com → FailDaily             │
│   api.faildaily.com → PowerPoint        │
│   (rien d'autre sur ce serveur)        │
└─────────────────────────────────────────┘
```

**Caractéristiques :**
- ✅ Crée son **propre Traefik** (`faildaily-traefik-ssl`)
- ✅ Réseau isolé `faildaily-ssl-network`
- ✅ Expose directement les ports `80`, `443`, `8080`
- ✅ Volumes dédiés créés from scratch
- ✅ Inclut service PowerPoint (`api.faildaily.com`)
- ✅ Architecture complète autonome

---

## 🔧 Configuration 1 : Serveur MUTUALISÉ (OVH actuel)

### Fichier : `docker/docker-compose.ovh.yml`

**Quand l'utiliser :**
- ✅ Le serveur héberge **déjà d'autres applications**
- ✅ Un Traefik existe déjà et gère le SSL pour plusieurs sites
- ✅ Tu veux ajouter FailDaily **sans perturber** les autres apps
- ✅ Économie de ressources (un seul Traefik pour tout)

**Architecture actuelle de ton serveur OVH (141.94.42.172) :**
- **Traefik existant** : `faildaily_traefik_ovh` (gère tous les domaines)
- **FailDaily** : faildaily.com
- **Web Sentinel** : web-sentinel.com
- **VideoDownloader** : videodownloader.com
- **CoolCare** : coolcare.com
- **Signature Électronique** : signature.com

**Services déployés :**
- `faildaily_traefik_ovh` - Reverse proxy SSL (partagé)
- `faildaily_frontend_ovh` - Application Angular/Ionic
- `faildaily_backend_ovh` - API Node.js
- `faildaily_db_ovh` - Base de données MySQL
- `faildaily_logs_db_ovh` - Base de données logs séparée

### ✅ Commandes de déploiement (serveur MUTUALISÉ)

**Contexte :** Ton serveur OVH avec plusieurs applications

```bash
# Se connecter au serveur
ssh ubuntu@141.94.42.172

# Naviguer vers le projet
cd /home/taaazzz/FailDaily

# Récupérer les dernières modifications
git pull origin main

# Naviguer vers le dossier docker
cd docker

# Rebuild et redémarrage des services
docker-compose -f docker-compose.ovh.yml build frontend backend
docker-compose -f docker-compose.ovh.yml up -d frontend backend

# Redémarrer Traefik pour détecter les changements
docker-compose -f docker-compose.ovh.yml restart traefik
```

### 🔍 Vérification du déploiement

```bash
# Vérifier l'état des conteneurs
docker ps --filter 'name=faildaily'

# Vérifier les logs
docker logs faildaily_frontend_ovh --tail 50
docker logs faildaily_backend_ovh --tail 50
docker logs faildaily_traefik_ovh --tail 50

# Tester l'accès HTTPS
curl -I https://faildaily.com
```

---

## 🚀 Configuration 2 : Serveur EXCLUSIF FailDaily

### Fichier : `docker-compose.ssl-production.yml`

**Quand l'utiliser :**
- ✅ Nouveau serveur **vierge** (rien d'installé)
- ✅ Serveur dédié **uniquement** à FailDaily
- ✅ Migration vers infrastructure isolée
- ✅ Environnement de staging/pre-production séparé
- ✅ Développement local avec HTTPS

**Cas d'usage concrets :**

1. **Migration vers serveur dédié**
   - Tu loues un 2ème VPS juste pour FailDaily
   - Serveur plus puissant, isolé des autres apps
   - Meilleure performance et sécurité

2. **Environnement de staging**
   - Serveur de test identique à la prod
   - Tester les mises à jour avant déploiement réel

3. **Développement local HTTPS**
   - Tester avec vrais certificats SSL
   - Reproduire l'environnement de production

**Services déployés :**
- `faildaily-traefik-ssl` - Reverse proxy SSL dédié
- `faildaily-frontend-ssl` - Application Angular/Ionic
- `faildaily-backend-ssl` - API Node.js
- `faildaily-powerpoint-ssl` - Service PowerPoint (api.faildaily.com)
- `faildaily-db-ssl` - Base de données MySQL
- `faildaily-logs-db-ssl` - Base de données logs séparée

### ✅ Commandes de déploiement (serveur EXCLUSIF)

**Contexte :** Serveur vierge ou dédié uniquement à FailDaily

```bash
# Prérequis : Créer les volumes externes
docker volume create faildaily_mysql-data-ssl
docker volume create faildaily_logs-data-ssl
docker volume create faildaily_backend-uploads-ssl
docker volume create faildaily_traefik-ssl-certs

# Configurer les variables d'environnement
cp .env.example .env
# Éditer .env avec les vrais credentials

# Lancer l'infrastructure complète
docker-compose -f docker-compose.ssl-production.yml up -d

# Vérifier les certificats Let's Encrypt
docker logs faildaily-traefik-ssl | grep -i "certificate"
```

### 🔍 Vérification du déploiement

```bash
# Vérifier l'état des conteneurs
docker-compose -f docker-compose.ssl-production.yml ps

# Accéder au dashboard Traefik
# http://<IP_SERVEUR>:8080

# Tester les domaines
curl -I https://faildaily.com
curl -I https://api.faildaily.com
```

---

## ⚠️ Différences critiques

### Pourquoi deux fichiers différents ?

**Le problème :** Si tu utilises le **mauvais fichier** :

**Scénario 1 - Utiliser `docker-compose.ssl-production.yml` sur ton OVH mutualisé :**
```bash
# ❌ ERREUR : Conflit de ports
docker-compose -f docker-compose.ssl-production.yml up -d
# → Traefik essaie d'écouter sur 80/443
# → Mais ton Traefik existant utilise déjà ces ports
# → ERROR: Port 80 is already allocated
```

**Scénario 2 - Utiliser `docker-compose.ovh.yml` sur serveur vierge :**
```bash
# ❌ ERREUR : Traefik inexistant
cd docker && docker-compose -f docker-compose.ovh.yml up -d
# → FailDaily cherche à se connecter au réseau Traefik
# → Mais aucun Traefik n'existe sur ce serveur vierge
# → ERROR: Network faildaily-network not found
```

### Tableau comparatif détaillé

### Tableau comparatif détaillé

| Aspect | Serveur MUTUALISÉ (OVH) | Serveur EXCLUSIF |
|--------|-------------------------|------------------|
| **Traefik** | Utilise Traefik existant | Crée son propre Traefik |
| **Ports exposés** | Aucun (Traefik gère) | 80, 443, 8080 |
| **Réseau Docker** | `faildaily-network` (partagé) | `faildaily-ssl-network` (isolé) |
| **Autres apps** | Web Sentinel, VideoDownloader, etc. | Aucune (serveur vierge) |
| **Service PowerPoint** | ❌ Non inclus | ✅ Inclus (api.faildaily.com) |
| **Volumes** | Volumes OVH existants | Volumes créés from scratch |
| **Nom conteneurs** | `faildaily_*_ovh` | `faildaily-*-ssl` |
| **Complexité** | Doit s'intégrer aux apps existantes | Infrastructure autonome |

### Configuration réseau

**Serveur MUTUALISÉ :**
```yaml
networks:
  - faildaily-network  # Réseau existant partagé
```

**Serveur EXCLUSIF :**
```yaml
networks:
  - faildaily-ssl-network  # Réseau isolé créé par le compose
```

### Gestion des ports

**Serveur MUTUALISÉ :**
- Traefik existant gère déjà `80:80` et `443:443`
- FailDaily ne doit **pas** exposer de ports
- Évite les conflits avec autres applications

**Serveur EXCLUSIF :**
```yaml
ports:
  - "80:80"    # HTTP
  - "443:443"  # HTTPS
  - "8080:8080" # Dashboard Traefik
```

### Labels Traefik

**Serveur MUTUALISÉ :**
```yaml
labels:
  - "traefik.http.routers.faildaily-frontend.rule=Host(`faildaily.com`)"
  - "traefik.http.routers.faildaily-frontend.priority=50"
```

**Serveur EXCLUSIF :**
```yaml
labels:
  - "traefik.http.routers.frontend.rule=Host(`faildaily.com`)"
  - "traefik.http.routers.frontend.priority=50"
  - "traefik.http.routers.frontend.tls.certresolver=letsencrypt"
```

---

## 🛠️ Maintenance

### Mise à jour du code

**Serveur MUTUALISÉ (ton OVH actuel) :**
```bash
cd /home/taaazzz/FailDaily
git pull origin main
cd docker
docker-compose -f docker-compose.ovh.yml build frontend
docker-compose -f docker-compose.ovh.yml up -d frontend
docker-compose -f docker-compose.ovh.yml restart traefik
```

**Serveur EXCLUSIF :**
```bash
cd /path/to/FailDaily
git pull origin main
docker-compose -f docker-compose.ssl-production.yml build frontend
docker-compose -f docker-compose.ssl-production.yml up -d frontend
```

### Sauvegarde des données

```bash
# Backup base de données MUTUALISÉ (OVH)
ssh ubuntu@141.94.42.172 "docker exec faildaily_db_ovh mysqldump -uroot -p'PASSWORD' faildaily > backup-$(date +%Y%m%d).sql"

# Backup base de données EXCLUSIF
docker exec faildaily-db-ssl mysqldump -uroot -p'PASSWORD' faildaily > backup-$(date +%Y%m%d).sql
```

### Logs et debugging

```bash
# Serveur MUTUALISÉ (OVH)
docker logs faildaily_backend_ovh -f
docker logs faildaily_frontend_ovh -f
docker logs faildaily_traefik_ovh -f

# Serveur EXCLUSIF
docker-compose -f docker-compose.ssl-production.yml logs -f backend
docker-compose -f docker-compose.ssl-production.yml logs -f frontend
```

---

## 📝 Variables d'environnement requises

### Fichier `.env` (à créer)

```bash
# Base de données
DB_PASSWORD=votre_password_sécurisé
LOGS_DB_PASSWORD=votre_password_logs_sécurisé
LOGS_DB_ROOT_PASSWORD=votre_password_root_logs_sécurisé

# JWT
JWT_SECRET=votre_secret_jwt_très_long_et_aléatoire

# SMTP (OVH)
SMTP_PASSWORD=votre_password_smtp

# Firebase Cloud Messaging (optionnel)
FCM_SERVICE_ACCOUNT_FILE=/chemin/vers/firebase-adminsdk.json
FCM_PROJECT_ID=votre-project-id
```

---

## 🔒 Sécurité

### En-têtes de sécurité (Traefik)

Les deux configurations incluent :
- `X-Frame-Options: DENY`
- `X-Content-Type-Options: nosniff`
- `Referrer-Policy: same-origin`
- `Strict-Transport-Security` (HSTS)
- Content Security Policy (CSP)

### Certificats SSL

- **Automatiques** via Let's Encrypt
- **Renouvellement** : automatique par Traefik
- **Stockage** : `/letsencrypt/acme.json` dans le volume Traefik

---

## ❌ Erreurs courantes

### Erreur 1 : 504 Gateway Timeout

**Symptôme :** Le site ne répond pas, erreur 504 dans le navigateur

**Cause :** Mauvais fichier docker-compose utilisé sur serveur mutualisé

**Solution :**
```bash
# ✅ Sur ton OVH mutualisé, TOUJOURS utiliser docker-compose.ovh.yml
cd /home/taaazzz/FailDaily/docker
docker-compose -f docker-compose.ovh.yml up -d
```

### Erreur 2 : Conflits de ports (80/443 already allocated)

**Symptôme :** 
```
ERROR: for traefik  Cannot start service traefik: 
driver failed programming external connectivity on endpoint faildaily-traefik-ssl: 
Bind for 0.0.0.0:80 failed: port is already allocated
```

**Cause :** Tentative d'utiliser `docker-compose.ssl-production.yml` sur serveur mutualisé qui a déjà un Traefik

**Solution :** 
- Sur serveur mutualisé → Utiliser `docker-compose.ovh.yml`
- Sur serveur vierge → Utiliser `docker-compose.ssl-production.yml`

### Erreur 3 : Traefik ne détecte pas les conteneurs

**Symptôme :** Site inaccessible, Traefik ne route pas vers FailDaily

**Solution :**
```bash
# Redémarrer Traefik pour redécouvrir les conteneurs
docker-compose -f docker-compose.ovh.yml restart traefik

# Vérifier les logs
docker logs faildaily_traefik_ovh --tail 50
```

---

## 📚 Cas d'usage : Quel fichier choisir ?

| Situation | Fichier à utiliser | Raison |
|-----------|-------------------|--------|
| **Déploiement sur ton serveur OVH actuel** | `docker/docker-compose.ovh.yml` | Le serveur héberge déjà Web Sentinel, VideoDownloader, etc. |
| **Migration vers nouveau VPS dédié FailDaily** | `docker-compose.ssl-production.yml` | Serveur vierge, rien d'autre installé |
| **Environnement de staging/test isolé** | `docker-compose.ssl-production.yml` | Infrastructure autonome, pas de dépendances |
| **Développement local avec HTTPS** | `docker-compose.ssl-production.yml` | Créer environnement complet sur ton PC |
| **Ajout de nouvelles features sur OVH** | `docker/docker-compose.ovh.yml` | Toujours le même serveur mutualisé |
| **Scale-up : Séparer FailDaily des autres apps** | `docker-compose.ssl-production.yml` | Louer un 2ème VPS juste pour FailDaily |

---

## 🎯 Checklist de déploiement

### Serveur MUTUALISÉ (Production OVH actuelle)

- [ ] `git pull origin main`
- [ ] `cd docker`
- [ ] `docker-compose -f docker-compose.ovh.yml build`
- [ ] `docker-compose -f docker-compose.ovh.yml up -d`
- [ ] `docker-compose -f docker-compose.ovh.yml restart traefik`
- [ ] Vérifier `https://faildaily.com` (HTTP 200)
- [ ] Vérifier console DevTools (pas de logs)
- [ ] Tester modération (vibration + message)

### Serveur EXCLUSIF (Nouvelle installation vierge)

- [ ] Créer volumes externes
- [ ] Configurer `.env` avec credentials
- [ ] `docker-compose -f docker-compose.ssl-production.yml up -d`
- [ ] Attendre certificats Let's Encrypt (~2 min)
- [ ] Vérifier dashboard Traefik (port 8080)
- [ ] Tester `https://faildaily.com`
- [ ] Tester `https://api.faildaily.com` (PowerPoint)
- [ ] Importer données de production

---

## 💡 Résumé simplifié

**Tu te demandes quel fichier utiliser ?**

### Pose-toi cette question :

**"Mon serveur héberge-t-il d'autres applications en plus de FailDaily ?"**

- ✅ **OUI** (Web Sentinel, VideoDownloader, etc.) → `docker/docker-compose.ovh.yml`
- ❌ **NON** (serveur vierge ou exclusif FailDaily) → `docker-compose.ssl-production.yml`

**Ton cas actuel (serveur OVH 141.94.42.172) :**
- Héberge 5 applications différentes
- Un Traefik gère tout le SSL/routing
- → **Utilise TOUJOURS `docker/docker-compose.ovh.yml`**

---

## 🔗 Liens utiles

- **Repository GitHub :** https://github.com/Taaazzz-prog/FailDaily
- **Serveur OVH :** `ssh ubuntu@141.94.42.172`
- **Dashboard Traefik (local)** : http://localhost:8080
- **Documentation Traefik :** https://doc.traefik.io/traefik/

---

**Dernière mise à jour :** 27 novembre 2025
