Mencadangkan SQLite ke S3 dengan ActiveStorage dan solid_queue (~ 30 baris)

Mencadangkan SQLite ke S3 dengan ActiveStorage dan solid_queue (~ 30 baris)
Photo by Aron Visuals on Unsplash

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.

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!

Mastodon