feat: implémentation initiale du reverse proxy de maintenance
Reverse proxy Nginx (image stable-alpine) qui sert l'app upstream ou une page de maintenance 503 selon l'IP du client. - Modes whitelist/blacklist commutables via MAINTENANCE_MODE - Liste IPv4 via MAINTENANCE_IP_LIST (séparée par virgules, validée au boot) - Logique en directives Nginx natives (geo + map), zéro Lua/njs - Page statique sobre HTML+CSS inline, zéro JS, zéro réseau sortant - Log dédié /var/log/nginx/maintenance.log pour les requêtes bloquées - Validation des env vars dans /docker-entrypoint.d/10-init.sh - Stack Docker + docker-compose pour dev local et tests - 6 cas de tests d'intégration (whitelist/blacklist x autorisée/bloquée + log + nginx -t) - Lint shellcheck propre sur tous les scripts shell
This commit is contained in:
Executable
+79
@@ -0,0 +1,79 @@
|
||||
#!/usr/bin/env bash
|
||||
#
|
||||
# Orchestrateur des tests d'intégration :
|
||||
# 1. Build l'image proxy.
|
||||
# 2. Démarre la stack docker-compose.test.yml (upstream + client + proxy initial).
|
||||
# 3. Exécute chaque tests/cases/*.sh dans un sous-shell.
|
||||
# 4. Tear down systématique en fin (succès ou échec).
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
PROJECT_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
cd "$PROJECT_ROOT"
|
||||
|
||||
# shellcheck source-path=SCRIPTDIR
|
||||
# shellcheck source=lib.sh
|
||||
source "$PROJECT_ROOT/tests/lib.sh"
|
||||
|
||||
cleanup() {
|
||||
t_log "Tear down de la stack de tests..."
|
||||
"${COMPOSE[@]}" down --remove-orphans --volumes >/dev/null 2>&1 || true
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
t_log "Build de l'image maintenance-proxy:test..."
|
||||
"${COMPOSE[@]}" build --quiet proxy
|
||||
|
||||
t_log "Démarrage initial de la stack..."
|
||||
MAINTENANCE_MODE="whitelist" \
|
||||
MAINTENANCE_IP_LIST="172.28.5.50" \
|
||||
"${COMPOSE[@]}" up -d >/dev/null
|
||||
|
||||
# Attente que le client ait fini d'installer curl (entrypoint contient apk add).
|
||||
for _ in $(seq 1 30); do
|
||||
if "${COMPOSE[@]}" exec -T client sh -c 'command -v curl' >/dev/null 2>&1; then
|
||||
break
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
if ! "${COMPOSE[@]}" exec -T client sh -c 'command -v curl' >/dev/null 2>&1; then
|
||||
echo "[test] FAIL: curl indisponible dans le conteneur client" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
shopt -s nullglob
|
||||
cases=("$PROJECT_ROOT/tests/cases/"*.sh)
|
||||
if [[ ${#cases[@]} -eq 0 ]]; then
|
||||
echo "[test] aucun cas trouvé dans tests/cases/" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
passed=0
|
||||
failed=0
|
||||
failed_names=()
|
||||
|
||||
for case_path in "${cases[@]}"; do
|
||||
case_name="$(basename "$case_path" .sh)"
|
||||
t_log "▶ $case_name"
|
||||
if bash "$case_path"; then
|
||||
t_log " ✓ OK"
|
||||
passed=$((passed + 1))
|
||||
else
|
||||
t_log " ✗ FAIL"
|
||||
failed=$((failed + 1))
|
||||
failed_names+=("$case_name")
|
||||
fi
|
||||
done
|
||||
|
||||
echo
|
||||
echo "==============================================="
|
||||
echo " Résultats : $passed OK / $failed FAIL / $((passed + failed)) total"
|
||||
echo "==============================================="
|
||||
|
||||
if [[ $failed -gt 0 ]]; then
|
||||
echo "Cas échoués :" >&2
|
||||
for n in "${failed_names[@]}"; do
|
||||
echo " - $n" >&2
|
||||
done
|
||||
exit 1
|
||||
fi
|
||||
Reference in New Issue
Block a user