diff --git a/.env-sample b/.env-sample index fb52931..48de821 100644 --- a/.env-sample +++ b/.env-sample @@ -6,6 +6,11 @@ POSTGRES_HOST=postgres APP_BIND_ADDRESS=127.0.0.1 APP_PORT=9090 ENABLE_SCHEDULED_JOBS=true +# Gates the FTP station fetch and DMI Harmonie fetch specifically, separately +# from ENABLE_SCHEDULED_JOBS, since both require real credentials below. +# Leave false until those are real; both jobs throw on placeholder values, +# and would otherwise crash-loop the whole app rather than just fail quietly. +ENABLE_LEGACY_PROVIDER_JOBS=false METEO_USER=aaa METEO_PASSWORD=aaa diff --git a/src/main/scala/Main.scala b/src/main/scala/Main.scala index 9b5384a..c14c2b6 100644 --- a/src/main/scala/Main.scala +++ b/src/main/scala/Main.scala @@ -55,11 +55,25 @@ object Main extends IOApp { server <- Server.of(postgresService, dataService, fetchLvgmcService, warningService) serverTask = server.run - scheduledTasks = + // Split from the legacy provider jobs below: parMapN cancels and fails + // every branch the moment any one of them throws, and the FTP/Harmonie + // paths currently point at placeholder credentials that always throw + // on first use. Without this split, enabling scheduled jobs at all + // would crash-loop the whole app (server included) roughly every few + // minutes rather than just start the real, working open-data fetch. + safeTasks = if (sys.env.get("ENABLE_SCHEDULED_JOBS").exists(_.equalsIgnoreCase("false"))) IO.never[Unit] else - (fetchStationsTask, fetchOpenDataStationsTask, cleanupTask, fetchGribTask).parMapN((_, _, _, _) => ()) + (fetchOpenDataStationsTask, cleanupTask).parMapN((_, _) => ()) + + legacyProviderTasks = + if (sys.env.get("ENABLE_LEGACY_PROVIDER_JOBS").exists(_.equalsIgnoreCase("true"))) + (fetchStationsTask, fetchGribTask).parMapN((_, _) => ()) + else + IO.never[Unit] + + scheduledTasks = (safeTasks, legacyProviderTasks).parMapN((_, _) => ()) exitCode <- (serverTask, scheduledTasks).parMapN((_, _) => ExitCode.Success) } yield exitCode