A full f00-f18 sweep takes ~170 min of wall time, longer than the ~90 min gap between deploys on this cluster. Over the last 7 days every run was killed mid-sweep and zero runs completed. The propagation_scores table only ever held the scraps from partial runs that landed before the pod died, which is why the map looked like it was showing "the current hour" (or nothing). The worker now processes exactly one forecast hour per perform/1 (~8-10 min) and enqueues the next hour as a fresh Oban job. A cron fire with empty args seeds the chain at f00; subsequent runs carry run_time + forecast_hour args. At f18 the chain stops and the pruner runs. Each step broadcasts propagation:updated immediately so new hours appear on the map as they land. Wall time per perform drops from ~170 min to ~10 min, so Lifeline's 2h rescue window is no longer a factor and a pod restart loses at most one forecast hour instead of the whole sweep. Retries and max_attempts now describe a single fh, not the whole chain. Also: bump the :propagation queue from 1 to 2 slots so PropagationPruneWorker can run alongside the chain job, drop the worker timeout/1 from 90 min to 20 min to match single-fh runs, and pull Lifeline rescue_after from 120 min to 45 min to keep the safety net above the step timeout. Adds a "Data from HH:MM UTC · Nh ago/now/+Nh" indicator above the pipeline chip in both the mobile and desktop sidebars so the user can tell which valid_time the map is showing when the bottom timeline isn't visible.
134 lines
4.5 KiB
Elixir
134 lines
4.5 KiB
Elixir
import Config
|
|
|
|
# Do not include metadata nor timestamps in development logs
|
|
config :logger, :default_formatter, format: "[$level] $message\n"
|
|
|
|
# Configure your database
|
|
config :microwaveprop, Microwaveprop.Repo,
|
|
username: "postgres",
|
|
password: "postgres",
|
|
hostname: "localhost",
|
|
database: "microwaveprop_dev",
|
|
stacktrace: true,
|
|
show_sensitive_data_on_connection_error: true,
|
|
pool_size: 30
|
|
|
|
# For development, we disable any cache and enable
|
|
# debugging and code reloading.
|
|
#
|
|
# The watchers configuration can be used to run external
|
|
# watchers to your application. For example, we can use it
|
|
# to bundle .js and .css sources.
|
|
config :microwaveprop, MicrowavepropWeb.Endpoint,
|
|
# Binding to loopback ipv4 address prevents access from other machines.
|
|
# Change to `ip: {0, 0, 0, 0}` to allow access from other machines.
|
|
http: [ip: {127, 0, 0, 1}],
|
|
check_origin: false,
|
|
code_reloader: true,
|
|
debug_errors: true,
|
|
secret_key_base: "XdcGVxLDrN12g/y157/MN637/UwLJyyPlnYQwXfJJQFN/KKdwnBU84onUFA9hfN7",
|
|
watchers: [
|
|
esbuild: {Esbuild, :install_and_run, [:microwaveprop, ~w(--sourcemap=inline --watch)]},
|
|
tailwind: {Tailwind, :install_and_run, [:microwaveprop, ~w(--watch)]}
|
|
]
|
|
|
|
# ## SSL Support
|
|
#
|
|
# In order to use HTTPS in development, a self-signed
|
|
# certificate can be generated by running the following
|
|
# Mix task:
|
|
#
|
|
# mix phx.gen.cert
|
|
#
|
|
# Run `mix help phx.gen.cert` for more information.
|
|
#
|
|
# The `http:` config above can be replaced with:
|
|
#
|
|
# https: [
|
|
# port: 4001,
|
|
# cipher_suite: :strong,
|
|
# keyfile: "priv/cert/selfsigned_key.pem",
|
|
# certfile: "priv/cert/selfsigned.pem"
|
|
# ],
|
|
#
|
|
# If desired, both `http:` and `https:` keys can be
|
|
# configured to run both http and https servers on
|
|
# different ports.
|
|
|
|
# Reload browser tabs when matching files change.
|
|
config :microwaveprop, MicrowavepropWeb.Endpoint,
|
|
live_reload: [
|
|
web_console_logger: true,
|
|
patterns: [
|
|
# Static assets, except user uploads
|
|
~r"priv/static/(?!uploads/).*\.(js|css|png|jpeg|jpg|gif|svg)$",
|
|
# Gettext translations
|
|
~r"priv/gettext/.*\.po$",
|
|
# Router, Controllers, LiveViews and LiveComponents
|
|
~r"lib/microwaveprop_web/router\.ex$",
|
|
~r"lib/microwaveprop_web/(controllers|live|components)/.*\.(ex|heex)$"
|
|
]
|
|
]
|
|
|
|
config :microwaveprop, Oban,
|
|
queues: [
|
|
# 2 slots so PropagationPruneWorker can run alongside the
|
|
# forecast-hour chain job.
|
|
propagation: 2,
|
|
solar: 1,
|
|
weather: 20,
|
|
enqueue: 1,
|
|
hrrr: 5,
|
|
terrain: 4,
|
|
commercial: 2,
|
|
iemre: 10,
|
|
backfill_enqueue: 1
|
|
],
|
|
plugins: [
|
|
{Oban.Plugins.Pruner, max_age: 3600 * 24},
|
|
# See runtime.exs — must exceed the worker's timeout/1 callback.
|
|
{Oban.Plugins.Lifeline, rescue_after: to_timeout(minute: 45)},
|
|
{Oban.Plugins.Cron,
|
|
crontab: [
|
|
{"5 */3 * * *", Microwaveprop.Workers.PropagationGridWorker},
|
|
{"*/2 * * * *", Microwaveprop.Workers.MrmsFetchWorker},
|
|
{"*/10 * * * *", Microwaveprop.Workers.AsosAdjustmentWorker},
|
|
{"*/15 * * * *", Microwaveprop.Workers.PropagationPruneWorker},
|
|
{"0 8 * * *", Microwaveprop.Workers.SolarIndexWorker}
|
|
]}
|
|
]
|
|
|
|
# Enable dev routes for dashboard and mailbox
|
|
config :microwaveprop, dev_routes: true
|
|
|
|
# HRRR caching handled by nginx proxy on skippy — no local filesystem cache
|
|
|
|
# Proxy HRRR downloads through local caching nginx (set to nil to use S3 directly)
|
|
config :microwaveprop, hrrr_base_url: "http://skippy.w5isp.com:8080"
|
|
|
|
# Load ML model at startup (Nx/Axon/EXLA only available in dev/test)
|
|
config :microwaveprop, load_ml_model: true
|
|
|
|
# Use local SRTM1 tiles for elevation lookups instead of the Open-Meteo API
|
|
config :microwaveprop, srtm_tiles_dir: Path.expand("~/srtm/tiles")
|
|
|
|
# Freshness monitor enabled (hourly PropagationGridWorker runs in dev)
|
|
config :microwaveprop, start_freshness_monitor: true
|
|
|
|
# Initialize plugs at runtime for faster development compilation
|
|
config :phoenix, :plug_init_mode, :runtime
|
|
|
|
# Set a higher stacktrace during development. Avoid configuring such
|
|
# in production as building large stacktraces may be expensive.
|
|
config :phoenix, :stacktrace_depth, 20
|
|
|
|
config :phoenix_live_view,
|
|
# Include debug annotations and locations in rendered markup.
|
|
# Changing this configuration will require mix clean and a full recompile.
|
|
debug_heex_annotations: true,
|
|
debug_attributes: true,
|
|
# Enable helpful, but potentially expensive runtime checks
|
|
enable_expensive_runtime_checks: true
|
|
|
|
# Disable swoosh api client as it is only required for production adapters.
|
|
config :swoosh, :api_client, false
|