Skip to content

Commit 507fe64

Browse files
committed
Updates Solid Queue dev config and Kamal deploy config.
Solid Queue now uses the DB instead of an in-memory queue. The reason for this is that recurring tasks (the scheduler) only work with the DB so we might as well have workers and dispatchers use it as well (see https://github.com/rails/solid_queue?tab=readme-ov-file#workers-dispatchers-and-scheduler). I wanted to ensure Kamal deploy works so I followed these instructions to deploy to a local VM: https://alexpeattie.com/blog/testing-kamal-locally-with-multipass. I'm just going to check in the config as is, which is configured to a certain IP, ssh user, as well as my DockerHub account. For production we'd just need to update the IP and ssh user.
1 parent ea486c0 commit 507fe64

File tree

6 files changed

+100
-82
lines changed

6 files changed

+100
-82
lines changed

.kamal/secrets

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
# RAILS_MASTER_KEY=$(kamal secrets extract RAILS_MASTER_KEY ${SECRETS})
99

1010
# Example of extracting secrets from Rails credentials
11-
# KAMAL_REGISTRY_PASSWORD=$(rails credentials:fetch kamal.registry_password)
11+
KAMAL_REGISTRY_PASSWORD=$(rails credentials:fetch kamal.registry_password)
1212

1313
# Use a GITHUB_TOKEN if private repositories are needed for the image
1414
# GITHUB_TOKEN=$(gh config get -h github.com oauth_token)

config/credentials.yml.enc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
KSPp+jfQXoBcpu3m0F3ObuNcwCMVHZB4eXgVfkKrxaiYTu+eDLaEibspJcdhrk4V/TAcUa1QQmPPCPzy+Lsx8ik2Ca59sTZ/XyWHH4qlD5nrQuMZZmViNwldLCkdyMknQpoNoSaOvY0VbOgrS+5nG+M/LC0iq4jVUwLZW67rsnVxW4pRc7/fqYp+NP4PvjfNnt42eyF+mjH12z0m2MBW2Hq5w+iKsbG0H0r9ewupKliyfSCI13euO25mgm1jOtF2TZajDS7OwpbTZlWmnaBDP9DaZgL7hSWcCI3K7GH2Rf3Rs7yqioluD87a2uw9uVWqp11k5ODX8tMSNzYe8EYLrEviIypW2JDba1xDaUdtsTXntYLxzOF0Y2ouJ8L0dBdmbOHU2ryl+cxggF9fQREM7wekr0axpV1T2sy6egPzdNcM1wxv0EKW0yHP8imcpmZiD7prhE9oBvQP6PN3gApMgbZro8chCBokbF76m3FbD/fUFPOJD+Owaidy--fKmOar9r6b+6195y--83UG7+R0E4v/1VZaw9nXKw==
1+
dv2Mecwn+55vqksZ1yfKF3vsJl8MmZGPe4s066roWnOoGN6IGiKKnbo1flB2Oeg2Ajy/4QzaqgGkeL87eZH07yDHGQ30sxfYTBhYLaBL24rHncYjtkDW2rJ9tVekSZNaFNKlWk60zt/sjpQNDne30H2wQ1TvFY+sOrTZ0Qs4y2s8zKifaElGXXHTovb69GxA91c09QUexXifO+wxEH0iLtpLJb/IrxgY3wSyWxK9pUpWLFIS8u0aXrp2pkjXfaHE8jtuk/MzYRxwajD3pc8tHLUIzVTjjzEX0/lWnsMvUboEMq+puXWCK6C5YGMaPRhFFiLh8IuRB3LkaRRdSt88BkZW9+lLacXCp7bJO9wsh5Dq323KUGMdptucEDGFkckQ9blzDMycOTNBGDnMw/Kbi2FKTokpDHFUz87YglpDlareWj6jit82rG20lY8a8o6Di89jnNYygsBb0C9Bx3IasnrVpMGS8DWIsYD/bixNJYTm/uyoKMOc83EtYO9Dkxv+ogd55sP9zl8PvluI3lKn2oQEVML0kriBgoOZGVaP9EZ0SZb1NVThagg0yzx4who/qvEDZT6bFDKBTpzU--s1RgzDhrVWS81a+H--HYYYub0huI2WokiWm5LKwQ==

config/database.yml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,13 @@ default: &default
1010
timeout: 5000
1111

1212
development:
13-
<<: *default
14-
database: storage/development.sqlite3
13+
primary:
14+
<<: *default
15+
database: storage/development.sqlite3
16+
queue:
17+
<<: *default
18+
database: storage/development_queue.sqlite3
19+
migrations_paths: db/queue_migrate
1520

1621
# Warning: The database defined as "test" will be erased and
1722
# re-generated from your development database when you run "rake".

config/deploy.yml

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@
22
service: create12_burnout
33

44
# Name of the container image (use your-user/app-name on external registries).
5-
image: create12_burnout
5+
image: achinn05/create12_burnout
66

77
# Deploy to these servers.
88
servers:
99
web:
10-
- 192.168.0.1
11-
# job:
12-
# hosts:
13-
# - 192.168.0.1
14-
# cmd: bin/jobs
10+
- 192.168.64.2
11+
job:
12+
hosts:
13+
- 192.168.64.2
14+
cmd: bin/jobs
1515

1616
# Enable SSL auto certification via Let's Encrypt and allow for multiple apps on a single web server.
1717
# If used with Cloudflare, set encryption mode in SSL/TLS setting to "Full" to enable CF-to-app encryption.
@@ -26,24 +26,21 @@ servers:
2626

2727
# Where you keep your container images.
2828
registry:
29-
# Alternatives: hub.docker.com / registry.digitalocean.com / ghcr.io / ...
30-
server: localhost:5555
31-
3229
# Needed for authenticated registries.
33-
# username: your-user
30+
username: achinn05
3431

3532
# Always use an access token rather than real password when possible.
36-
# password:
37-
# - KAMAL_REGISTRY_PASSWORD
33+
password:
34+
- KAMAL_REGISTRY_PASSWORD
3835

3936
# Inject ENV variables into containers (secrets come from .kamal/secrets).
4037
env:
4138
secret:
4239
- RAILS_MASTER_KEY
43-
clear:
40+
# clear:
4441
# Run the Solid Queue Supervisor inside the web server's Puma process to do jobs.
4542
# When you start using multiple servers, you should split out job processing to a dedicated machine.
46-
SOLID_QUEUE_IN_PUMA: true
43+
# SOLID_QUEUE_IN_PUMA: true
4744

4845
# Set number of processes dedicated to Solid Queue (default: 1)
4946
# JOB_CONCURRENCY: 3
@@ -92,8 +89,8 @@ builder:
9289
# - RAILS_MASTER_KEY
9390

9491
# Use a different ssh user than root
95-
# ssh:
96-
# user: app
92+
ssh:
93+
user: ubuntu
9794

9895
# Use accessory services (secrets come from .kamal/secrets).
9996
# accessories:

config/environments/development.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,10 @@
5555
# Highlight code that enqueued background job in logs.
5656
config.active_job.verbose_enqueue_logs = true
5757

58+
# Replace the default in-process and non-durable queuing backend for Active Job.
59+
config.active_job.queue_adapter = :solid_queue
60+
config.solid_queue.connects_to = { database: { writing: :queue } }
61+
5862
# Highlight code that triggered redirect in logs.
5963
config.action_dispatch.verbose_redirect_logs = true
6064

db/queue_schema.rb

Lines changed: 74 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,123 +1,135 @@
1-
ActiveRecord::Schema[7.1].define(version: 1) do
1+
# This file is auto-generated from the current state of the database. Instead
2+
# of editing this file, please use the migrations feature of Active Record to
3+
# incrementally modify your database, and then regenerate this schema definition.
4+
#
5+
# This file is the source Rails uses to define your schema when running `bin/rails
6+
# db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to
7+
# be faster and is potentially less error prone than running all of your
8+
# migrations from scratch. Old migrations may fail to apply correctly if those
9+
# migrations use external dependencies or application code.
10+
#
11+
# It's strongly recommended that you check this file into your version control system.
12+
13+
ActiveRecord::Schema[8.1].define(version: 1) do
214
create_table "solid_queue_blocked_executions", force: :cascade do |t|
3-
t.bigint "job_id", null: false
4-
t.string "queue_name", null: false
5-
t.integer "priority", default: 0, null: false
615
t.string "concurrency_key", null: false
7-
t.datetime "expires_at", null: false
816
t.datetime "created_at", null: false
9-
t.index [ "concurrency_key", "priority", "job_id" ], name: "index_solid_queue_blocked_executions_for_release"
10-
t.index [ "expires_at", "concurrency_key" ], name: "index_solid_queue_blocked_executions_for_maintenance"
11-
t.index [ "job_id" ], name: "index_solid_queue_blocked_executions_on_job_id", unique: true
17+
t.datetime "expires_at", null: false
18+
t.bigint "job_id", null: false
19+
t.integer "priority", default: 0, null: false
20+
t.string "queue_name", null: false
21+
t.index ["concurrency_key", "priority", "job_id"], name: "index_solid_queue_blocked_executions_for_release"
22+
t.index ["expires_at", "concurrency_key"], name: "index_solid_queue_blocked_executions_for_maintenance"
23+
t.index ["job_id"], name: "index_solid_queue_blocked_executions_on_job_id", unique: true
1224
end
1325

1426
create_table "solid_queue_claimed_executions", force: :cascade do |t|
27+
t.datetime "created_at", null: false
1528
t.bigint "job_id", null: false
1629
t.bigint "process_id"
17-
t.datetime "created_at", null: false
18-
t.index [ "job_id" ], name: "index_solid_queue_claimed_executions_on_job_id", unique: true
19-
t.index [ "process_id", "job_id" ], name: "index_solid_queue_claimed_executions_on_process_id_and_job_id"
30+
t.index ["job_id"], name: "index_solid_queue_claimed_executions_on_job_id", unique: true
31+
t.index ["process_id", "job_id"], name: "index_solid_queue_claimed_executions_on_process_id_and_job_id"
2032
end
2133

2234
create_table "solid_queue_failed_executions", force: :cascade do |t|
23-
t.bigint "job_id", null: false
24-
t.text "error"
2535
t.datetime "created_at", null: false
26-
t.index [ "job_id" ], name: "index_solid_queue_failed_executions_on_job_id", unique: true
36+
t.text "error"
37+
t.bigint "job_id", null: false
38+
t.index ["job_id"], name: "index_solid_queue_failed_executions_on_job_id", unique: true
2739
end
2840

2941
create_table "solid_queue_jobs", force: :cascade do |t|
30-
t.string "queue_name", null: false
31-
t.string "class_name", null: false
32-
t.text "arguments"
33-
t.integer "priority", default: 0, null: false
3442
t.string "active_job_id"
35-
t.datetime "scheduled_at"
36-
t.datetime "finished_at"
43+
t.text "arguments"
44+
t.string "class_name", null: false
3745
t.string "concurrency_key"
3846
t.datetime "created_at", null: false
47+
t.datetime "finished_at"
48+
t.integer "priority", default: 0, null: false
49+
t.string "queue_name", null: false
50+
t.datetime "scheduled_at"
3951
t.datetime "updated_at", null: false
40-
t.index [ "active_job_id" ], name: "index_solid_queue_jobs_on_active_job_id"
41-
t.index [ "class_name" ], name: "index_solid_queue_jobs_on_class_name"
42-
t.index [ "finished_at" ], name: "index_solid_queue_jobs_on_finished_at"
43-
t.index [ "queue_name", "finished_at" ], name: "index_solid_queue_jobs_for_filtering"
44-
t.index [ "scheduled_at", "finished_at" ], name: "index_solid_queue_jobs_for_alerting"
52+
t.index ["active_job_id"], name: "index_solid_queue_jobs_on_active_job_id"
53+
t.index ["class_name"], name: "index_solid_queue_jobs_on_class_name"
54+
t.index ["finished_at"], name: "index_solid_queue_jobs_on_finished_at"
55+
t.index ["queue_name", "finished_at"], name: "index_solid_queue_jobs_for_filtering"
56+
t.index ["scheduled_at", "finished_at"], name: "index_solid_queue_jobs_for_alerting"
4557
end
4658

4759
create_table "solid_queue_pauses", force: :cascade do |t|
48-
t.string "queue_name", null: false
4960
t.datetime "created_at", null: false
50-
t.index [ "queue_name" ], name: "index_solid_queue_pauses_on_queue_name", unique: true
61+
t.string "queue_name", null: false
62+
t.index ["queue_name"], name: "index_solid_queue_pauses_on_queue_name", unique: true
5163
end
5264

5365
create_table "solid_queue_processes", force: :cascade do |t|
66+
t.datetime "created_at", null: false
67+
t.string "hostname"
5468
t.string "kind", null: false
5569
t.datetime "last_heartbeat_at", null: false
56-
t.bigint "supervisor_id"
57-
t.integer "pid", null: false
58-
t.string "hostname"
5970
t.text "metadata"
60-
t.datetime "created_at", null: false
6171
t.string "name", null: false
62-
t.index [ "last_heartbeat_at" ], name: "index_solid_queue_processes_on_last_heartbeat_at"
63-
t.index [ "name", "supervisor_id" ], name: "index_solid_queue_processes_on_name_and_supervisor_id", unique: true
64-
t.index [ "supervisor_id" ], name: "index_solid_queue_processes_on_supervisor_id"
72+
t.integer "pid", null: false
73+
t.bigint "supervisor_id"
74+
t.index ["last_heartbeat_at"], name: "index_solid_queue_processes_on_last_heartbeat_at"
75+
t.index ["name", "supervisor_id"], name: "index_solid_queue_processes_on_name_and_supervisor_id", unique: true
76+
t.index ["supervisor_id"], name: "index_solid_queue_processes_on_supervisor_id"
6577
end
6678

6779
create_table "solid_queue_ready_executions", force: :cascade do |t|
80+
t.datetime "created_at", null: false
6881
t.bigint "job_id", null: false
69-
t.string "queue_name", null: false
7082
t.integer "priority", default: 0, null: false
71-
t.datetime "created_at", null: false
72-
t.index [ "job_id" ], name: "index_solid_queue_ready_executions_on_job_id", unique: true
73-
t.index [ "priority", "job_id" ], name: "index_solid_queue_poll_all"
74-
t.index [ "queue_name", "priority", "job_id" ], name: "index_solid_queue_poll_by_queue"
83+
t.string "queue_name", null: false
84+
t.index ["job_id"], name: "index_solid_queue_ready_executions_on_job_id", unique: true
85+
t.index ["priority", "job_id"], name: "index_solid_queue_poll_all"
86+
t.index ["queue_name", "priority", "job_id"], name: "index_solid_queue_poll_by_queue"
7587
end
7688

7789
create_table "solid_queue_recurring_executions", force: :cascade do |t|
90+
t.datetime "created_at", null: false
7891
t.bigint "job_id", null: false
79-
t.string "task_key", null: false
8092
t.datetime "run_at", null: false
81-
t.datetime "created_at", null: false
82-
t.index [ "job_id" ], name: "index_solid_queue_recurring_executions_on_job_id", unique: true
83-
t.index [ "task_key", "run_at" ], name: "index_solid_queue_recurring_executions_on_task_key_and_run_at", unique: true
93+
t.string "task_key", null: false
94+
t.index ["job_id"], name: "index_solid_queue_recurring_executions_on_job_id", unique: true
95+
t.index ["task_key", "run_at"], name: "index_solid_queue_recurring_executions_on_task_key_and_run_at", unique: true
8496
end
8597

8698
create_table "solid_queue_recurring_tasks", force: :cascade do |t|
87-
t.string "key", null: false
88-
t.string "schedule", null: false
89-
t.string "command", limit: 2048
90-
t.string "class_name"
9199
t.text "arguments"
92-
t.string "queue_name"
100+
t.string "class_name"
101+
t.string "command", limit: 2048
102+
t.datetime "created_at", null: false
103+
t.text "description"
104+
t.string "key", null: false
93105
t.integer "priority", default: 0
106+
t.string "queue_name"
107+
t.string "schedule", null: false
94108
t.boolean "static", default: true, null: false
95-
t.text "description"
96-
t.datetime "created_at", null: false
97109
t.datetime "updated_at", null: false
98-
t.index [ "key" ], name: "index_solid_queue_recurring_tasks_on_key", unique: true
99-
t.index [ "static" ], name: "index_solid_queue_recurring_tasks_on_static"
110+
t.index ["key"], name: "index_solid_queue_recurring_tasks_on_key", unique: true
111+
t.index ["static"], name: "index_solid_queue_recurring_tasks_on_static"
100112
end
101113

102114
create_table "solid_queue_scheduled_executions", force: :cascade do |t|
115+
t.datetime "created_at", null: false
103116
t.bigint "job_id", null: false
104-
t.string "queue_name", null: false
105117
t.integer "priority", default: 0, null: false
118+
t.string "queue_name", null: false
106119
t.datetime "scheduled_at", null: false
107-
t.datetime "created_at", null: false
108-
t.index [ "job_id" ], name: "index_solid_queue_scheduled_executions_on_job_id", unique: true
109-
t.index [ "scheduled_at", "priority", "job_id" ], name: "index_solid_queue_dispatch_all"
120+
t.index ["job_id"], name: "index_solid_queue_scheduled_executions_on_job_id", unique: true
121+
t.index ["scheduled_at", "priority", "job_id"], name: "index_solid_queue_dispatch_all"
110122
end
111123

112124
create_table "solid_queue_semaphores", force: :cascade do |t|
113-
t.string "key", null: false
114-
t.integer "value", default: 1, null: false
115-
t.datetime "expires_at", null: false
116125
t.datetime "created_at", null: false
126+
t.datetime "expires_at", null: false
127+
t.string "key", null: false
117128
t.datetime "updated_at", null: false
118-
t.index [ "expires_at" ], name: "index_solid_queue_semaphores_on_expires_at"
119-
t.index [ "key", "value" ], name: "index_solid_queue_semaphores_on_key_and_value"
120-
t.index [ "key" ], name: "index_solid_queue_semaphores_on_key", unique: true
129+
t.integer "value", default: 1, null: false
130+
t.index ["expires_at"], name: "index_solid_queue_semaphores_on_expires_at"
131+
t.index ["key", "value"], name: "index_solid_queue_semaphores_on_key_and_value"
132+
t.index ["key"], name: "index_solid_queue_semaphores_on_key", unique: true
121133
end
122134

123135
add_foreign_key "solid_queue_blocked_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade

0 commit comments

Comments
 (0)