From 96dc79a297b1b3ceed6c0bc666d990ba30400217 Mon Sep 17 00:00:00 2001 From: Gwadaking Date: Tue, 14 Apr 2026 00:31:46 -0400 Subject: [PATCH] =?UTF-8?q?fix:=20workers=20supervis=C3=A9s=20+=20tiles=20?= =?UTF-8?q?r=C3=A9g=C3=A9n=C3=A9r=C3=A9es=20apr=C3=A8s=20ingestion=20et=20?= =?UTF-8?q?au=20d=C3=A9marrage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IngestionScheduleHandler.php | 22 +++++++++++++ docker/php/entrypoint.sh | 31 ++++++++++++++----- 2 files changed, 46 insertions(+), 7 deletions(-) diff --git a/backend/src/MessageHandler/IngestionScheduleHandler.php b/backend/src/MessageHandler/IngestionScheduleHandler.php index 4c610f1..7440c2a 100644 --- a/backend/src/MessageHandler/IngestionScheduleHandler.php +++ b/backend/src/MessageHandler/IngestionScheduleHandler.php @@ -9,7 +9,9 @@ use App\Service\Forecast\ImpactScoreService; use App\Service\Ingestion\IngestionService; use Doctrine\ORM\EntityManagerInterface; use Psr\Log\LoggerInterface; +use Symfony\Component\DependencyInjection\Attribute\Autowire; use Symfony\Component\Messenger\Attribute\AsMessageHandler; +use Symfony\Component\Process\Process; /** * Exécute le pipeline complet à chaque tick du scheduler : @@ -35,6 +37,7 @@ final class IngestionScheduleHandler private ImpactScoreService $scores, private EntityManagerInterface $em, private LoggerInterface $logger, + #[Autowire('%kernel.project_dir%')] private string $projectDir, ) {} public function __invoke(IngestionScheduleMessage $message): void @@ -94,5 +97,24 @@ final class IngestionScheduleHandler } $this->logger->info('Scheduled ingestion completed'); + + // Étape 4 : régénération des vector tiles depuis les données fraîches + $this->regenerateTiles(); + } + + private function regenerateTiles(): void + { + $process = new Process( + ['php', 'bin/console', 'app:generate-tiles', '--env=prod', '--no-debug'], + $this->projectDir + ); + $process->setTimeout(300); + $process->run(); + + if ($process->isSuccessful()) { + $this->logger->info('Vector tiles regenerated'); + } else { + $this->logger->error('Tile generation failed', ['output' => $process->getErrorOutput()]); + } } } diff --git a/docker/php/entrypoint.sh b/docker/php/entrypoint.sh index 42a99a2..c8412e6 100644 --- a/docker/php/entrypoint.sh +++ b/docker/php/entrypoint.sh @@ -4,16 +4,33 @@ set -e # Warmup du cache Symfony au démarrage (les vars d'env sont disponibles ici) php bin/console cache:warmup --env=prod --no-debug 2>&1 || true +# Génère les tiles au démarrage depuis les données existantes en DB. +# Indispensable si le container redémarre sans que les tiles aient été régénérées +# par le pipeline d'ingestion (premier démarrage, redémarrage inattendu, etc.). +php bin/console app:generate-tiles --env=prod --no-debug 2>&1 | tee -a var/log/tiles.log || true + +# Boucle de supervision : relance le worker automatiquement après --time-limit ou crash. +# Sans cette boucle, les workers s'arrêtent définitivement après 3600s (--time-limit) +# et plus aucune ingestion ni traitement de message n'a lieu. +_supervise() { + name="$1"; shift + while true; do + printf '[%s] Starting worker: %s\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$name" >> "var/log/${name}.log" + "$@" >> "var/log/${name}.log" 2>&1 || true + printf '[%s] Worker %s stopped — restart in 5s\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$name" >> "var/log/${name}.log" + sleep 5 + done +} + # Worker scheduler — réveille le pipeline toutes les 6h -# --time-limit=3600 : redémarre le process toutes les heures (rotation naturelle + libération mémoire) -php bin/console messenger:consume scheduler_main \ - --env=prod --no-debug --memory-limit=64M --time-limit=3600 \ - 2>&1 | tee -a var/log/scheduler.log & +_supervise scheduler \ + php bin/console messenger:consume scheduler_main \ + --env=prod --no-debug --memory-limit=64M --time-limit=3600 & # Worker async — exécute les messages d'ingestion déclenchés par le scheduler -php bin/console messenger:consume async \ - --env=prod --no-debug --memory-limit=256M --time-limit=3600 \ - 2>&1 | tee -a var/log/worker.log & +_supervise async \ + php bin/console messenger:consume async \ + --env=prod --no-debug --memory-limit=256M --time-limit=3600 & # Lance FrankenPHP (comportement par défaut de l'image de base) exec frankenphp run --config /etc/caddy/Caddyfile "$@"