Files
music_library/config/prod.exs
T
Claudio Ortolina 4a6c80f7a9 ML-191: avoid VACUUM / scrobble refresh write collision
Set busy_timeout: 5_000 on MusicLibrary.Repo so SQLite waits up to
5 seconds on lock contention instead of throwing SQLITE_BUSY
immediately (default is 0).

Move RepoVacuum from 0 3 to 3 3 (3:03 AM London) to avoid the
deterministic collision with RefreshScrobbles which fires on the
every-5-min cadence at the hour mark.
2026-05-19 16:46:37 +01:00

72 lines
2.6 KiB
Elixir

import Config
# Note we also include the path to a cache manifest
# containing the digested version of static files. This
# manifest is generated by the `mix assets.deploy` task,
# which you should run after static files are built and
# before starting your production server.
config :music_library, MusicLibraryWeb.Endpoint,
cache_static_manifest: "priv/static/cache_manifest.json"
# Do not print debug messages in production
config :logger, level: :info
# Force single-line log output
config :phoenix, :logger, false
config :music_library, :single_line_logging, true
config :logster,
excludes: [:state, :params],
extra_fields: [:request_id],
filter_parameters: Application.get_env(:phoenix, :filter_parameters, ["password", "token"])
config :logger, :default_formatter,
format: {MusicLibrary.Logger.SingleLineFormatter, :format},
metadata: [:request_id, :pid]
config :music_library, monitoring_routes: true
config :error_tracker, enabled: true
config :music_library, ErrorTracker.ErrorNotifier,
from_email: "postmaster@mailgun.fullyforged.com",
to_email: "claudio@fullyforged.com",
mailer: MusicLibrary.Mailer,
base_url: "https://music-library.claudio-ortolina.org"
seven_days_in_seconds = 7 * 24 * 60 * 60
config :music_library, Oban,
plugins: [
{Oban.Plugins.Pruner, max_age: seven_days_in_seconds},
{Oban.Plugins.Reindexer, schedule: "@weekly"},
{Oban.Plugins.Cron,
timezone: "Europe/London",
crontab: [
# every 12 hours
{"0 */12 * * *", MusicLibrary.Worker.ApplyScrobbleRules},
{"0 */12 * * *", MusicLibrary.Worker.PruneAssetCache},
# every day at 2 am,
{"0 2 * * *", MusicLibrary.Worker.PruneAssets},
# every day at 3:03 am (staggered 3 min past the hour to avoid
# collision with RefreshScrobbles every-5-min cadence, fixes #4075)
{"3 3 * * *", MusicLibrary.Worker.RepoVacuum},
# every day at 4 am,
{"0 4 * * *", MusicLibrary.Worker.RepoOptimize},
# every first day of the month, staggered hourly
{"0 6 1 * *", MusicLibrary.Worker.RecordRefreshAllMusicBrainzData},
{"0 7 1 * *", MusicLibrary.Worker.RecordGenerateAllEmbeddings},
{"0 8 1 * *", MusicLibrary.Worker.ArtistRefreshAllMusicBrainzData},
{"0 9 1 * *", MusicLibrary.Worker.ArtistRefreshAllDiscogsData},
{"0 10 1 * *", MusicLibrary.Worker.ArtistRefreshAllWikipediaData},
# daily at 7 am
{"0 7 * * *", MusicLibrary.Worker.SendRecordsOnThisDayEmail},
# every 5 minutes
{"*/5 * * * *", MusicLibrary.Worker.RefreshScrobbles}
]}
]
# Runtime production configuration, including reading
# of environment variables, is done on config/runtime.exs.