ops_backups 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e6f1ef117c4c1f91b7ca59eba0f0a27d2387b2f69c7d9f5022d1306c145d19eb
4
- data.tar.gz: 1c479131ca94764b617a99cb8ea9896596ceda64aadc7a3281acbbca86286471
3
+ metadata.gz: 5998e71c3bda4e80392ef2d50e3be95280b5927bb961ab8e3a1d9a614b7788f7
4
+ data.tar.gz: 8d066ea20d375d5da4156c3f7f1211c67ad6e08604a6e9c5ea1b72c028e3abfc
5
5
  SHA512:
6
- metadata.gz: e8da64fbec202205ff7771d222b26b4c1513467e2001f4d4997bc7f7f18e66390743ade3a68b253e684a67fcb58233d3c58c34e824e1ab528ade2260a0b9c252
7
- data.tar.gz: 5246ea35123d5b4aa7748362b1ee89915450d56a433cfa1f62df9089081c62d63a8551ce6361d103d761096eb5564eb053ed8fcb15d9b96a7aa45b283e816fca
6
+ metadata.gz: 9b586429bfbba9fbdb3c354743ffb51c2b197afa9ab61367c90cb1d67959bc928ef8b969e8846a43becf58e488e4e999e55dc75fef8a9607e7892ef5b7dd1324
7
+ data.tar.gz: 20a218a19b9be0a87bdbf5c688c914e1a3083a6e64ec8e94438abe7f174012e15913d23764f3f041d42e0e9bf9c11772d23ed5cacd3157453ecee9cd7ec76ee4
data/README.md CHANGED
@@ -1,28 +1,35 @@
1
1
  # OpsBackups
2
- Short description and motivation.
2
+
3
+ A Ruby gem that provides a simple way to backup (self)-hosted postgres databases to
4
+ ActiveStorage services like S3, Google Cloud Storage, etc.
3
5
 
4
6
  ## Usage
5
- How to use my plugin.
6
7
 
7
8
  ## Installation
8
- Add this line to your application's Gemfile:
9
-
10
- ```ruby
11
- gem "ops_backups"
12
- ```
13
9
 
14
- And then execute:
15
10
  ```bash
16
- $ bundle
11
+ bundle add ops_backups
12
+ # install migrations
13
+ # configure solid queu recurring job for a basic backup
14
+ rails generate ops_backups:install
17
15
  ```
18
16
 
19
- Or install it yourself as:
17
+ # ActiveAdmin Integration
18
+
19
+ If you are using ActiveAdmin, you can manage your backups through the admin interface. The generator rails generate ops_backups:activeadmin will create the necessary example configuration.
20
+
20
21
  ```bash
21
- $ gem install ops_backups
22
+ # add an active admin resource
23
+ rails generate ops_backups:activeadmin
22
24
  ```
23
25
 
24
- ## Contributing
25
- Contribution directions go here.
26
+ ## Available Actions
27
+
28
+ - Download Backup: Download the backup file.
29
+ - Create Versioned Backup: Create a new versioned backup.
30
+ - Create Unversioned Backup: Create a new unversioned backup, excluding specific tables.
31
+
32
+
26
33
 
27
34
  ## License
28
35
  The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
@@ -8,8 +8,11 @@ class OpsBackups::BackupDbJob < ApplicationJob
8
8
  # @param tag [String] the tag to assign to the backup
9
9
  # @param exclude_tables [Array<String>] the list of tables to exclude from the backup
10
10
  # @param cleanup_policy [String] the cleanup policy to apply to the backup, one of "retain_tiered_cleanup_policy" or "retain_last_limit_cleanup_policy"
11
- def perform(tag: "db_pg_full", exclude_tables: [], cleanup: nil)
12
- Ops::Backup.new.db_pg_backup(tag:, exclude_tables:)
13
- Ops::Backup.send("#{cleanup}_cleanup_policy", tag: tag) if cleanup.present?
11
+ def perform(options = {})
12
+ exclude_tables = options[:exclude_tables] || []
13
+ tag = options[:tag] || (exclude_tables.empty? ? "db_pg_full" : "db_pg_partial")
14
+ cleanup = options[:cleanup]
15
+ OpsBackups::Backup.new.db_pg_backup(exclude_tables:, tag:)
16
+ OpsBackups::Backup.send("#{cleanup}_cleanup_policy", tag: tag) if cleanup.present?
14
17
  end
