backup_nexus 0.1.0

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.
Files changed (39) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +7 -0
  3. data/MIT-LICENSE +20 -0
  4. data/README.md +82 -0
  5. data/Rakefile +10 -0
  6. data/app/controllers/backup_nexus/application_controller.rb +31 -0
  7. data/app/controllers/backup_nexus/backup_controller.rb +119 -0
  8. data/app/helpers/backup_nexus/application_helper.rb +51 -0
  9. data/app/jobs/backup_nexus/backup_job.rb +18 -0
  10. data/app/models/backup_nexus/backup.rb +107 -0
  11. data/app/models/backup_nexus/backup_config.rb +189 -0
  12. data/app/services/backup_nexus/backup_runner.rb +62 -0
  13. data/app/services/backup_nexus/backup_service.rb +817 -0
  14. data/app/views/backup_nexus/backup/_form.html.erb +334 -0
  15. data/app/views/backup_nexus/backup/config_history.html.erb +67 -0
  16. data/app/views/backup_nexus/backup/edit.html.erb +15 -0
  17. data/app/views/backup_nexus/backup/history.html.erb +75 -0
  18. data/app/views/backup_nexus/backup/index.html.erb +112 -0
  19. data/app/views/backup_nexus/backup/new.html.erb +15 -0
  20. data/backup_nexus.gemspec +30 -0
  21. data/config/routes.rb +15 -0
  22. data/db/seeds/backup_configs_safe.rb +61 -0
  23. data/lib/backup_nexus/base_record.rb +7 -0
  24. data/lib/backup_nexus/configuration.rb +19 -0
  25. data/lib/backup_nexus/engine.rb +51 -0
  26. data/lib/backup_nexus/version.rb +3 -0
  27. data/lib/backup_nexus.rb +26 -0
  28. data/lib/generators/backup_nexus/backup_generator.rb +70 -0
  29. data/lib/generators/backup_nexus/install_generator.rb +27 -0
  30. data/lib/generators/backup_nexus/templates/backup/backup/backup_helper.sh +152 -0
  31. data/lib/generators/backup_nexus/templates/backup/backup/config.rb +27 -0
  32. data/lib/generators/backup_nexus/templates/backup/backup/models/daily_backup.rb +24 -0
  33. data/lib/generators/backup_nexus/templates/backup/backup/models/full_backup.rb +35 -0
  34. data/lib/generators/backup_nexus/templates/backup/backup/models/sync_backup.rb +43 -0
  35. data/lib/generators/backup_nexus/templates/backup/backup/mysql-config/db_config.cnf +15 -0
  36. data/lib/generators/backup_nexus/templates/backup/backup/schedule.rb +28 -0
  37. data/lib/generators/backup_nexus/templates/migration.rb +105 -0
  38. data/lib/tasks/backup_nexus.rake +81 -0
  39. metadata +138 -0
