# ⚡ Fix 404 - Labels Traefik pour Docker Swarm

## 🎯 Problème Identifié

✅ Backend et frontend démarrent correctement
❌ 404 sur toutes les URLs

**Cause** : Labels Traefik placés sous `labels` au lieu de `deploy.labels` (requis en Docker Swarm mode).

---

## ✅ Solution : Utiliser le Nouveau Stack

J'ai créé un nouveau fichier **`portainer-stack-swarm.yml`** avec tous les labels correctement placés.

### Différence Clé

**Avant (INCORRECT pour Swarm)** :
```yaml
xpeditis-backend:
  labels:  # ← Ne fonctionne PAS
    - "traefik.enable=true"
```

**Après (CORRECT pour Swarm)** :
```yaml
xpeditis-backend:
  deploy:
    restart_policy:
      condition: on-failure
    labels:  # ← REQUIS ici
      - "traefik.enable=true"
```

---

## 🚀 Étapes de Déploiement

### 1. Supprimer l'Ancien Stack (Portainer UI)

1. **Portainer** → **Stacks** → `xpeditis`
2. **Remove stack** → Confirmer

### 2. Créer le Nouveau Stack

1. **Portainer** → **Stacks** → **Add stack**
2. **Name** : `xpeditis-preprod`
3. **Build method** : Web editor
4. **Copier TOUT le contenu** de `docker/portainer-stack-swarm.yml`
5. **Deploy the stack**

### 3. Attendre le Déploiement (~2-3 min)

**Portainer → Services** :
- ✅ `xpeditis_xpeditis-backend` : 1/1
- ✅ `xpeditis_xpeditis-frontend` : 1/1
- ✅ `xpeditis_xpeditis-db` : 1/1
- ✅ `xpeditis_xpeditis-redis` : 1/1
- ✅ `xpeditis_xpeditis-minio` : 1/1

### 4. Vérifier les Logs

**Backend** :
```
✅ Database migrations completed
🚀 Application is running on: http://0.0.0.0:4000
```

**Frontend** :
```
✓ Ready in XXms
```

### 5. Tester les URLs

```bash
curl https://api.preprod.xpeditis.com/api/v1/health
# Réponse attendue : {"status":"ok"}

curl -I https://app.preprod.xpeditis.com
# Réponse attendue : HTTP/2 200
```

---

## 🔍 Modifications Appliquées

### 1. Labels Déplacés sous `deploy.labels`

✅ **Backend** : Labels Traefik maintenant sous `deploy.labels`
✅ **Frontend** : Labels Traefik maintenant sous `deploy.labels`
✅ **MinIO** : Labels Traefik maintenant sous `deploy.labels`

### 2. Restart Policy Ajoutée

```yaml
deploy:
  restart_policy:
    condition: on-failure  # ← Remplace "restart: unless-stopped"
```

En Swarm mode, `restart` ne fonctionne pas. Utiliser `deploy.restart_policy` à la place.

### 3. Middleware Redirect Complété

```yaml
- "traefik.http.routers.xpeditis-minio-http.middlewares=xpeditis-redirect"
```

Ajout du middleware manquant pour redirection HTTP → HTTPS.

---

## 📊 Comparaison

| Fichier | Usage | Compatibilité |
|---------|-------|---------------|
| `portainer-stack.yml` | ❌ NE FONCTIONNE PAS en Swarm | Docker Compose standalone |
| `portainer-stack-swarm.yml` | ✅ UTILISER CELUI-CI | Docker Swarm mode |

---

## ✅ Checklist Post-Déploiement

- [ ] Stack créé dans Portainer avec `portainer-stack-swarm.yml`
- [ ] Tous les services en état 1/1 (running)
- [ ] Logs backend : `✅ Database migrations completed`
- [ ] Logs frontend : `✓ Ready in XXms`
- [ ] API health : `curl https://api.preprod.xpeditis.com/api/v1/health` → 200
- [ ] Frontend : `curl https://app.preprod.xpeditis.com` → 200
- [ ] MinIO Console : `curl https://minio.preprod.xpeditis.com` → 200

---

## 🎯 Résultat Attendu

**Avant** :
```
GET https://api.preprod.xpeditis.com → 404 page not found
GET https://app.preprod.xpeditis.com → 404 page not found
```

**Après** :
```
GET https://api.preprod.xpeditis.com/api/v1/health → {"status":"ok"}
GET https://app.preprod.xpeditis.com → 200 OK (page d'accueil)
```

---

## ⚠️ Si Toujours 404 Après Fix

### Vérifier que Traefik Voit les Services

```bash
# Via SSH sur le serveur
docker service logs traefik --tail 50 | grep xpeditis

# Devrait afficher :
# level=debug msg="Creating router xpeditis-api"
# level=debug msg="Creating service xpeditis-api"
```

### Vérifier le Network Traefik

```bash
docker network inspect traefik_network | grep -A 5 xpeditis

# Devrait afficher les containers xpeditis
```

### Forcer Traefik à Reload

```bash
docker service update --force traefik
```

---

**Date** : 2025-11-19
**Fix** : Labels Traefik déplacés sous `deploy.labels`
**Fichier** : `docker/portainer-stack-swarm.yml`
**Status** : ✅ Prêt pour déploiement
**ETA** : 5 minutes
