#!/usr/bin/env ruby # Upload the contents in public/ to the S3 bucket from which we serve # gobyexample.com. We use this instead of `aws iam sync` because that command # doesn't correctly guess the text/html mime time of the extension-less files. # We didn't write this in Go because we had already written it in Ruby for # another website and didn't want to re-write it. require "aws-sdk" require "set" s3 = Aws::S3::Client.new( region: "us-east-1", credentials: Aws::Credentials.new(ENV["AWS_ACCESS_KEY_ID"], ENV["AWS_SECRET_ACCESS_KEY"]) ) # (Re-)upload each file to S3. We're not worried about what's currently there. Dir.glob("./public/**/**").each do |local_path| next if File.directory?(local_path) # Derive final path. s3_path = local_path.sub("./public/", "") # Infer content type, including for HTML files that need pretty URLs. content_type = case s3_path when /\.ico$/ then "image/x-icon" when /\.png$/ then "image/png" when /\.css$/ then "text/css" else "text/html" end puts("Uploading #{s3_path} (#{content_type})") File.open(local_path, "rb") do |local_file| s3.put_object( bucket: "gobyexample.com", key: s3_path, content_type: content_type, body: local_file) end end