15
18
  end
@@ -10,6 +10,6 @@ class OpsBackups::CleanupLimitJob < ApplicationJob
10
10
  #
11
11
  # @example Tasks::CleanupLimit.perform_now(tag: "db_pg_full", limit: 14)
12
12
  def perform(tag: "db_pg_full", limit: 14)
13
- Ops::Backup.retain_last_limit_cleanup_policy(tag: tag, limit: limit)
13
+ OpsBackups::Backup.retain_last_limit_cleanup_policy(tag: tag, limit: limit)
14
14
  end
15
15
  end
@@ -9,6 +9,6 @@ class OpsBackups::CleanupTieredJob < ApplicationJob
9
9
  #
10
10
  # @example Tasks::CleanupTiered.perform_now(tag: "db_pg_full")
11
11
  def perform(tag: "db_pg_full")
12
- Ops::Backup.retain_tiered_cleanup_policy(tag: tag)
12
+ OpsBackups::Backup.retain_tiered_cleanup_policy(tag: tag)
13
13
  end
14
14
  end
@@ -1,23 +1,36 @@
1
1
  module OpsBackups
2
- class Backup < ApplicationRecord
2
+ class Backup < ActiveRecord::Base
3
3
  # has_one_attached :backup_file, service: :backup_storage
4
4
  has_one_attached :backup_file, service: :backups
5
5
  self.table_name = "ops_backups"
6
6
 
7
7
  default_scope { order(updated_at: :desc) }
8
8
 
9
- def db_pg_backup(exclude_tables: [], tag: nil)
10
- tag ||= exclude_tables.empty? ? "db_pg_full" : "db_pg_partial"
11
- Rails.logger.info("Backing up database, skipping tables: \#{exclude_tables.join(", ")}")
9
+ def self.ransackable_attributes(auth_object = nil)
10
+ [ "created_at", "id", "name", "new_id", "tag", "updated_at" ]
11
+ end
12
+
13
+ def self.test
14
+ "self.test"
15
+ end
16
+
17
+ def hoho
18
+ "hihi"
19
+ end
20
+
21
+ def db_pg_backup(tag: nil, exclude_tables: [])
12
22
  db_url = ENV["DATABASE_URL"]
23
+ tag ||= exclude_tables.empty? ? "db_pg_full" : "db_pg_partial" # if tag.empty?
13
24
  self.tag = tag
14
- self.name = filename = "pg_\#{db_url.split('/').last}_backup_\#{Time.now.to_i}.dump"
25
+ self.name = "pg_#{db_url.split('/').last}_backup_#{Time.now.to_i}.dump"
15
26
  save!
16
-
17
- Tempfile.new("pgbackup") do |tempfile|
27
+ Rails.logger.info("Backing up database")
28
+ # exclude_tables = []
29
+ filename = self.name
30
+ Tempfile.open("pgbackup") do |tempfile|
18
31
  begin
19
32
  excluded_tables_param = exclude_tables.map { |table| "--exclude-table-data=\#{table}" }.join(" ")
20
- command = ["pg_dump", "--no-owner", excluded_tables_param, "-v", "-Fc", "-f", tempfile.path, db_url]
33
+ command = [ "pg_dump", "--no-owner", excluded_tables_param, "-v", "-Fc", "-f", tempfile.path, db_url ].reject(&:empty?)
21
34
 
22
35
  stdout, stderr, status = Open3.capture3(*command)
23
36
 
