Skip to content

Instantly share code, notes, and snippets.

@neoneye
Created March 11, 2018 11:05
Show Gist options
  • Save neoneye/bfa9a883bd4b9fcb41ced0a25bfb1593 to your computer and use it in GitHub Desktop.
Save neoneye/bfa9a883bd4b9fcb41ced0a25bfb1593 to your computer and use it in GitHub Desktop.
Backup PostgreSQL Database to AWS S3 Storage
#!/usr/bin/env ruby
require 'fileutils'
PATH_PG_DUMP = "/usr/lib/postgresql/9.6/bin/pg_dump"
POSTGRES_HOST = "demoscene.t1qwy5zz3sn3.eu-southwest-3.rds.amazonaws.com"
POSTGRES_PORT = 1234
POSTGRES_USERNAME = "admin"
POSTGRES_PASSWORD = "doesnt look like anything to me"
POSTGRES_DBNAME = "main"
AWS_S3_BUCKET = "there.is.no.spoon"
def prepare_filename
timestamp = Time.now.strftime '%Y%m%d_%H%M%S'
filename = "demoscene_database_#{timestamp}.sql.gz"
return filename
end
def create_backup_file(filename)
puts "will create backup file: '#{filename}'"
# Invoke `pg_dump` followed by `gzip`
parts = [
PATH_PG_DUMP,
"-Fp",
"--host \"#{POSTGRES_HOST}\"",
"--port #{POSTGRES_PORT}",
"--username #{POSTGRES_USERNAME}",
"--dbname #{POSTGRES_DBNAME}",
"| gzip > #{filename}"
]
cmd = parts.join(" ")
ENV["PGPASSWORD"] = POSTGRES_PASSWORD
system(cmd)
bytes = File.size(filename)
puts "did create backup file: '#{filename}' bytes: #{bytes}"
end
def upload_to_s3(filename)
puts "will upload '#{filename}' to S3"
if File.zero?(filename)
raise "Expected backup file to be non-empty, but got a 0 byte file!"
end
cmd = "aws s3 cp #{filename} s3://#{AWS_S3_BUCKET}"
system(cmd)
puts "did upload '#{filename}' to S3"
end
Dir.chdir('/tmp') do
filename = prepare_filename
create_backup_file(filename)
upload_to_s3(filename)
FileUtils.rm filename, :force => true # never raises exception
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment