diff --git a/doc/settings/configuration.md b/doc/settings/configuration.md
index 0ee1457ebb58f0cd8afcd2106c11eb06a59ad650_ZG9jL3NldHRpbmdzL2NvbmZpZ3VyYXRpb24ubWQ=..94b33ad2d368b3e66c78dd4fa970e1504388abe4_ZG9jL3NldHRpbmdzL2NvbmZpZ3VyYXRpb24ubWQ= 100644
--- a/doc/settings/configuration.md
+++ b/doc/settings/configuration.md
@@ -590,6 +590,28 @@
    sudo gitlab-ctl reconfigure
    ```
 
+## Set a Content Delivery Network URL
+
+Service static assets with a Content Delivery Network (CDN) or asset host
+using `gitlab_rails['cdn_host']`. This configures a [Rails asset host](https://guides.rubyonrails.org/configuring.html#config-asset-host).
+
+To set a CDN/asset host:
+
+1. Edit `/etc/gitlab/gitlab.rb`:
+
+   ```ruby
+   gitlab_rails['cdn_host'] = 'https://mycdnsubdomain.fictional-cdn.com'
+   ```
+
+1. Reconfigure GitLab:
+
+   ```shell
+   sudo gitlab-ctl reconfigure
+   ```
+
+Additional documentation for configuring common services to act as an asset host
+is tracked in [this issue](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5708).
+
 ## Set a Content Security Policy
 
 Setting a Content Security Policy (CSP) can help thwart JavaScript
diff --git a/files/gitlab-config-template/gitlab.rb.template b/files/gitlab-config-template/gitlab.rb.template
index 0ee1457ebb58f0cd8afcd2106c11eb06a59ad650_ZmlsZXMvZ2l0bGFiLWNvbmZpZy10ZW1wbGF0ZS9naXRsYWIucmIudGVtcGxhdGU=..94b33ad2d368b3e66c78dd4fa970e1504388abe4_ZmlsZXMvZ2l0bGFiLWNvbmZpZy10ZW1wbGF0ZS9naXRsYWIucmIudGVtcGxhdGU= 100644
--- a/files/gitlab-config-template/gitlab.rb.template
+++ b/files/gitlab-config-template/gitlab.rb.template
@@ -67,6 +67,11 @@
 # gitlab_rails['gitlab_ssh_user'] = ''
 # gitlab_rails['time_zone'] = 'UTC'
 
+### Rails asset / CDN host
+###! Defines a url for a host/cdn to use for the Rails assets
+###! Docs: https://docs.gitlab.com/omnibus/settings/configuration.html#set-a-content-delivery-network-url
+# gitlab_rails['cdn_host'] = 'https://mycdnsubdomain.fictional-cdn.com'
+
 ### Request duration
 ###! Tells the rails application how long it has to complete a request
 ###! This value needs to be lower than the worker timeout set in puma.
diff --git a/files/gitlab-cookbooks/gitlab/attributes/default.rb b/files/gitlab-cookbooks/gitlab/attributes/default.rb
index 0ee1457ebb58f0cd8afcd2106c11eb06a59ad650_ZmlsZXMvZ2l0bGFiLWNvb2tib29rcy9naXRsYWIvYXR0cmlidXRlcy9kZWZhdWx0LnJi..94b33ad2d368b3e66c78dd4fa970e1504388abe4_ZmlsZXMvZ2l0bGFiLWNvb2tib29rcy9naXRsYWIvYXR0cmlidXRlcy9kZWZhdWx0LnJi 100644
--- a/files/gitlab-cookbooks/gitlab/attributes/default.rb
+++ b/files/gitlab-cookbooks/gitlab/attributes/default.rb
@@ -92,6 +92,7 @@
 default['gitlab']['gitlab-rails']['gitlab_ssh_user'] = nil
 default['gitlab']['gitlab-rails']['gitlab_ssh_host'] = nil
 default['gitlab']['gitlab-rails']['time_zone'] = nil
+default['gitlab']['gitlab-rails']['cdn_host'] = nil
 default['gitlab']['gitlab-rails']['gitlab_email_from'] = nil
 default['gitlab']['gitlab-rails']['gitlab_email_display_name'] = nil
 default['gitlab']['gitlab-rails']['gitlab_email_subject_suffix'] = nil
diff --git a/files/gitlab-cookbooks/gitlab/templates/default/gitlab.yml.erb b/files/gitlab-cookbooks/gitlab/templates/default/gitlab.yml.erb
index 0ee1457ebb58f0cd8afcd2106c11eb06a59ad650_ZmlsZXMvZ2l0bGFiLWNvb2tib29rcy9naXRsYWIvdGVtcGxhdGVzL2RlZmF1bHQvZ2l0bGFiLnltbC5lcmI=..94b33ad2d368b3e66c78dd4fa970e1504388abe4_ZmlsZXMvZ2l0bGFiLWNvb2tib29rcy9naXRsYWIvdGVtcGxhdGVzL2RlZmF1bHQvZ2l0bGFiLnltbC5lcmI= 100644
--- a/files/gitlab-cookbooks/gitlab/templates/default/gitlab.yml.erb
+++ b/files/gitlab-cookbooks/gitlab/templates/default/gitlab.yml.erb
@@ -14,6 +14,11 @@
     port: <%= @gitlab_port %>
     https: <%= @gitlab_https %>
 
+    <%- unless @cdn_host.nil? %>
+    ## Rails asset/CDN host
+    cdn_host: <%= @cdn_host %>
+    <% end %>
+
     # The maximum time puma can spend on the request. This needs to be smaller than the worker timeout.
     # Default is 95% of the worker timeout
     max_request_duration_seconds: <%= @max_request_duration_seconds %>
diff --git a/spec/chef/cookbooks/gitlab/recipes/gitlab-rails/gitlab_yml/gitlab_spec.rb b/spec/chef/cookbooks/gitlab/recipes/gitlab-rails/gitlab_yml/gitlab_spec.rb
index 0ee1457ebb58f0cd8afcd2106c11eb06a59ad650_c3BlYy9jaGVmL2Nvb2tib29rcy9naXRsYWIvcmVjaXBlcy9naXRsYWItcmFpbHMvZ2l0bGFiX3ltbC9naXRsYWJfc3BlYy5yYg==..94b33ad2d368b3e66c78dd4fa970e1504388abe4_c3BlYy9jaGVmL2Nvb2tib29rcy9naXRsYWIvcmVjaXBlcy9naXRsYWItcmFpbHMvZ2l0bGFiX3ltbC9naXRsYWJfc3BlYy5yYg== 100644
--- a/spec/chef/cookbooks/gitlab/recipes/gitlab-rails/gitlab_yml/gitlab_spec.rb
+++ b/spec/chef/cookbooks/gitlab/recipes/gitlab-rails/gitlab_yml/gitlab_spec.rb
@@ -4,6 +4,28 @@
   include_context 'gitlab-rails'
 
   describe 'GitLab Application Settings' do
+    describe 'CDN Host' do
+      context 'with default configuration' do
+        it 'does not render cdn_host in gitlab.yml' do
+          expect(gitlab_yml[:production][:gitlab][:cdn_host]).to be nil
+        end
+      end
+
+      context 'with user specified configuration' do
+        before do
+          stub_gitlab_rb(
+            gitlab_rails: {
+              cdn_host: 'https://cdn.example.com'
+            }
+          )
+        end
+
+        it 'renders specified cdn_host in gitlab.yml' do
+          expect(gitlab_yml[:production][:gitlab][:cdn_host]).to eq('https://cdn.example.com')
+        end
+      end
+    end
+
     describe 'Content Security Policy settings' do
       context 'with default configuration' do
         it 'renders gitlab.yml without content security policy settings' do