Skip to content

Commit

Permalink
Use rubyzip for backups
Browse files Browse the repository at this point in the history
  • Loading branch information
andersonkrs committed May 19, 2024
1 parent 014277d commit a5f996b
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 55 deletions.
3 changes: 2 additions & 1 deletion Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,9 @@ gem "mechanize"
# BI
gem "blazer"

# Storage
# Backups
gem "aws-sdk-s3", require: false
gem "rubyzip"

# Misc
gem "geocoder"
Expand Down
2 changes: 2 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -395,6 +395,7 @@ GEM
ffi (~> 1.12)
ruby2_keywords (0.0.5)
rubyntlm (0.6.3)
rubyzip (2.3.2)
safely_block (0.4.0)
sass-embedded (1.69.7)
google-protobuf (~> 3.25)
Expand Down Expand Up @@ -489,6 +490,7 @@ DEPENDENCIES
redis
requestjs-rails
rubocop-rails-omakase
rubyzip
simplecov (~> 0.17.1)
solid_cache
solid_errors
Expand Down
87 changes: 34 additions & 53 deletions app/models/backup/executable.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
require "zip"

class Backup
module Executable
Expand All @@ -14,77 +15,57 @@ def execute!
ensure
backup.finished_at = Time.current
backup.save!
backup.cleanup!
end
end
end

def execute!
Rails.logger.info "Creating Backup under: #{temp_zip_file}"
Rails.logger.info "Zipping databases ..."

["storage/malheatmap_primary_#{Rails.env}.sqlite3"].each do |database_file|
Tempfile.open([File.basename(database_file), ".sql"]) do |sql_file|
dump_database(database_file, sql_file)

Rails.logger.info "Zipping database #{sql_file.path}..."

zip_database_dump(sql_file)
Tempfile.open(["backup_#{Rails.env}_", ".zip"], binmode: true) do |tmp_zip|
self.key = File.basename(tmp_zip.path)

Rails.logger.info "Creating Backup under: #{tmp_zip.path}"

::Zip::File.open(tmp_zip.path, create: false) do |zip|
Tempfile.open(["primary_", "sqlite3.sql"]) do |sql_file|
dump_database("storage/malheatmap_primary_#{Rails.env}.sqlite3", sql_file)
Rails.logger.info "Zipping database #{sql_file.path}..."

zip.add(File.basename(sql_file), sql_file.path)
zip.commit
Rails.logger.info "Database zipped!"
end

Rails.logger.info "Zipping storage files ..."

directory = Rails.root.join("storage/#{Rails.env}")
Dir[File.join("storage/#{Rails.env}", "**", "**")].each do |file|
Rails.logger.info "Adding #{file} to zip..."
zip.add(file, file)
end
zip.commit
Rails.logger.info "Storage files zipped!"
end
end

Rails.logger.info "Zipping databases complete!"

zip_active_storage_files
attach(tmp_zip)

Rails.logger.info "Uploading zip file..."
upload!
Rails.logger.info "Backup complete!"
end

def cleanup!
FileUtils.rm_f(temp_zip_file)
Rails.logger.info "Backup complete!"
end
end

private

def temp_zip_file
@temp_zip_file ||= Rails.root.join("tmp", "#{key}.zip")
end

def dump_database(database_file, sql_file)
Rails.logger.info "Dumping database #{database_file} into #{sql_file.path}..."
stdout, status = Open3.capture2("sqlite3 #{database_file} .dump > #{sql_file.path}")

unless status.success?
Rails.logger.error(stdout)
raise "Failed to dump database #{database_file}!"
end
end

def zip_database_dump(sql_file)
stdout, status = Open3.capture2("zip -ur #{temp_zip_file} #{sql_file.path}")
unless status.success?
Rails.logger.error(stdout)
raise "Failed to zip database #{sql_file.path}!"
end
end

