Skip to content

Instantly share code, notes, and snippets.

@LeoMcA
Last active September 4, 2019 11:12
Show Gist options
  • Save LeoMcA/1b30a13d17191fbefc1275b7111a780b to your computer and use it in GitHub Desktop.
Save LeoMcA/1b30a13d17191fbefc1275b7111a780b to your computer and use it in GitHub Desktop.
Migrate references to one s3 bucket to another on Discourse
# frozen_string_literal: true
# paste this file into /var/www/discourse/lib/tasks/mozilla.rake
# then run it with: rake mozilla:rebake_posts_with_upload["example.s3.dualstack.us-west-2.amazonaws.com"]
require "db_helper"
require "file_store/s3_store"
task "mozilla:rebake_posts_with_upload", [:s3_host] => :environment do |t, args|
s3_host = args[:s3_host]
puts "Rewriting urls in Uploads"
Upload.where("url LIKE '//%'")
.update_all("url = REGEXP_REPLACE(url,'^\/\/[^\/]*amazonaws\.com\/','//#{s3_host}/')")
puts "Rewriting urls in OptimizedImages"
OptimizedImage.where("url LIKE '//%'")
.update_all("url = REGEXP_REPLACE(url,'^\/\/[^\/]*amazonaws\.com\/','//#{s3_host}/')")
Post
.where("user_id > 0")
.where("raw LIKE '%.s3%.amazonaws.com/%' OR raw LIKE '%(upload://%'")
.find_each do |post|
begin
updated = false
post.acting_user = Discourse.system_user
post.raw.gsub!(/(\/\/[\w.-]+amazonaws\.com\/(original|optimized)\/([a-z0-9]+\/)+\h{40}([\w.-]+)?)/i) do |url|
begin
new_url = url.gsub(/\/\/[^\/]*amazonaws\.com\//,"//#{s3_host}/")
if upload = Upload.find_by(url: new_url)
updated = true
url = new_url
end
url
rescue StandardError => e
puts ""
puts "XXXXXXXXXXXXXXXX ERROR XXXXXXXXXXXXXXXX"
puts "post id: #{post.id}"
puts e
url
end
end
post.raw.gsub(/(upload:\/\/[0-9a-zA-Z]+\.\w+)/) do |url|
begin
post.rebake!
putc "@"
url
rescue StandardError => e
puts ""
puts "XXXXXXXXXXXXXXXX ERROR XXXXXXXXXXXXXXXX"
puts "post id: #{post.id}"
puts e
url
end
end
if updated
post.save!
post.rebake!
putc "#"
else
putc "."
end
rescue StandardError => e
puts ""
puts "XXXXXXXXXXXXXXXX ERROR XXXXXXXXXXXXXXXX"
puts "post id: #{post.id}"
puts e
end
end
puts "Done!"
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment