Checkpoint: Le garde-fou de stockage distingue désormais les environnements : les serveurs Santinova exigent explicitement REQUIRE_STORAGE_VOLUME=true et bloquent sans volume PDF monté, tandis que l’hébergement cloud crée le répertoire local nécessaire sans arrêter le démarrage. Les tests, TypeScript, build et une sonde de démarrage cloud sont validés.

This commit is contained in:
Manus
2026-09-03 15:35:55 +00:00
parent 2c5b285e54
commit 1b7a46e05f
4 changed files with 34 additions and 11 deletions

View File

@@ -42,6 +42,8 @@ services:
UPLOAD_DIR: /app/uploads UPLOAD_DIR: /app/uploads
# Chemin unique utilisé par le serveur et vérifié au démarrage. # Chemin unique utilisé par le serveur et vérifié au démarrage.
STORAGE_BASE_PATH: /app/storage STORAGE_BASE_PATH: /app/storage
# Le déploiement Santinova requiert le volume historique des PDF.
REQUIRE_STORAGE_VOLUME: "true"
# Manus OAuth (optionnel en recette) # Manus OAuth (optionnel en recette)
VITE_APP_ID: ${VITE_APP_ID:-demat-facturation-recette} VITE_APP_ID: ${VITE_APP_ID:-demat-facturation-recette}
OAUTH_SERVER_URL: ${OAUTH_SERVER_URL:-} OAUTH_SERVER_URL: ${OAUTH_SERVER_URL:-}

View File

@@ -5,20 +5,27 @@
set -eu set -eu
storage_path="${STORAGE_BASE_PATH:-/app/storage}" storage_path="${STORAGE_BASE_PATH:-/app/storage}"
require_storage_volume="${REQUIRE_STORAGE_VOLUME:-false}"
if [ ! -d "$storage_path" ]; then if [ "$require_storage_volume" = "true" ]; then
echo "[StorageGuard] Répertoire de stockage absent : $storage_path" >&2 if [ ! -d "$storage_path" ]; then
exit 1 echo "[StorageGuard] Répertoire de stockage absent : $storage_path" >&2
fi exit 1
fi
if ! awk -v expected="$storage_path" '$2 == expected { mounted = 1 } END { exit mounted ? 0 : 1 }' /proc/mounts; then if ! awk -v expected="$storage_path" '$2 == expected { mounted = 1 } END { exit mounted ? 0 : 1 }' /proc/mounts; then
echo "[StorageGuard] Volume persistant non monté sur $storage_path ; démarrage annulé." >&2 echo "[StorageGuard] Volume persistant non monté sur $storage_path ; démarrage annulé." >&2
exit 1 exit 1
fi fi
if [ ! -w "$storage_path" ]; then if [ ! -w "$storage_path" ]; then
echo "[StorageGuard] Volume persistant non inscriptible : $storage_path" >&2 echo "[StorageGuard] Volume persistant non inscriptible : $storage_path" >&2
exit 1 exit 1
fi
else
# L’hébergement cloud n’expose pas de volume Docker local. Il utilise le
# stockage applicatif disponible à l’exécution et doit donc pouvoir démarrer.
mkdir -p "$storage_path"
fi fi
exec node dist/index.js exec node dist/index.js

View File

@@ -26,4 +26,13 @@ describe("routage et persistance de déploiement", () => {
expect(guardScript).toContain("Volume persistant non monté"); expect(guardScript).toContain("Volume persistant non monté");
expect(guardScript).toContain("/proc/mounts"); expect(guardScript).toContain("/proc/mounts");
}); });
it("réserve le contrôle bloquant du volume aux environnements Santinova", () => {
const composeFile = readFileSync(join(process.cwd(), "docker-compose.yml"), "utf8");
const guardScript = readFileSync(join(process.cwd(), "scripts", "ensure-storage-volume.sh"), "utf8");
expect(composeFile).toContain('REQUIRE_STORAGE_VOLUME: "true"');
expect(guardScript).toContain('REQUIRE_STORAGE_VOLUME:-false');
expect(guardScript).toContain('mkdir -p "$storage_path"');
});
}); });

View File

@@ -905,3 +905,8 @@
- [x] Auditer les montages de stockage et la chaîne de reconstruction en recette et production - [x] Auditer les montages de stockage et la chaîne de reconstruction en recette et production
- [x] Ajouter un contrôle bloquant avant reconstruction et une vérification après démarrage du volume `/app/storage` - [x] Ajouter un contrôle bloquant avant reconstruction et une vérification après démarrage du volume `/app/storage`
- [x] Vérifier les garde-fous sur les deux environnements sans modifier les données - [x] Vérifier les garde-fous sur les deux environnements sans modifier les données
## Correctif du démarrage cloud après garde-fou PDF
- [x] Adapter le garde-fou afin qu’il soit obligatoire uniquement avec `REQUIRE_STORAGE_VOLUME=true`
- [x] Conserver le contrôle strict du volume sur recette et production Santinova
- [x] Valider le démarrage du déploiement cloud sans volume local