def zip_active_storage_files
Rails.logger.info "Zipping ActiveStorage files..."
stdout, status = Open3.capture2("zip -ur #{temp_zip_file} storage/#{Rails.env}")
unless status.success?
Rails.logger.error(stdout)
raise "Failed to zip ActiveStorage files!"
end
system("sqlite3 #{database_file} .dump > #{sql_file.path}") || raise("Failed to dump database")
end

def upload!
def attach(tmp_zip)
Rails.logger.info "Attaching zip file..."
file.attach(
io: File.open(temp_zip_file),
filename: File.basename(temp_zip_file),
io: File.open(tmp_zip.path),
filename: key,
content_type: "application/zip",
key: File.basename(temp_zip_file),
key: key,
)
end
end
Expand Down
2 changes: 1 addition & 1 deletion config/credentials/production.yml.enc
Original file line number Diff line number Diff line change
@@ -1 +1 @@
Te+Mzd5ATCdrTU2fMdRAJH3bLZY7hUc7qB89fElwWfkHv4dSwuii3kEYcMCIEJv44r/hd2JqRi6BAFs1V37RP8QdJS/hG8s0PDyRU48VrJRBJ56SE48K4HJ22RIEtIIu+0z6q0gLyz21On3m/9H0gIuLVRn5jJBF4CNu1eDgIqpcgeJ8OPLQHEgu4HExqWVuKxAfqYAmoexyzVVDjqrdW5ejuj1Z8w+3AjdIXr+5oFfDd2eWB5iyeyKRwmEeTkipNHNubHqkJJftChRqeZGlNli+TsawnMZWFvEhW/Isfbue/EU98oYg7wwDEQ5rTQtHtEH0Sy8lAy1P/azgELGZCAvbQ09/QJ0mIXKdssODDDrCo01xGFrCaY91TsMewT1vL7jT/7wT/TkAK6DIeog3dwX/vseeZPAijmnhTGMI9yzQDQbBHZGO2r4elx55sneVWmohMwXkQpoNMkhOO9GM9bU4OYaDDKBC0sBYGo8IpmSWCUHOUdvvFJ9S/ky434OF8AsJRugbAzhLIYzsP6L5axQKNLvGd7uTB7C1ctpNg79WzoZpZRIS1NBP9l7fo6qO5yIdcuBEWKrqCyi+0oOdPKQmurM2GwI7cnCpLkl5SCNuupn8AR3FK9KbhDQSBP/iL9+ooqDTCLcB8DYUcaM0omnJ4W36xhGkYOi0CHRQIBx7/Js/yQqbAeR0Y8j1tPbHGW/WVN1Bj5NvL36e1a+K/eIWU0Sw2m8cMz+Tf5tO2GiZhjovsLZJkxLWEirfwrhiTd9udeMbzIBdwNOAacAa3b4zvn7sACIAJQXi0d9aJ12lVoes59GlwLi1BwBPxhPQOj3t/ROYoFRnFNCZNOnM4F0edlxYK1nGKzBi3zvNGFvBUF6fGDmtK3gGtc9Nw9MtRG/YHpMfTmELB7GWC7Q9tN5uvRu8ISL0Oms/i8qKsbB4AG9L00gHEWGyPzdLODBbpmq5IjKRfW/TMTjY2EV8LyFG4fXCjJjjt7hdFb1a0lI7XO+0fgn/JO3rYTlqqKZGk6urleytxH6ATyglzpK0ezN3Xj2A3Nfex1OYArvSBJMrZda+p8zRAKOkZP+iy347OpR0hMbHfsq1xCnqs2jdfC4UTjCZCi7c72hC28L4XOXkUvgfqvLAgsa9muYDLRUVww1KdriSQwGTsWjUL/JCDl0zFEHBD2g2fgMPcqrqULwnp5bf9RckTTzehm7bNiQUo1geEGj4GrnRTCZ2l48J7C1r4FcTEvCISkN4T2QH/DRWsF1MBOYyIvfc+hts3ryJnk1QoYVzXEkkogwVfMmuEsmrl3EtxYXgChXDZsd76M84BYKZ4jLPlm+DqQjItUY9V1py1jp4--3drvCyupRhaqjpnO--jdJ3o3W4AxsoUorlkq49TQ==
4O6awpb++Orz0SwQOFy9Ea5ZZIjsVDvZikADdMMA8m4ZW5ScvPV8bmUE368mKeEc9mg6lwgjgXqhlB77KEgH1CCd9efiyaM99L8vHXMGThrJ2uidWtC9gv+yKP6YXImS/plCTHqOxxSnjhthat7Yv1oz3m2qNbPuSUaxtNSbCzWML5UTlNsX8x+7Du3z82K9HKhWPZ5rohAHNWYKATvH6v9tMLfti3JkKpW+Eaoj2OuH8RlXPkHZOf20+fHGlrXXMBjwb7bUT0AsYrnXjBTEaGRJ+DfNe+gtUhdq/yY/gde2bv88yTbx02sZJWLcWZVEqCeXExV1+CCZZjeOV2IiVUD9t7QRra2y8ekdnyCdFgYDq+uRyvkklf8Mc6SbokxCGWFQ2qX6cGjWU51dDYlUo0DIixOOGZWiuXcucB0+wGZMnRU06TxpbClJDUBk3azs+2gudrITaw9WN5ehPGyi7TIw3KlWn3jMZ+n0AmWGduq0SNCOzi8Hw9mz14w/9E+vbRh7cqIOSsWaparZ9dOPbftd20F9ivgqrOF/PmY5unxu5kHvSalmvO0AZllJtq9GD65PgQ1DpdpVyDLes2iNksh/zPwbKt46mEJvorK2YANy8kGje/qpF7WhIQzfHqjxA73lvL+hA4LKbtwLxnA9wrntLEWq4FAtPlsoxYwlnRm8YNdFoB/+zvqnJ+VFpJRwsAsK1XrdefG/zBWz790dycf0O393d3pfvrVyvuzFe2y27djCw8eEIZp6VkFzr1AfD/ITqz2yzHOV8q/W2AC8frmkOk8Y2WiNrEBsL7fGQhM/QkaRz5btx6oDEECtGB2vXfRYCuHFFTyN2CBUn1rhxoeO1Z+XgqCXQ5NvkGZ/EsS7vSjPnblS8O/pXdv2vTMUvkKajlKjk/oGG0kXTEmiY28eujxi+2YpkK2uEqhWVLAeWFRnYzO+DT+EIf5BbK48Qim3RzWphkzSEbGOWffP26hoJ4qrtj3hHB7zm0kBLQORFT7ioJE6gFzBOZIeXEzhOHtFTrIvuceUtHmMNp4gIXZe5oP/yA3ulw5HfIOuBXIErPEfRZrCtX/1dMFeikOYkdTze86jP/lfw56ot3vOuXrYzp9Qs76Na4x+9qlFOQuLrplRxXnWpxwEXmKF7og/nriCf1+jh5BCwd7R1Rmo0l/emh/YBoIDqD/HSQsqR66Jlw8mvGwRhCFiP2hCegUXSx0C2B96li/rgEeyEJWXZ1zk82EikWCz55emFizricUgAsKorq9h31Pf9ot2y+PVA5KYI9kiYHENroWA2amzjnlz8XI+K0IrjopJqCOzBeSRgoa/z/ONC38JinaS8O4tZcbSDxj9ztlhTWMSVXIVDZ8y/BMK+/7Piv3lvH0K0k7mO7yFv8ViPlN1YhIUFwd1nON/UJRoCZXLhOREZBjTv1XgeBS4LUmD/P/HcqRXiRQpkjsfQVTHLEyoeKqWruPNeCsnavKmQQZYBed13Xa4H1QnN+1rVqDpSZ8VP7arf1vAQJObpzOoib+Lk5ZKVfU9MTU=--aRIk7YXgdnKge/S9--ZinAS4DTFRbnRelAiUJ9KQ==

0 comments on commit a5f996b

Please sign in to comment.