# 🚨 Debug Portainer - Containers Crash en Boucle

## 📊 Symptômes Observés

```
xpeditis-backend:   replicated 0 / 1  (should be 1/1)
xpeditis-frontend:  replicated 0 / 1  (should be 1/1)

Tasks Status: "complete" puis "starting" répété
→ Les containers démarrent puis crashent immédiatement
```

**404 sur les URLs** :
- https://app.preprod.xpeditis.com → 404
- https://api.preprod.xpeditis.com → 404

**Cause** : Traefik ne trouve pas les containers car ils ne sont pas en état "running".

---

## 🔍 Diagnostic Immédiat

### Étape 1 : Vérifier les Logs Backend

**Portainer → Services → xpeditis_xpeditis-backend → Logs**

**Chercher** :

#### Erreur Possible 1 : Migrations Échouent
```
❌ Error during migration: relation "XXX" already exists
```

**Solution** : Volume database corrompu, le recréer.

#### Erreur Possible 2 : Variables Manquantes
```
❌ Config validation error: "DATABASE_HOST" is required
```

**Solution** : Vérifier que toutes les variables sont dans le stack.

#### Erreur Possible 3 : Connection Database Failed
```
❌ Failed to connect to PostgreSQL after 30 attempts
```

**Solution** : PostgreSQL pas accessible ou credentials invalides.

#### Erreur Possible 4 : Port Déjà Utilisé
```
❌ Error: listen EADDRINUSE: address already in use :::4000
```

**Solution** : Ancien container toujours actif, le supprimer.

---

### Étape 2 : Vérifier les Logs Frontend

**Portainer → Services → xpeditis_xpeditis-frontend → Logs**

**Chercher** :

#### Erreur Possible 1 : Server.js Manquant
```
❌ Error: Cannot find module '/app/server.js'
```

**Solution** : Image mal buildée, vérifier CI/CD.

#### Erreur Possible 2 : Port Déjà Utilisé
```
❌ Error: listen EADDRINUSE: address already in use :::3000
```

**Solution** : Ancien container toujours actif.

---

## ⚡ Solutions Rapides

### Solution 1 : Nettoyer et Redéployer

**Sur le serveur Portainer via SSH** :

```bash
# 1. Supprimer tous les containers du stack
docker service rm xpeditis_xpeditis-backend
docker service rm xpeditis_xpeditis-frontend
docker service rm xpeditis_xpeditis-redis
docker service rm xpeditis_xpeditis-minio
docker service rm xpeditis_xpeditis-db

# 2. Attendre que tout soit nettoyé
docker service ls | grep xpeditis
# Devrait être vide

# 3. Supprimer le réseau interne (si nécessaire)
docker network rm xpeditis_xpeditis_internal 2>/dev/null || true

# 4. Dans Portainer : Supprimer le stack
# Portainer → Stacks → xpeditis → Remove stack

# 5. Recréer le stack avec le YAML corrigé
# Portainer → Stacks → Add stack → Copier portainer-stack.yml
```

---

### Solution 2 : Vérifier les Images ARM64

```bash
# Sur le serveur Portainer
docker manifest inspect rg.fr-par.scw.cloud/weworkstudio/xpeditis-backend:preprod | grep architecture

# Devrait afficher :
# "architecture": "arm64"

# Si seulement AMD64 :
# Vérifier que la CI/CD a bien rebuild avec ARM64 support
```

---

### Solution 3 : Vérifier le Network Traefik

```bash
# Sur le serveur Portainer
docker network ls | grep traefik_network

# Si absent :
docker network create --driver=overlay traefik_network

# Vérifier que Traefik est bien running
docker ps | grep traefik
```

---

## 🔧 Problèmes Connus et Fixes

### Problème 1 : Swarm Mode vs Compose Mode

**Votre stack utilise Docker Swarm** (`deploy.placement.constraints`).

**Vérifier** :
```bash
docker info | grep Swarm
# Devrait afficher : Swarm: active
```

**Si Swarm pas initialisé** :
```bash
docker swarm init
```

