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:
@@ -42,6 +42,8 @@ services:
|
||||
UPLOAD_DIR: /app/uploads
|
||||
# Chemin unique utilisé par le serveur et vérifié au démarrage.
|
||||
STORAGE_BASE_PATH: /app/storage
|
||||
# Le déploiement Santinova requiert le volume historique des PDF.
|
||||
REQUIRE_STORAGE_VOLUME: "true"
|
||||
# Manus OAuth (optionnel en recette)
|
||||
VITE_APP_ID: ${VITE_APP_ID:-demat-facturation-recette}
|
||||
OAUTH_SERVER_URL: ${OAUTH_SERVER_URL:-}
|
||||
|
||||
@@ -5,20 +5,27 @@
|
||||
set -eu
|
||||
|
||||
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
|
||||
if [ ! -d "$storage_path" ]; then
|
||||
echo "[StorageGuard] Répertoire de stockage absent : $storage_path" >&2
|
||||
exit 1
|
||||
fi
|
||||
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
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ ! -w "$storage_path" ]; then
|
||||
if [ ! -w "$storage_path" ]; then
|
||||
echo "[StorageGuard] Volume persistant non inscriptible : $storage_path" >&2
|
||||
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
|
||||
|
||||
exec node dist/index.js
|
||||
|
||||
@@ -26,4 +26,13 @@ describe("routage et persistance de déploiement", () => {
|
||||
expect(guardScript).toContain("Volume persistant non monté");
|
||||
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"');
|
||||
});
|
||||
});
|
||||
|
||||
5
todo.md
5
todo.md
@@ -905,3 +905,8 @@
|
||||
- [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] 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
|
||||
|
||||
Reference in New Issue
Block a user