@@ -0,0 +1,7 @@
1
+ ---
2
+ en:
3
+ admin:
4
+ ops:
5
+ backup: "Backup"
6
+ backup_scheduled: "Backup scheduled"
7
+ backup_db: "Backup database"
@@ -0,0 +1,10 @@
1
+ class OpsBackups::ActiveadminGenerator < Rails::Generators::Base
2
+ source_root File.expand_path("templates", __dir__)
3
+
4
+ desc "Copies the ActiveAdmin backup configuration to your application."
5
+
6
+ def copy_admin_backup
7
+ copy_file "backup.rb", Rails.root.join("app", "admin", "ops_backups", "backup.rb")
8
+ say "Copied admin/backup.rb to app/admin/ops_backups/backup.rb.", :green
9
+ end
10
+ end
@@ -0,0 +1,42 @@
1
+ ActiveAdmin.register OpsBackups::Backup do
2
+ menu parent: "Ops", label: I18n.t("admin.ops.backup")
3
+
4
+ # Set the default sort order
5
+ config.sort_order = "updated_at DESC"
6
+
7
+ actions :index, :destroy
8
+
9
+ filter :name
10
+ filter :tag
11
+
12
+ index title: I18n.t("admin.ops.backup") do
13
+ selectable_column
14
+ column :name do |backup|
15
+ link_to(backup.name, download_backup_admin_ops_backups_backup_path(backup), class: "member_link")
16
+ end
17
+ column :tag
18
+ column :size do |backup|
19
+ backup.backup_file.attached? ? number_to_human_size(backup.backup_file.byte_size) : "N/A"
20
+ end
21
+ column :updated_at
22
+ column :duration do |backup|
23
+ Time.at((backup.updated_at - backup.created_at)).utc.strftime("%H:%M:%S")
24
+ end
25
+ actions
26
+ end
27
+
28
+ member_action :download_backup, method: :get do
29
+ redirect_to resource.backup_file.url(disposition: :attachment), allow_other_host: true
30
+ end
31
+
32
+ # an action that creates a new backup
33
+ collection_action :backup_db, method: :post do
34
+ OpsBackups::BackupDbJob.perform_later(tag: "db_pg_full")
35
+ redirect_to admin_ops_backups_backups_path, notice: I18n.t("admin.ops.backup_scheduled")
36
+ end
37
+
38
+ # add a button to the top of the index page
39
+ action_item :backup_db, only: :index do
40
+ link_to(I18n.t("admin.ops.backup_db"), backup_db_admin_ops_backups_backups_path, method: :post, class: "action-item-button")
41
+ end
42
+ end
@@ -35,7 +35,7 @@ class OpsBackups::InstallGenerator < Rails::Generators::Base
35
35
  recurring_file = Rails.root.join("config", "recurring.yml")
36
36
 
37
37
  if File.exist?(recurring_file)
38
- recurring_config = <<~YAML.lines.map { |line| "\t#{line}" }.join
38
+ recurring_config = <<~YAML.lines.map { |line| " #{line}" }.join
39
39
  backup_db:
40
40
  class: OpsBackups::BackupDbJob
41
41
  args: [tag: "db_pg_backup", cleanup: "retain_tiered_cleanup_policy"]
@@ -47,5 +47,11 @@ class OpsBackups::InstallGenerator < Rails::Generators::Base
47
47
  else
48
48
  say "config/recurring.yml not found. Please create it and re-run this generator.", :red
49
49
  end
50
+
51
+ # # copy the admin/backup.rb file to app/admin/ops_backups/backup.rb
52
+ # def copy_admin_backup
53
+ # copy_file "admin/backup.rb", Rails.root.join("app", "admin", "ops_backups", "backup.rb")
54
+ # say "Copied admin/backup.rb to app/admin/ops_backups/backup.rb.", :green
55
+ # end
50
56
  end
51
57
  end
@@ -7,5 +7,9 @@ module OpsBackups
7
7
  app.config.paths["db/migrate"].concat(config.paths["db/migrate"].expanded)
8
8
  end
9
9
  end
10
+
11
+ initializer :i18n do |app|
12
+ app.config.i18n.load_path += Dir[root.join("config", "locales", "**", "*.{rb,yml}")]
13
+ end
10
14
  end
11
15
  end
@@ -1,3 +1,3 @@
1
1
  module OpsBackups
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.3"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ops_backups
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Koen Handekyn
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-11-17 00:00:00.000000000 Z
11
+ date: 2024-11-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -46,8 +46,11 @@ files:
46
46
  - app/models/ops_backups/application_record.rb
47
47
  - app/models/ops_backups/backup.rb
48
48
  - app/views/layouts/ops_backups/application.html.erb
49
+ - config/locales/en.yml
49
50
  - config/routes.rb
50
51
  - db/migrate/20241114173612_create_ops_backups.rb
52
+ - lib/generators/ops_backups/activeadmin/activeadmin_generator.rb
53
+ - lib/generators/ops_backups/activeadmin/templates/backup.rb
51
54
  - lib/generators/ops_backups/install/USAGE
52
55
  - lib/generators/ops_backups/install/install_generator.rb
53
56
  - lib/ops_backups.rb