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 "$@"