- Deleted apps/web/src/utils/optimisticStoreUpdates.ts (unused file) - File was unused - no imports found in codebase - Mutations already use React Query's onMutate pattern - No TypeScript errors after deletion - Actions 4.4.1.2 and 4.4.1.3 complete
407 lines
20 KiB
JSON
407 lines
20 KiB
JSON
{
|
|
"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"
|
|
]
|
|
}
|