@@ -0,0 +1,105 @@
1
+ # frozen_string_literal: true
2
+
3
+ class CreateBackupNexusTables < ActiveRecord::Migration[8.0]
4
+ def up
5
+ rename_legacy_table(:rails_nexus_backups, :backup_nexus_backups)
6
+ rename_legacy_table(:rails_nexus_backup_configs, :backup_nexus_backup_configs)
7
+ create_backups unless table_exists?(:backup_nexus_backups)
8
+ create_backup_configs unless table_exists?(:backup_nexus_backup_configs)
9
+ end
10
+
11
+ def down
12
+ if table_exists?(:backup_nexus_backups) && !table_exists?(:rails_nexus_backups)
13
+ rename_table :backup_nexus_backups, :rails_nexus_backups
14
+ elsif table_exists?(:backup_nexus_backups)
15
+ drop_table :backup_nexus_backups
16
+ end
17
+
18
+ if table_exists?(:backup_nexus_backup_configs) && !table_exists?(:rails_nexus_backup_configs)
19
+ rename_table :backup_nexus_backup_configs, :rails_nexus_backup_configs
20
+ elsif table_exists?(:backup_nexus_backup_configs)
21
+ drop_table :backup_nexus_backup_configs
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ def rename_legacy_table(legacy_name, new_name)
28
+ return unless table_exists?(legacy_name)
29
+ return if table_exists?(new_name)
30
+
31
+ rename_table legacy_name, new_name
32
+ end
33
+
34
+ def create_backups
35
+ create_table :backup_nexus_backups do |t|
36
+ t.string :config_name, null: false
37
+ t.string :status, null: false
38
+ t.text :file_path
39
+ t.bigint :file_size
40
+ t.float :duration
41
+ t.text :error_message
42
+ t.string :triggered_by
43
+ t.datetime :started_at, null: false
44
+ t.datetime :completed_at
45
+ end
46
+
47
+ add_index :backup_nexus_backups, %i[config_name started_at]
48
+ add_index :backup_nexus_backups, :status
49
+ add_index :backup_nexus_backups, :started_at
50
+ end
51
+
52
+ def create_backup_configs
53
+ create_table :backup_nexus_backup_configs do |t|
54
+ t.string :name, null: false
55
+ t.string :description
56
+ t.string :database_name, null: false
57
+ t.string :adapter, null: false, default: "mysql"
58
+ t.string :host, default: "localhost"
59
+ t.integer :port
60
+ t.string :username
61
+ t.string :password
62
+ t.string :skip_tables
63
+ t.string :storage_path, null: false
64
+ t.integer :keep_count, default: 30
65
+ t.boolean :compress, default: true
66
+ t.boolean :bzip2_compress, default: false
67
+ t.boolean :encrypted, default: false
68
+ t.string :encryption_password
69
+ t.boolean :encrypt_base64, default: false
70
+ t.boolean :gpg_enabled, default: false
71
+ t.string :gpg_password
72
+ t.boolean :rsync_enabled, default: false
73
+ t.string :rsync_host
74
+ t.integer :rsync_port, default: 22
75
+ t.string :rsync_user
76
+ t.string :rsync_path
77
+ t.boolean :rsync_mirror, default: false
78
+ t.boolean :rsync_archive, default: true
79
+ t.string :rsync_directories
80
+ t.string :rsync_excludes
81
+ t.string :mysql_additional_options
82
+ t.boolean :s3_enabled, default: false
83
+ t.string :s3_access_key
84
+ t.string :s3_secret_key
85
+ t.string :s3_bucket
86
+ t.string :s3_region, default: "us-east-1"
87
+ t.string :s3_prefix
88
+ t.boolean :archive_enabled, default: false
89
+ t.string :archive_paths
90
+ t.string :archive_excludes
91
+ t.boolean :split_chunks, default: false
92
+ t.string :notify_command
93
+ t.boolean :notify_on_success, default: true
94
+ t.boolean :notify_on_failure, default: true
95
+ t.boolean :email_notify, default: false
96
+ t.string :email_to
97
+ t.string :schedule_cron
98
+ t.boolean :enabled, default: true
99
+ t.timestamps
100
+ end
101
+
102
+ add_index :backup_nexus_backup_configs, :name, unique: true
103
+ add_index :backup_nexus_backup_configs, :enabled
104
+ end
105
+ end
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ namespace :backup_nexus do
4
+ desc "Run a specific backup by name: backup_nexus:backup[daily_backup]"
5
+ task :backup, [:name] => :environment do |_task, args|
6
+ name = args[:name]
7
+ if name.blank?
8
+ puts "Usage: rake backup_nexus:backup[config_name]"
9
+ puts "Available configs:"
10
+ BackupNexus::BackupConfig.enabled.pluck(:name).each { |config_name| puts " - #{config_name}" }
11
+ next
12
+ end
13
+
14
+ result = BackupNexus::BackupRunner.run(name)
15
+ if result[:success]
16
+ puts "✓ Backup \"#{name}\" completed successfully (#{result[:record].duration_human})"
17
+ else
18
+ puts "✗ Backup \"#{name}\" failed: #{result[:error]}"
19
+ exit 1
20
+ end
21
+ end
22
+
23
+ desc "Run all enabled backup configs"
24
+ task backup_all: :environment do
25
+ BackupNexus::BackupRunner.run_all.each do |result|
26
+ if result[:success]
27
+ puts "✓ #{result[:record].config_name} completed"
28
+ else
29
+ puts "✗ #{result[:record]&.config_name || '?'} failed: #{result[:error]}"
30
+ end
31
+ end
32
+ end
33
+
34
+ desc "Run backups matching the current cron schedule"
35
+ task backup_scheduled: :environment do
36
+ results = BackupNexus::BackupRunner.run_scheduled
37
+ if results.empty?
38
+ puts "No backups scheduled for this time"
39
+ else
40
+ results.each do |result|
41
+ if result[:success]
42
+ puts "✓ #{result[:record].config_name} completed"
43
+ else
44
+ puts "✗ #{result[:record]&.config_name || '?'} failed: #{result[:error]}"
45
+ end
46
+ end
47
+ end
48
+ end
49
+
50
+ desc "Clean up old backup records (default: 30 days)"
51
+ task :backup_cleanup, [:days] => :environment do |_task, args|
52
+ days = (args[:days] || 30).to_i
53
+ count = BackupNexus::Backup.where("started_at < ?", days.days.ago).delete_all
54
+ puts "✓ Deleted #{count} backup records older than #{days} days"
55
+ end
56
+
57
+ desc "List all backup configs and their status"
58
+ task backup_list: :environment do
59
+ configs = BackupNexus::BackupConfig.order(:name)
60
+ if configs.empty?
61
+ puts "No backup configs found"
62
+ else
63
+ configs.each do |config|
64
+ status = config.enabled? ? "✓" : "✗"
65
+ last = config.recent_backups(limit: 1).first
66
+ last_str = last ? "#{last.status} #{last.started_at&.strftime('%b %d %H:%M')}" : "never"
67
+ puts "#{status} #{config.name.ljust(20)} #{config.adapter.ljust(12)} #{config.database_name.ljust(20)} last: #{last_str}"
68
+ end
69
+ end
70
+ end
71
+
72
+ desc "Seed the safe example backup config"
73
+ task seed_backups: :environment do
74
+ seed_file = File.join(BackupNexus::Engine.root, "db", "seeds", "backup_configs_safe.rb")
75
+ if File.exist?(seed_file)
76
+ load seed_file
77
+ else
78
+ puts "Seed file not found: #{seed_file}"
79
+ end
80
+ end
81
+ end
metadata ADDED
@@ -0,0 +1,138 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: backup_nexus
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Tamiru Hailu
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: rails
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '8.0'
19
+ - - ">="
20
+ - !ruby/object:Gem::Version
21
+ version: 8.0.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - "~>"
27
+ - !ruby/object:Gem::Version
28
+ version: '8.0'
29
+ - - ">="
30
+ - !ruby/object:Gem::Version
31
+ version: 8.0.0
32
+ - !ruby/object:Gem::Dependency
33
+ name: rails_nexus
34
+ requirement: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: 2.1.3
39
+ - - "<"
40
+ - !ruby/object:Gem::Version
41
+ version: '3.0'
42
+ type: :runtime
43
+ prerelease: false
44
+ version_requirements: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: 2.1.3
49
+ - - "<"
50
+ - !ruby/object:Gem::Version
51
+ version: '3.0'
52
+ - !ruby/object:Gem::Dependency
53
+ name: pagy
54
+ requirement: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - "~>"
57
+ - !ruby/object:Gem::Version
58
+ version: '6.5'
59
+ type: :runtime
60
+ prerelease: false
61
+ version_requirements: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - "~>"
64
+ - !ruby/object:Gem::Version
65
+ version: '6.5'
66
+ description: A Rails engine for configuring, running, tracking, and retaining database
67
+ and file backups.
68
+ email:
69
+ - tamiruhailu@gmail.com
70
+ executables: []
71
+ extensions: []
72
+ extra_rdoc_files: []
73
+ files:
74
+ - CHANGELOG.md
75
+ - MIT-LICENSE
76
+ - README.md
77
+ - Rakefile
78
+ - app/controllers/backup_nexus/application_controller.rb
79
+ - app/controllers/backup_nexus/backup_controller.rb
80
+ - app/helpers/backup_nexus/application_helper.rb
81
+ - app/jobs/backup_nexus/backup_job.rb
82
+ - app/models/backup_nexus/backup.rb
83
+ - app/models/backup_nexus/backup_config.rb
84
+ - app/services/backup_nexus/backup_runner.rb
85
+ - app/services/backup_nexus/backup_service.rb
86
+ - app/views/backup_nexus/backup/_form.html.erb
87
+ - app/views/backup_nexus/backup/config_history.html.erb
88
+ - app/views/backup_nexus/backup/edit.html.erb
89
+ - app/views/backup_nexus/backup/history.html.erb
90
+ - app/views/backup_nexus/backup/index.html.erb
91
+ - app/views/backup_nexus/backup/new.html.erb
92
+ - backup_nexus.gemspec
93
+ - config/routes.rb
94
+ - db/seeds/backup_configs_safe.rb
95
+ - lib/backup_nexus.rb
96
+ - lib/backup_nexus/base_record.rb
97
+ - lib/backup_nexus/configuration.rb
98
+ - lib/backup_nexus/engine.rb
99
+ - lib/backup_nexus/version.rb
100
+ - lib/generators/backup_nexus/backup_generator.rb
101
+ - lib/generators/backup_nexus/install_generator.rb
102
+ - lib/generators/backup_nexus/templates/backup/backup/backup_helper.sh
103
+ - lib/generators/backup_nexus/templates/backup/backup/config.rb
104
+ - lib/generators/backup_nexus/templates/backup/backup/models/daily_backup.rb
105
+ - lib/generators/backup_nexus/templates/backup/backup/models/full_backup.rb
106
+ - lib/generators/backup_nexus/templates/backup/backup/models/sync_backup.rb
107
+ - lib/generators/backup_nexus/templates/backup/backup/mysql-config/db_config.cnf
108
+ - lib/generators/backup_nexus/templates/backup/backup/schedule.rb
109
+ - lib/generators/backup_nexus/templates/migration.rb
110
+ - lib/tasks/backup_nexus.rake
111
+ homepage: https://github.com/tamiru/backup_nexus
112
+ licenses:
113
+ - MIT
114
+ metadata:
115
+ rubygems_mfa_required: 'true'
116
+ allowed_push_host: https://rubygems.org
117
+ homepage_uri: https://github.com/tamiru/backup_nexus
118
+ source_code_uri: https://github.com/tamiru/backup_nexus/tree/main
119
+ changelog_uri: https://github.com/tamiru/backup_nexus/blob/main/CHANGELOG.md
120
+ bug_tracker_uri: https://github.com/tamiru/backup_nexus/issues
121
+ rdoc_options: []
122
+ require_paths:
123
+ - lib
124
+ required_ruby_version: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ version: 3.2.0
129
+ required_rubygems_version: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - ">="
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ requirements: []
135
+ rubygems_version: 4.0.10
136
+ specification_version: 4
137
+ summary: Backup management for Rails applications
138
+ test_files: []