---

### Problème 2 : Registry Credentials en Swarm

En Docker Swarm, les credentials du registry doivent être configurés **différemment** :

```bash
# Option 1 : Login sur chaque node
docker login rg.fr-par.scw.cloud/weworkstudio
# Username: nologin
# Password: [token]

# Option 2 : Utiliser un Docker Config
echo "nologin" | docker secret create registry_username -
echo "[token]" | docker secret create registry_password -
```

---

### Problème 3 : Volumes Pas Montés Correctement

```bash
# Vérifier que les volumes existent
docker volume ls | grep xpeditis

# Devrait afficher :
# xpeditis_xpeditis_db_data
# xpeditis_xpeditis_redis_data
# xpeditis_xpeditis_minio_data
```

---

## 📋 Checklist de Debug

### 1. Logs Backend
- [ ] Voir les logs : `docker service logs xpeditis_xpeditis-backend --tail 50`
- [ ] Identifier l'erreur exacte (migration, connection, validation)

### 2. Logs Frontend
- [ ] Voir les logs : `docker service logs xpeditis_xpeditis-frontend --tail 50`
- [ ] Vérifier que server.js existe

### 3. Images
- [ ] Vérifier ARM64 : `docker manifest inspect ...`
- [ ] Vérifier que les images existent dans le registry

### 4. Network
- [ ] `docker network ls | grep traefik_network` → doit exister
- [ ] `docker network ls | grep xpeditis_internal` → doit exister

### 5. Swarm
- [ ] `docker info | grep Swarm` → doit être "active"
- [ ] `docker node ls` → tous les nodes "READY"

### 6. Registry
- [ ] `docker login rg.fr-par.scw.cloud/weworkstudio` → doit réussir
- [ ] Test pull manuel : `docker pull rg.fr-par.scw.cloud/weworkstudio/xpeditis-backend:preprod`

---

## 🎯 Commandes de Debug Essentielles

```bash
# 1. Voir les logs backend (dernières 50 lignes)
docker service logs xpeditis_xpeditis-backend --tail 50 --follow

# 2. Voir les logs frontend
docker service logs xpeditis_xpeditis-frontend --tail 50 --follow

# 3. Voir l'état des services
docker service ls

# 4. Voir les tasks (tasks = tentatives de démarrage)
docker service ps xpeditis_xpeditis-backend --no-trunc

# 5. Inspecter un service
docker service inspect xpeditis_xpeditis-backend --pretty

# 6. Vérifier les erreurs de déploiement
docker service ps xpeditis_xpeditis-backend --format "{{.Error}}"
```

---

## 🚨 Erreur Critique Probable

**Le problème le plus probable** :

### Hypothèse 1 : Images Pas Accessibles (Registry Credentials)

```bash
# Test
docker pull rg.fr-par.scw.cloud/weworkstudio/xpeditis-backend:preprod

# Si erreur "access denied" :
docker login rg.fr-par.scw.cloud/weworkstudio
# Username: nologin
# Password: [token Scaleway]
```

### Hypothèse 2 : Migrations Crashent

Le backend essaie de run les migrations mais elles échouent.

**Solution** :
```bash
# Supprimer le volume database et recréer
docker volume rm xpeditis_xpeditis_db_data

# Redéployer le stack (migrations créeront les tables from scratch)
```

### Hypothèse 3 : Variables d'Environnement Manquantes

Vérifier dans les logs si une variable est manquante.

---

## ✅ Action Immédiate à Faire

**Sur le serveur Portainer, exécuter** :

```bash
# 1. Voir l'erreur exacte du backend
docker service logs xpeditis_xpeditis-backend --tail 100

# 2. Copier-coller les dernières lignes d'erreur ici
```

**Ensuite je pourrai vous donner la solution exacte !**

---

**Date** : 2025-11-19
**Status** : 🔴 Containers crashent - Besoin logs pour diagnostic
**Action Requise** : Voir les logs backend/frontend pour identifier l'erreur exacte
