From 7db40fe69f8052663424d1e843e525c8850a6343 Mon Sep 17 00:00:00 2001 From: evazion Date: Fri, 5 May 2017 21:51:05 -0500 Subject: [PATCH] backups: add amazon s3 backup service. --- app/logical/s3_backup_service.rb | 35 ++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 app/logical/s3_backup_service.rb diff --git a/app/logical/s3_backup_service.rb b/app/logical/s3_backup_service.rb new file mode 100644 index 000000000..2dfd1926c --- /dev/null +++ b/app/logical/s3_backup_service.rb @@ -0,0 +1,35 @@ +class S3BackupService < BackupService + attr_reader :client, :bucket + + def initialize(client: nil, bucket: Danbooru.config.aws_s3_bucket_name) + @credentials = Aws::Credentials.new(Danbooru.config.aws_access_key_id, Danbooru.config.aws_secret_access_key) + @client = client || Aws::S3::Client.new(credentials: @credentials, region: "us-east-1", logger: Logger.new(STDOUT)) + @bucket = bucket + end + + def backup(file_path, type: nil, **options) + key = s3_key(file_path, type) + upload_to_s3(key, file_path) + end + +protected + def s3_key(file_path, type) + case type + when :original + "#{File.basename(file_path)}" + when :preview + "preview/#{File.basename(file_path)}" + when :large + "large/#{File.basename(file_path)}" + else + raise ArgumentError.new("Unknown type: #{type}") + end + end + + def upload_to_s3(key, file_path) + File.open(file_path, "rb") do |body| + base64_md5 = Digest::MD5.base64digest(File.read(file_path)) + client.put_object(bucket: bucket, key: key, body: body, content_md5: base64_md5) + end + end +end