From b61f6ab444def655f838eb3fb45a19ef01bd4976 Mon Sep 17 00:00:00 2001 From: Maikel Linke Date: Tue, 31 Mar 2026 14:53:26 +1100 Subject: [PATCH] Schedule all jobs with Sidekiq --- config/initializers/sidekiq.rb | 9 +++++++++ config/schedule.rb | 8 -------- config/sidekiq.yml | 20 +++++-------------- config/sidekiq_scheduler.yml | 36 ++++++++++++++++++++++++++++++++++ 4 files changed, 50 insertions(+), 23 deletions(-) create mode 100644 config/sidekiq_scheduler.yml diff --git a/config/initializers/sidekiq.rb b/config/initializers/sidekiq.rb index 0628c9e409..25bf4bb557 100644 --- a/config/initializers/sidekiq.rb +++ b/config/initializers/sidekiq.rb @@ -7,6 +7,15 @@ redis_connection_settings = { Sidekiq.configure_server do |config| config.redis = redis_connection_settings + config.on(:startup) do + # Load schedule file similar to sidekiq/cli.rb loading the main config. + path = File.expand_path("../sidekiq_scheduler.yml", __dir__) + erb = ERB.new(File.read(path), trim_mode: "-") + + Sidekiq.schedule = + YAML.safe_load(erb.result, permitted_classes: [Symbol], aliases: true) + SidekiqScheduler::Scheduler.instance.reload_schedule! + end end Sidekiq.configure_client do |config| diff --git a/config/schedule.rb b/config/schedule.rb index a07f4d9972..5cd81427fc 100644 --- a/config/schedule.rb +++ b/config/schedule.rb @@ -10,11 +10,3 @@ env "MAILTO", ENV["SCHEDULE_NOTIFICATIONS"] if ENV["SCHEDULE_NOTIFICATIONS"] # If we use -e with a file containing specs, rspec interprets it and filters out our examples job_type :run_file, "cd :path; :environment_variable=:environment bundle exec script/rails runner :task :output" - -every 1.day, at: '2:45am' do - rake 'db2fog:clean' if ENV['S3_BACKUPS_BUCKET'] -end - -every 4.hours do - rake 'db2fog:backup' if ENV['S3_BACKUPS_BUCKET'] -end diff --git a/config/sidekiq.yml b/config/sidekiq.yml index a2de4a4f97..3be6e166dc 100644 --- a/config/sidekiq.yml +++ b/config/sidekiq.yml @@ -7,18 +7,8 @@ - default - mailers -:scheduler: - :schedule: - HeartbeatJob: - every: ["5m", first_in: "0s"] - SubscriptionPlacementJob: - every: "5m" - SubscriptionConfirmJob: - every: "5m" - TriggerOrderCyclesToOpenJob: - every: "5m" - OrderCycleClosingJob: - every: "5m" - RakeJob: - args: ["ofn:data:remove_transient_data"] - cron: "30 4 1 * *" +# This config is loaded by sidekiq before dotenv is loading our server config. +# Therefore we load the schedule later. See: +# +# - config/initializers/sidekiq.rb +# - config/sidekiq_scheduler.yml diff --git a/config/sidekiq_scheduler.yml b/config/sidekiq_scheduler.yml new file mode 100644 index 0000000000..29ef3a7e76 --- /dev/null +++ b/config/sidekiq_scheduler.yml @@ -0,0 +1,36 @@ +# Configure sidekiq-scheduler to run jobs. +# +# - https://github.com/sidekiq-scheduler/sidekiq-scheduler +# +# > Note that every and interval count from when the Sidekiq process (re)starts. +# > So every: '48h' will never run if the Sidekiq process is restarted daily, +# > for example. You can do every: ['48h', first_in: '0s'] to make the job run +# > immediately after a restart, and then have the worker check when it was +# > last run. +# +# Therefore, we use `cron` for jobs that should run at certain times like backups. +HeartbeatJob: + every: ["5m", first_in: "0s"] +SubscriptionPlacementJob: + every: "5m" +SubscriptionConfirmJob: + every: "5m" +TriggerOrderCyclesToOpenJob: + every: "5m" +OrderCycleClosingJob: + every: "5m" + +backup: + class: "RakeJob" + args: ["db2fog:backup"] + cron: "0 */4 * * *" # every 4 hours + enabled: <%= ENV.fetch("S3_BACKUPS_BUCKET", false) && true %> +backup_clean: + class: "RakeJob" + args: ["db2fog:clean"] + cron: "45 2 * * *" # every day at 2:45am + enabled: <%= ENV.fetch("S3_BACKUPS_BUCKET", false) && true %> +ofn_clean: + class: "RakeJob" + args: ["ofn:data:remove_transient_data"] + cron: "30 4 1 * *" # every month on the first at 4:30am