{ "title": "Todolist de Remédiation: veza-backend-api Broken Pipe & Fichier .env Manquant", "version": "1.0.0", "date": "2025-01-27", "priority": "P0", "description": "Todolist complète pour résoudre les problèmes de broken pipe et de fichier .env manquant dans le conteneur Incus pour veza-backend-api", "estimated_duration": "2-3 heures", "todos": [ { "id": "1", "category": "Diagnostic", "title": "Vérifier l'état actuel du déploiement", "description": "Vérifier l'état actuel du conteneur veza-backend-api et identifier les problèmes spécifiques", "status": "pending", "priority": "P0", "estimated_time": "15 minutes", "steps": [ { "step": 1, "action": "Vérifier que le conteneur existe et est en cours d'exécution", "command": "incus list veza-backend-api --format csv" }, { "step": 2, "action": "Vérifier le statut du service systemd", "command": "incus exec veza-backend-api -- systemctl status veza-backend-api" }, { "step": 3, "action": "Vérifier l'existence du fichier /etc/veza/backend-api.env", "command": "incus exec veza-backend-api -- test -f /etc/veza/backend-api.env && echo 'EXISTS' || echo 'MISSING'" }, { "step": 4, "action": "Vérifier les permissions du fichier /etc/veza/backend-api.env", "command": "incus exec veza-backend-api -- ls -la /etc/veza/backend-api.env" }, { "step": 5, "action": "Vérifier l'existence du fichier .env dans le working directory", "command": "incus exec veza-backend-api -- test -f /opt/veza/backend-api/.env && echo 'EXISTS' || echo 'MISSING'" }, { "step": 6, "action": "Vérifier les variables d'environnement chargées par systemd", "command": "incus exec veza-backend-api -- systemctl show veza-backend-api --property=EnvironmentFiles" }, { "step": 7, "action": "Vérifier les logs pour les erreurs de broken pipe", "command": "incus exec veza-backend-api -- journalctl -u veza-backend-api -n 50 | grep -i 'broken pipe'" }, { "step": 8, "action": "Vérifier les logs pour les erreurs de fichier .env manquant", "command": "incus exec veza-backend-api -- journalctl -u veza-backend-api -n 50 | grep -i 'env\\|environment'" } ], "validation": "Avoir une vision claire de l'état actuel et des problèmes spécifiques" }, { "id": "2", "category": "Fix: Fichier .env", "title": "Modifier le script de déploiement pour créer .env dans le working directory", "description": "Modifier deploy-service-native.sh pour copier le fichier .env aussi dans /opt/veza/backend-api/.env", "status": "pending", "priority": "P0", "estimated_time": "20 minutes", "dependencies": ["1"], "steps": [ { "step": 1, "action": "Lire le fichier deploy-service-native.sh pour comprendre la section backend-api", "file": "config/incus/deploy-service-native.sh", "lines": "315-358" }, { "step": 2, "action": "Ajouter la copie du fichier .env vers le working directory après la copie vers /etc/veza/", "location": "config/incus/deploy-service-native.sh", "after_line": "346", "code": " # Copy .env file to working directory for godotenv.Load() compatibility\n echo \"📄 Copying .env file to working directory: /opt/veza/backend-api/.env\"\n if ! incus file push \"${ENV_FILE}\" ${CONTAINER_NAME}/opt/veza/backend-api/.env; then\n echo \"❌ ERROR: Failed to push .env file to working directory\"\n exit 1\n fi\n \n # Verify the .env file was copied correctly to working directory\n if ! incus exec ${CONTAINER_NAME} -- test -f /opt/veza/backend-api/.env; then\n echo \"❌ ERROR: Failed to copy .env file to working directory\"\n exit 1\n fi\n \n # Verify .env file is readable and has content\n if ! incus exec ${CONTAINER_NAME} -- test -r /opt/veza/backend-api/.env; then\n echo \"❌ ERROR: .env file in working directory is not readable\"\n exit 1\n fi\n \n # Check .env file has at least some content (not empty)\n ENV_FILE_SIZE=$(incus exec ${CONTAINER_NAME} -- stat -c%s /opt/veza/backend-api/.env 2>/dev/null || echo \"0\")\n if [ \"${ENV_FILE_SIZE}\" -lt 100 ]; then\n echo \"⚠️ WARNING: .env file in working directory seems too small (${ENV_FILE_SIZE} bytes)\"\n fi\n \n echo \"✅ .env file copied to working directory successfully (${ENV_FILE_SIZE} bytes)\"" }, { "step": 3, "action": "Vérifier que les permissions sont correctes sur le fichier .env", "location": "config/incus/deploy-service-native.sh", "after_line": "previous_step", "code": " # Set correct permissions on .env file\n incus exec ${CONTAINER_NAME} -- chmod 644 /opt/veza/backend-api/.env" } ], "validation": "Le script copie maintenant le fichier .env dans le working directory avec vérifications" }, { "id": "3", "category": "Fix: Broken Pipe", "title": "Modifier le wrapper script pour rediriger stdout/stderr vers journald", "description": "Modifier start-backend-api.sh pour rediriger stdout/stderr vers journald dès le début et éviter les broken pipe", "status": "pending", "priority": "P0", "estimated_time": "15 minutes", "dependencies": ["1"], "steps": [ { "step": 1, "action": "Lire le fichier start-backend-api.sh actuel", "file": "config/incus/scripts/start-backend-api.sh" }, { "step": 2, "action": "Ajouter la redirection de stdout/stderr vers journald au début du script", "location": "config/incus/scripts/start-backend-api.sh", "after_line": "4", "code": "# Redirect stdout and stderr to journald to avoid broken pipe errors\n# This ensures all output goes to systemd journal from the start\nexec 1> >(systemd-cat -t veza-backend-api)\nexec 2> >(systemd-cat -t veza-backend-api)" }, { "step": 3, "action": "Alternative: Utiliser logger au lieu de systemd-cat si systemd-cat n'est pas disponible", "location": "config/incus/scripts/start-backend-api.sh", "code": "# Redirect stdout and stderr to journald to avoid broken pipe errors\n# Fallback to logger if systemd-cat is not available\nif command -v systemd-cat >/dev/null 2>&1; then\n exec 1> >(systemd-cat -t veza-backend-api)\n exec 2> >(systemd-cat -t veza-backend-api)\nelse\n exec 1> >(logger -t veza-backend-api)\n exec 2> >(logger -t veza-backend-api)\nfi" } ], "validation": "Le wrapper script redirige stdout/stderr vers journald dès le début" }, { "id": "4", "category": "Fix: Broken Pipe", "title": "Vérifier que le service systemd utilise correctement journald", "description": "Vérifier et améliorer la configuration systemd pour éviter les broken pipe", "status": "pending", "priority": "P0", "estimated_time": "10 minutes", "dependencies": ["1"], "steps": [ { "step": 1, "action": "Lire le fichier veza-backend-api.service", "file": "config/incus/systemd/veza-backend-api.service" }, { "step": 2, "action": "Vérifier que StandardOutput=journal et StandardError=journal sont présents", "location": "config/incus/systemd/veza-backend-api.service", "lines": "13-16" }, { "step": 3, "action": "Ajouter StandardInput=null pour éviter les problèmes de stdin", "location": "config/incus/systemd/veza-backend-api.service", "after_line": "16", "code": "StandardInput=null" }, { "step": 4, "action": "Vérifier que EnvironmentFile est marqué comme optionnel si le fichier n'existe pas", "note": "Systemd marque EnvironmentFile comme optionnel avec un préfixe '-' mais ce n'est pas recommandé. Mieux vaut s'assurer que le fichier existe toujours." } ], "validation": "Le service systemd est correctement configuré pour journald" }, { "id": "5", "category": "Fix: Vérifications", "title": "Améliorer les vérifications dans le script de déploiement", "description": "Ajouter des vérifications supplémentaires pour s'assurer que tout est correctement configuré", "status": "pending", "priority": "P1", "estimated_time": "20 minutes", "dependencies": ["2"], "steps": [ { "step": 1, "action": "Ajouter une vérification que le fichier .env dans le working directory contient les variables critiques", "location": "config/incus/deploy-service-native.sh", "after_line": "step_2_validation", "code": " # Verify critical environment variables are present in .env file\n echo \"🔍 Verifying critical environment variables in .env file...\"\n CRITICAL_VARS=(\"DATABASE_URL\" \"JWT_SECRET\" \"APP_ENV\")\n for var in \"${CRITICAL_VARS[@]}\"; do\n if ! incus exec ${CONTAINER_NAME} -- grep -q \"^${var}=\" /opt/veza/backend-api/.env; then\n echo \"⚠️ WARNING: Critical variable ${var} not found in .env file\"\n fi\n done" }, { "step": 2, "action": "Ajouter une vérification que les deux fichiers .env sont identiques", "location": "config/incus/deploy-service-native.sh", "after_line": "previous_step", "code": " # Verify both .env files are identical\n if ! incus exec ${CONTAINER_NAME} -- diff -q /etc/veza/backend-api.env /opt/veza/backend-api/.env >/dev/null 2>&1; then\n echo \"⚠️ WARNING: .env files in /etc/veza/ and working directory differ\"\n else\n echo \"✅ .env files are identical\"\n fi" }, { "step": 3, "action": "Ajouter une vérification que le wrapper script peut charger les variables", "location": "config/incus/deploy-service-native.sh", "after_line": "previous_step", "code": " # Test that wrapper script can load environment variables\n echo \"🧪 Testing environment variable loading...\"\n if incus exec ${CONTAINER_NAME} -- bash -c 'set -a; source /etc/veza/backend-api.env; set +a; [ -n \"$DATABASE_URL\" ] && [ -n \"$JWT_SECRET\" ]'; then\n echo \"✅ Environment variables can be loaded successfully\"\n else\n echo \"❌ ERROR: Failed to load environment variables\"\n exit 1\n fi" } ], "validation": "Le script de déploiement vérifie maintenant tous les aspects critiques" }, { "id": "6", "category": "Fix: Application Go", "title": "Vérifier que l'application Go gère correctement l'absence du fichier .env", "description": "S'assurer que godotenv.Load() ne cause pas d'erreur si le fichier .env n'existe pas (déjà fait mais vérifier)", "status": "pending", "priority": "P1", "estimated_time": "10 minutes", "dependencies": ["1"], "steps": [ { "step": 1, "action": "Vérifier que main.go utilise _ = godotenv.Load() (ignore les erreurs)", "file": "veza-backend-api/cmd/api/main.go", "line": "50" }, { "step": 2, "action": "Vérifier que env_loader.go gère correctement l'absence du fichier", "file": "veza-backend-api/internal/config/env_loader.go", "line": "24" }, { "step": 3, "action": "Vérifier que config.NewConfig() continue même si LoadEnvFiles() échoue", "file": "veza-backend-api/internal/config/config.go", "lines": "210-213" } ], "validation": "L'application Go gère correctement l'absence du fichier .env" }, { "id": "7", "category": "Test", "title": "Tester le déploiement complet", "description": "Déployer le service avec les corrections et vérifier que tout fonctionne", "status": "pending", "priority": "P0", "estimated_time": "30 minutes", "dependencies": ["2", "3", "4"], "steps": [ { "step": 1, "action": "Arrêter et supprimer le conteneur existant (si nécessaire)", "command": "incus stop veza-backend-api 2>/dev/null || true\nincus delete veza-backend-api --force 2>/dev/null || true" }, { "step": 2, "action": "Déployer le service avec le script modifié", "command": "./config/incus/deploy-service-native.sh backend-api" }, { "step": 3, "action": "Vérifier que le conteneur est en cours d'exécution", "command": "incus list veza-backend-api --format csv" }, { "step": 4, "action": "Vérifier que les deux fichiers .env existent", "command": "incus exec veza-backend-api -- test -f /etc/veza/backend-api.env && echo '✅ /etc/veza/backend-api.env exists'\nincus exec veza-backend-api -- test -f /opt/veza/backend-api/.env && echo '✅ /opt/veza/backend-api/.env exists'" }, { "step": 5, "action": "Vérifier que les fichiers .env sont identiques", "command": "incus exec veza-backend-api -- diff -q /etc/veza/backend-api.env /opt/veza/backend-api/.env && echo '✅ Files are identical'" }, { "step": 6, "action": "Vérifier que le service systemd est actif", "command": "incus exec veza-backend-api -- systemctl is-active veza-backend-api" }, { "step": 7, "action": "Vérifier les logs pour les erreurs de broken pipe", "command": "incus exec veza-backend-api -- journalctl -u veza-backend-api -n 50 | grep -i 'broken pipe' || echo '✅ No broken pipe errors'" }, { "step": 8, "action": "Vérifier les logs pour les erreurs de fichier .env", "command": "incus exec veza-backend-api -- journalctl -u veza-backend-api -n 50 | grep -iE 'env|environment|\.env' || echo '✅ No .env errors'" }, { "step": 9, "action": "Vérifier que les variables d'environnement sont chargées", "command": "incus exec veza-backend-api -- systemctl show veza-backend-api --property=Environment | grep -q DATABASE_URL && echo '✅ Environment variables loaded'" }, { "step": 10, "action": "Tester l'endpoint de santé", "command": "sleep 5\nincus exec veza-backend-api -- curl -f http://localhost:8080/health || incus exec veza-backend-api -- curl -f http://localhost:8080/api/v1/health" } ], "validation": "Le service démarre correctement sans erreurs de broken pipe ou de fichier .env manquant" }, { "id": "8", "category": "Test", "title": "Tester les scénarios d'échec", "description": "Tester ce qui se passe si le fichier .env est manquant ou corrompu", "status": "pending", "priority": "P1", "estimated_time": "20 minutes", "dependencies": ["7"], "steps": [ { "step": 1, "action": "Tester le démarrage sans fichier .env dans le working directory", "command": "incus exec veza-backend-api -- rm /opt/veza/backend-api/.env\nincus exec veza-backend-api -- systemctl restart veza-backend-api\nsleep 5\nincus exec veza-backend-api -- systemctl status veza-backend-api" }, { "step": 2, "action": "Restaurer le fichier .env", "command": "incus exec veza-backend-api -- cp /etc/veza/backend-api.env /opt/veza/backend-api/.env\nincus exec veza-backend-api -- systemctl restart veza-backend-api" }, { "step": 3, "action": "Tester avec un fichier .env corrompu (syntaxe invalide)", "command": "incus exec veza-backend-api -- bash -c 'echo \"INVALID_SYNTAX\" > /opt/veza/backend-api/.env'\nincus exec veza-backend-api -- systemctl restart veza-backend-api\nsleep 5\nincus exec veza-backend-api -- journalctl -u veza-backend-api -n 20" }, { "step": 4, "action": "Restaurer le fichier .env correct", "command": "incus exec veza-backend-api -- cp /etc/veza/backend-api.env /opt/veza/backend-api/.env\nincus exec veza-backend-api -- systemctl restart veza-backend-api" } ], "validation": "L'application gère correctement les scénarios d'échec" }, { "id": "9", "category": "Documentation", "title": "Documenter l'architecture de chargement des variables d'environnement", "description": "Créer une documentation claire expliquant comment les variables d'environnement sont chargées", "status": "pending", "priority": "P2", "estimated_time": "15 minutes", "dependencies": ["7"], "steps": [ { "step": 1, "action": "Créer un fichier de documentation ENV_LOADING.md", "file": "config/incus/ENV_LOADING.md", "content": "Documentation expliquant:\n- Où sont les fichiers .env\n- Comment ils sont chargés (systemd, wrapper script, application Go)\n- Ordre de priorité des variables\n- Comment modifier les variables" }, { "step": 2, "action": "Mettre à jour le README.md avec un lien vers la documentation", "file": "config/incus/README.md" } ], "validation": "La documentation est créée et accessible" }, { "id": "10", "category": "Validation Finale", "title": "Exécuter le script de vérification complet", "description": "Exécuter verify-deployment.sh pour valider que tout fonctionne correctement", "status": "pending", "priority": "P0", "estimated_time": "10 minutes", "dependencies": ["7", "8"], "steps": [ { "step": 1, "action": "Exécuter le script de vérification", "command": "./config/incus/verify-deployment.sh" }, { "step": 2, "action": "Vérifier que tous les tests passent", "command": "Vérifier manuellement les résultats" }, { "step": 3, "action": "Vérifier les logs complets du service", "command": "incus exec veza-backend-api -- journalctl -u veza-backend-api --no-pager | tail -100" } ], "validation": "Tous les tests de vérification passent" }, { "id": "11", "category": "Cleanup", "title": "Nettoyer les fichiers temporaires et les tests", "description": "Nettoyer les fichiers de test créés pendant le diagnostic", "status": "pending", "priority": "P3", "estimated_time": "5 minutes", "dependencies": ["10"], "steps": [ { "step": 1, "action": "Vérifier qu'il n'y a pas de fichiers temporaires à nettoyer", "command": "Aucun fichier temporaire créé dans cette remédiation" } ], "validation": "Pas de fichiers temporaires à nettoyer" } ], "notes": [ "Cette todolist doit être exécutée dans l'ordre des dépendances", "Les todos avec priority P0 sont critiques et doivent être complétés en premier", "Tester chaque fix individuellement avant de passer au suivant", "Documenter toute modification apportée au code" ], "success_criteria": [ "Le service veza-backend-api démarre sans erreur", "Aucune erreur de broken pipe dans les logs", "Le fichier .env est présent dans le working directory", "Les variables d'environnement sont correctement chargées", "L'endpoint de santé répond correctement", "Tous les tests de vérification passent" ] }