Created
March 11, 2018 11:05
-
-
Save neoneye/bfa9a883bd4b9fcb41ced0a25bfb1593 to your computer and use it in GitHub Desktop.
Backup PostgreSQL Database to AWS S3 Storage
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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