# 🔧 Fix : Erreurs 404 sur les Images Uploadées

## 📋 Problème Identifié

Les images uploadées (`/uploads/fails/*.jpg`) retournaient des erreurs 404 :

```
GET https://faildaily.com/uploads/fails/fail-xxx.jpg 404 (Not Found)
```

## 🔍 Causes

### 1. ❌ Pas de Volume Docker

Le dossier `/app/uploads` n'était pas persisté dans un volume Docker :

- Les uploads étaient stockés dans le conteneur éphémère
- À chaque redémarrage/mise à jour, tous les fichiers étaient perdus

### 2. ❌ Routing Traefik Manquant

Traefik ne routait que `/api` vers le backend :

- Les requêtes vers `/uploads` n'atteignaient pas le backend
- Le frontend Angular ne pouvait pas charger les images

## ✅ Solution Appliquée

### Modifications dans `docker-stack.ovh-cloud.yml`

#### 1. Ajout du Volume Persistant

```yaml
services:
  backend:
    volumes:
      - faildaily-uploads:/app/uploads
```

#### 2. Configuration du Volume

```yaml
volumes:
  faildaily-uploads:
    driver: local
```

#### 3. Routes Traefik pour `/uploads`

```yaml
# Route HTTPS pour /uploads (priorité 90)
- "traefik.http.routers.faildaily-uploads.rule=Host(`faildaily.com`) && PathPrefix(`/uploads`)"
- "traefik.http.routers.faildaily-uploads.entrypoints=websecure"
- "traefik.http.routers.faildaily-uploads.tls.certresolver=letsencrypt"
- "traefik.http.routers.faildaily-uploads.priority=90"
- "traefik.http.services.faildaily-uploads.loadbalancer.server.port=3000"

# Redirection HTTP -> HTTPS pour /uploads
- "traefik.http.routers.faildaily-uploads-http.rule=Host(`faildaily.com`) && PathPrefix(`/uploads`)"
- "traefik.http.routers.faildaily-uploads-http.entrypoints=web"
- "traefik.http.routers.faildaily-uploads-http.middlewares=redirect-to-https@docker"
```

## 📦 Déploiement

### Commit

- **Hash** : `3864f9c`
- **Message** : "fix: Ajout volume uploads + routes Traefik pour les images"
- **Date** : 11 février 2026

### Workflow CI/CD

Le déploiement automatique via GitHub Actions :

1. Build des images backend/frontend
2. Push vers GHCR
3. Déploiement sur OVH avec le nouveau stack
4. Création automatique du volume `faildaily-uploads`

## ⚠️ Impacts

### Perte des Uploads Existants

**Les images uploadées avant ce fix sont perdues** car elles n'étaient pas dans un volume persistant.

**Actions requises** :

- Les utilisateurs devront re-uploader leurs fails
- Communiquer aux utilisateurs actifs

### Nouvelles Images

Toutes les images uploadées **après** ce déploiement seront :

- ✅ Persistées dans le volume Docker
- ✅ Conservées après les redémarrages
- ✅ Accessibles via Traefik

## 🧪 Tests de Vérification

### 1. Vérifier que le Volume est Créé

```bash
ssh ubuntu@141.94.42.172
docker volume ls | grep faildaily-uploads
```

**Résultat attendu** :

```
local     faildaily-uploads
```

### 2. Vérifier le Service Backend

```bash
docker service inspect faildaily_backend --format '{{json .Spec.TaskTemplate.ContainerSpec.Mounts}}' | jq
```

**Résultat attendu** : Mount sur `/app/uploads`

### 3. Tester l'Upload d'une Image

1. Se connecter sur https://faildaily.com
2. Créer un nouveau fail avec une image
3. Vérifier que l'image s'affiche correctement
4. Inspecter la console : **pas d'erreur 404**

### 4. Tester la Persistance

```bash
# Redémarrer le service
docker service update --force faildaily_backend

# Attendre le redémarrage
docker service logs faildaily_backend -f

# Vérifier que les images sont toujours accessibles
curl -I https://faildaily.com/uploads/fails/[image-uploadée].jpg
```

**Résultat attendu** : `200 OK` (pas 404)

## 📊 Monitoring

### Routes Traefik Actives

Vérifier dans le dashboard Traefik que ces routes sont configurées :

- **Priority 100** : `/api` → backend
- **Priority 90** : `/uploads` → backend
- **Priority 50** : `/` → frontend

### Logs Backend

```bash
docker service logs faildaily_backend --tail 50 -f
```

**Messages attendus** :

- `📁 Uploads: /app/uploads` au démarrage
- Pas d'erreurs ENOENT (fichiers manquants)

## 📝 Améliorations Futures

### 1. Sauvegarde du Volume

Mettre en place une stratégie de backup pour `faildaily-uploads` :

```bash
# Script de backup journalier
docker run --rm -v faildaily-uploads:/data -v /backup:/backup \
  alpine tar czf /backup/uploads-$(date +%Y%m%d).tar.gz /data
```

### 2. Limite de Taille

Configurer une limite de taille pour éviter que le volume ne remplisse le disque :

```yaml
volumes:
  faildaily-uploads:
    driver: local
    driver_opts:
      type: none
      o: bind,size=10G
      device: /mnt/uploads
```

### 3. CDN pour les Images

Intégrer un CDN (Cloudflare, CloudImage) pour :

- Réduire la charge sur le backend
- Optimiser les performances de chargement
- Compression automatique des images

## 🔗 Références

- **Docker Stack** : [docker-stack.ovh-cloud.yml](docker/docker-stack.ovh-cloud.yml)
- **Backend Server** : [backend-api/server.js](backend-api/server.js) (lignes 288-327)
- **Workflow CI/CD** : [.github/workflows/deploy-ovh.yml](.github/workflows/deploy-ovh.yml)
- **Commit Fix** : https://github.com/Taaazzz-prog/FailDaily/commit/3864f9c

---

**Date de résolution** : 11 février 2026  
**Résolu par** : GitHub Copilot (Agent AI)  
**Statut** : ✅ Déployé en production
