Mencadangkan SQLite ke S3 dengan ActiveStorage dan solid_queue (~ 30 baris)
Persyaratan
Artikel ini membutuhkan aplikasi Rails yang sudah terintegrasi dengan ActiveStorage
, s3
, dan solid_queue
. Integrasi setiap library tersebut cukup mudah, namun itu di luar cakupan artikel ini.
rails
denganactivestorage
(7.1)aws-sdk-s3
(1.164.0)solid_queue
(0.8.2)
Manajemen cadangan dengan ActiveRecord
Dengan adanya ActiveStorage
dengan aws-sdk-s3
di aplikasi Rails, kita bisa membuat lampiran berkas (file attachment) ke dalam model ActiveRecord
. Dengan melampirkan berkas ke dalam model, maka berkas ini akan diunggah ke AWS S3 secara otomatis. Demikian pula jika berkas ini dihapus dari model, maka berkas yang telah diunggah di S3 akan dihapus secara otomatis.
Berikut modelnya:
class DatabaseBackup < ApplicationRecord
has_one_attached :database_file, service: :amazon
end
Tugas latar belakang (background job) untuk mencadangkan basis data
solid_queue
adalah sebuah library baru dari Rails untuk memanajemen tugas latar belakang dengan sangat mudah. Ketika saya menuliskan artikel ini, solid_queue
baru saja mengimplementasikan tugas berkala (scheduled jobs).
Berikut ini adalah tugas latar belakangnya:
class DatabaseBackupJob < ApplicationJob
queue_as :default
def perform
create_new_backup
end
private
def create_new_backup
backup = DatabaseBackup.create!
backup.database_file.attach(
io: database_file.open,
filename: database_file.basename.to_s,
content_type: "application/x-sqlite3"
)
end
# We assumed multiple database setup
# to separate database for background jobs.
# returns <Pathname:~/primary_development.sqlite3>
def database_file
Rails.root.join(database_file_for(:primary))
end
def database_file_for(database_name)
Rails.application.config_for(:database).dig(database_name, :database)
end
end
Tugas latar belakang ini akan mencari berkas basis data SQLite
untuk diunggah ke S3
. Kita asumsikan aplikasi Rails
ini merupakan aplikasi multi-database untuk memisahkan antara database utama dengan database untuk latar belakang solid_queue
. Tujuannya adalah untuk menghindari database utama terkunci ketika tugas latar belakang sedang berjalan.
Dan ini adalah konfigurasi tugas berkala dalam solid_queue.yml
:
dispatchers:
- polling_interval: 1
batch_size: 500
recurring_tasks:
database_backup_job:
class: DatabaseBackupJob
schedule: "every day"
Anda bisa mencobanya melalui rails console
dengan menjalankan DatabaseBackupJob.perform_now
untuk mengetahui apakah berkas berhasil diunggah dan data terekam ke dalam model DatabaseBackup
. Berikut ini adalah contoh catatan yang akan Anda temui di console
:
>> DatabaseBackupJob.perform_now
Performing DatabaseBackupJob (Job ID: ***) from SolidQueue(default)
...
DatabaseBackup Create (0.4ms)...
...
ActiveStorage::Blob Create (0.1ms)...
...
S3 Storage (809.8ms) Uploaded file to key: *** (checksum: ***)
...
Performed DatabaseBackupJob (Job ID: ***) from SolidQueue(default) in 1503.07ms
Selamat mencoba!