FEATURE: Optionally allow a separate `s3_asset_cdn_url` to be specified (#19284)

If configured, this will be used for static JS assets which are stored on S3. This can be useful if you want to use different CDN providers/configuration for Uploads and JS
This commit is contained in:
David Taylor 2022-12-08 10:36:20 +00:00 committed by GitHub
parent 3fdb8ffb57
commit 03fadf91f0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 26 additions and 3 deletions

View File

@ -95,9 +95,10 @@ module ApplicationHelper
path = ActionController::Base.helpers.asset_path("#{script}.js") path = ActionController::Base.helpers.asset_path("#{script}.js")
if GlobalSetting.use_s3? && GlobalSetting.s3_cdn_url if GlobalSetting.use_s3? && GlobalSetting.s3_cdn_url
resolved_s3_asset_cdn_url = GlobalSetting.s3_asset_cdn_url.presence || GlobalSetting.s3_cdn_url
if GlobalSetting.cdn_url if GlobalSetting.cdn_url
folder = ActionController::Base.config.relative_url_root || "/" folder = ActionController::Base.config.relative_url_root || "/"
path = path.gsub(File.join(GlobalSetting.cdn_url, folder, "/"), File.join(GlobalSetting.s3_cdn_url, "/")) path = path.gsub(File.join(GlobalSetting.cdn_url, folder, "/"), File.join(resolved_s3_asset_cdn_url, "/"))
else else
# we must remove the subfolder path here, assets are uploaded to s3 # we must remove the subfolder path here, assets are uploaded to s3
# without it getting involved # without it getting involved
@ -105,7 +106,7 @@ module ApplicationHelper
path = path.sub(ActionController::Base.config.relative_url_root, "") path = path.sub(ActionController::Base.config.relative_url_root, "")
end end
path = "#{GlobalSetting.s3_cdn_url}#{path}" path = "#{resolved_s3_asset_cdn_url}#{path}"
end end
# assets needed for theme testing are not compressed because they take a fair # assets needed for theme testing are not compressed because they take a fair

View File

@ -229,6 +229,9 @@ s3_endpoint =
s3_http_continue_timeout = s3_http_continue_timeout =
s3_install_cors_rule = s3_install_cors_rule =
# Optionally, specify a separate CDN to be used for static JS assets stored on S3
s3_asset_cdn_url =
### rate limits apply to all sites ### rate limits apply to all sites
max_user_api_reqs_per_minute = 20 max_user_api_reqs_per_minute = 20
max_user_api_reqs_per_day = 2880 max_user_api_reqs_per_day = 2880

View File

@ -37,7 +37,7 @@ class ContentSecurityPolicy
['/svg-sprite/', false, true, false], ['/svg-sprite/', false, true, false],
] ]
def script_assets(base = base_url, s3_cdn = GlobalSetting.s3_cdn_url, cdn = GlobalSetting.cdn_url, worker: false) def script_assets(base = base_url, s3_cdn = GlobalSetting.s3_asset_cdn_url.presence || GlobalSetting.s3_cdn_url, cdn = GlobalSetting.cdn_url, worker: false)
SCRIPT_ASSET_DIRECTORIES.map do |dir, can_use_s3_cdn, can_use_cdn, for_worker| SCRIPT_ASSET_DIRECTORIES.map do |dir, can_use_s3_cdn, can_use_cdn, for_worker|
next if worker && !for_worker next if worker && !for_worker
if can_use_s3_cdn && s3_cdn if can_use_s3_cdn && s3_cdn

View File

@ -88,6 +88,12 @@ RSpec.describe ApplicationHelper do
link = helper.preload_script('discourse/tests/theme_qunit_ember_jquery') link = helper.preload_script('discourse/tests/theme_qunit_ember_jquery')
expect(link).to eq(script_tag("https://s3cdn.com/assets/discourse/tests/theme_qunit_ember_jquery.js")) expect(link).to eq(script_tag("https://s3cdn.com/assets/discourse/tests/theme_qunit_ember_jquery.js"))
end end
it "uses separate asset CDN if configured" do
global_setting :s3_asset_cdn_url, "https://s3-asset-cdn.example.com"
expect(helper.preload_script("discourse")).to include("https://s3-asset-cdn.example.com/assets/discourse.js")
end
end end
end end

View File

@ -133,6 +133,19 @@ RSpec.describe ContentSecurityPolicy do
https://cdn.com/theme-javascripts/ https://cdn.com/theme-javascripts/
http://test.localhost/extra-locales/ http://test.localhost/extra-locales/
]) ])
global_setting(:s3_asset_cdn_url, 'https://s3-asset-cdn.com')
script_srcs = parse(policy)['script-src']
expect(script_srcs).to include(*%w[
https://s3-asset-cdn.com/assets/
https://s3-asset-cdn.com/brotli_asset/
https://cdn.com/highlight-js/
https://cdn.com/javascripts/
https://cdn.com/plugins/
https://cdn.com/theme-javascripts/
http://test.localhost/extra-locales/
])
end end
it 'adds subfolder to CDN assets' do it 'adds subfolder to CDN assets' do