diff --git a/files/gitlab-cookbooks/package/libraries/config/gitlab.rb b/files/gitlab-cookbooks/package/libraries/config/gitlab.rb
index c5757ee7c0b7742560e1f9d006296c285e9e6d35_ZmlsZXMvZ2l0bGFiLWNvb2tib29rcy9wYWNrYWdlL2xpYnJhcmllcy9jb25maWcvZ2l0bGFiLnJi..634455a2a9f36e291d8d5c93113fd6cb8f186739_ZmlsZXMvZ2l0bGFiLWNvb2tib29rcy9wYWNrYWdlL2xpYnJhcmllcy9jb25maWcvZ2l0bGFiLnJi 100644
--- a/files/gitlab-cookbooks/package/libraries/config/gitlab.rb
+++ b/files/gitlab-cookbooks/package/libraries/config/gitlab.rb
@@ -28,4 +28,6 @@
   git_data_dirs ConfigMash.new
 
   ## Roles
+
+  # Roles that depend on gitlab_rails['enable'] should be processed first
   role('application').use { ApplicationRole }
@@ -31,7 +33,10 @@
   role('application').use { ApplicationRole }
+  role('sidekiq').use { SidekiqRole }
+  role('postgres').use { PostgresRole }
+  role('patroni').use { PatroniRole }
   role('redis_sentinel').use { RedisSentinelRole }
   role('redis_master').use { RedisMasterRole }
   role('redis_replica')
   role('geo_primary',   manage_services: false).use { GeoPrimaryRole }
   role('geo_secondary', manage_services: false).use { GeoSecondaryRole }
   role('monitoring').use { MonitoringRole }
@@ -32,8 +37,7 @@
   role('redis_sentinel').use { RedisSentinelRole }
   role('redis_master').use { RedisMasterRole }
   role('redis_replica')
   role('geo_primary',   manage_services: false).use { GeoPrimaryRole }
   role('geo_secondary', manage_services: false).use { GeoSecondaryRole }
   role('monitoring').use { MonitoringRole }
-  role('postgres').use { PostgresRole }
   role('pgbouncer').use { PgbouncerRole }
@@ -39,4 +43,3 @@
   role('pgbouncer').use { PgbouncerRole }
-  role('patroni').use { PatroniRole }
   role('consul').use { ConsulRole }
   role('pages').use { PagesRole }
@@ -41,6 +44,5 @@
   role('consul').use { ConsulRole }
   role('pages').use { PagesRole }
-  role('sidekiq').use { SidekiqRole }
   role('spamcheck').use { SpamcheckRole }
 
   ## Attributes directly on the node
diff --git a/files/gitlab-cookbooks/package/libraries/config/roles/application.rb b/files/gitlab-cookbooks/package/libraries/config/roles/application.rb
index c5757ee7c0b7742560e1f9d006296c285e9e6d35_ZmlsZXMvZ2l0bGFiLWNvb2tib29rcy9wYWNrYWdlL2xpYnJhcmllcy9jb25maWcvcm9sZXMvYXBwbGljYXRpb24ucmI=..634455a2a9f36e291d8d5c93113fd6cb8f186739_ZmlsZXMvZ2l0bGFiLWNvb2tib29rcy9wYWNrYWdlL2xpYnJhcmllcy9jb25maWcvcm9sZXMvYXBwbGljYXRpb24ucmI= 100644
--- a/files/gitlab-cookbooks/package/libraries/config/roles/application.rb
+++ b/files/gitlab-cookbooks/package/libraries/config/roles/application.rb
@@ -18,6 +18,7 @@
   def self.load_role
     return unless Gitlab['application_role']['enable']
 
+    # Run GitLab Rails related recipes unless explicitly disabled
     Gitlab['gitlab_rails']['enable'] = true if Gitlab['gitlab_rails']['enable'].nil?
     Gitlab['nginx']['enable'] = true if Gitlab['nginx']['enable'].nil?
 
diff --git a/files/gitlab-cookbooks/package/libraries/config/roles/consul.rb b/files/gitlab-cookbooks/package/libraries/config/roles/consul.rb
index c5757ee7c0b7742560e1f9d006296c285e9e6d35_ZmlsZXMvZ2l0bGFiLWNvb2tib29rcy9wYWNrYWdlL2xpYnJhcmllcy9jb25maWcvcm9sZXMvY29uc3VsLnJi..634455a2a9f36e291d8d5c93113fd6cb8f186739_ZmlsZXMvZ2l0bGFiLWNvb2tib29rcy9wYWNrYWdlL2xpYnJhcmllcy9jb25maWcvcm9sZXMvY29uc3VsLnJi 100644
--- a/files/gitlab-cookbooks/package/libraries/config/roles/consul.rb
+++ b/files/gitlab-cookbooks/package/libraries/config/roles/consul.rb
@@ -18,6 +18,9 @@
   def self.load_role
     return unless Gitlab['consul_role']['enable']
 
+    # Do not run GitLab Rails related recipes unless explicitly enabled
+    Gitlab['gitlab_rails']['enable'] ||= false
+
     Services.enable_group('consul_role')
   end
 end
diff --git a/files/gitlab-cookbooks/package/libraries/config/roles/geo_secondary.rb b/files/gitlab-cookbooks/package/libraries/config/roles/geo_secondary.rb
index c5757ee7c0b7742560e1f9d006296c285e9e6d35_ZmlsZXMvZ2l0bGFiLWNvb2tib29rcy9wYWNrYWdlL2xpYnJhcmllcy9jb25maWcvcm9sZXMvZ2VvX3NlY29uZGFyeS5yYg==..634455a2a9f36e291d8d5c93113fd6cb8f186739_ZmlsZXMvZ2l0bGFiLWNvb2tib29rcy9wYWNrYWdlL2xpYnJhcmllcy9jb25maWcvcm9sZXMvZ2VvX3NlY29uZGFyeS5yYg== 100644
--- a/files/gitlab-cookbooks/package/libraries/config/roles/geo_secondary.rb
+++ b/files/gitlab-cookbooks/package/libraries/config/roles/geo_secondary.rb
@@ -29,4 +29,9 @@
     Gitlab['postgresql']['max_standby_archive_delay'] ||= '60s'
     Gitlab['postgresql']['max_standby_streaming_delay'] ||= '60s'
     Gitlab['postgresql']['hot_standby'] ||= 'on'
+
+    # Run GitLab Rails related recipes only if required
+    Gitlab['gitlab_rails']['enable'] = rails_needed?
+
+    # Do not attempt to run DB migrations unless explicitly specified to
     Gitlab['gitlab_rails']['auto_migrate'] ||= false
@@ -32,5 +37,5 @@
     Gitlab['gitlab_rails']['auto_migrate'] ||= false
-    Gitlab['gitlab_rails']['enable'] = rails_needed?
+
     Gitlab[WebServerHelper.service_name]['worker_processes'] ||= number_of_worker_processes
   end
 
diff --git a/files/gitlab-cookbooks/package/libraries/config/roles/monitoring.rb b/files/gitlab-cookbooks/package/libraries/config/roles/monitoring.rb
index c5757ee7c0b7742560e1f9d006296c285e9e6d35_ZmlsZXMvZ2l0bGFiLWNvb2tib29rcy9wYWNrYWdlL2xpYnJhcmllcy9jb25maWcvcm9sZXMvbW9uaXRvcmluZy5yYg==..634455a2a9f36e291d8d5c93113fd6cb8f186739_ZmlsZXMvZ2l0bGFiLWNvb2tib29rcy9wYWNrYWdlL2xpYnJhcmllcy9jb25maWcvcm9sZXMvbW9uaXRvcmluZy5yYg== 100644
--- a/files/gitlab-cookbooks/package/libraries/config/roles/monitoring.rb
+++ b/files/gitlab-cookbooks/package/libraries/config/roles/monitoring.rb
@@ -18,7 +18,9 @@
   def self.load_role
     return unless Gitlab['monitoring_role']['enable']
 
-    Gitlab['gitlab_rails']['auto_migrate'] ||= false
+    # Do not run GitLab Rails related recipes unless explicitly enabled
+    Gitlab['gitlab_rails']['enable'] ||= false
+
     Services.enable_group('monitoring_role')
   end
 end
diff --git a/files/gitlab-cookbooks/package/libraries/config/roles/pages.rb b/files/gitlab-cookbooks/package/libraries/config/roles/pages.rb
index c5757ee7c0b7742560e1f9d006296c285e9e6d35_ZmlsZXMvZ2l0bGFiLWNvb2tib29rcy9wYWNrYWdlL2xpYnJhcmllcy9jb25maWcvcm9sZXMvcGFnZXMucmI=..634455a2a9f36e291d8d5c93113fd6cb8f186739_ZmlsZXMvZ2l0bGFiLWNvb2tib29rcy9wYWNrYWdlL2xpYnJhcmllcy9jb25maWcvcm9sZXMvcGFnZXMucmI= 100644
--- a/files/gitlab-cookbooks/package/libraries/config/roles/pages.rb
+++ b/files/gitlab-cookbooks/package/libraries/config/roles/pages.rb
@@ -18,7 +18,7 @@
   def self.load_role
     return unless Gitlab['pages_role']['enable']
 
-    # Turning off GitLab Rails unless explicitly enabled.
+    # Do not run GitLab Rails related recipes unless explicitly enabled
     Gitlab['gitlab_rails']['enable'] ||= false
 
     Services.enable_group('pages_role')
diff --git a/files/gitlab-cookbooks/package/libraries/config/roles/patroni.rb b/files/gitlab-cookbooks/package/libraries/config/roles/patroni.rb
index c5757ee7c0b7742560e1f9d006296c285e9e6d35_ZmlsZXMvZ2l0bGFiLWNvb2tib29rcy9wYWNrYWdlL2xpYnJhcmllcy9jb25maWcvcm9sZXMvcGF0cm9uaS5yYg==..634455a2a9f36e291d8d5c93113fd6cb8f186739_ZmlsZXMvZ2l0bGFiLWNvb2tib29rcy9wYWNrYWdlL2xpYnJhcmllcy9jb25maWcvcm9sZXMvcGF0cm9uaS5yYg== 100644
--- a/files/gitlab-cookbooks/package/libraries/config/roles/patroni.rb
+++ b/files/gitlab-cookbooks/package/libraries/config/roles/patroni.rb
@@ -18,6 +18,11 @@
   def self.load_role
     return unless Gitlab['patroni_role']['enable']
 
+    # We need to set Gitlab['gitlab_rails']['enable'] to true because DB
+    # creation in database_objects resource is gated on whether Rails is
+    # enabled or not.
+    Gitlab['gitlab_rails']['enable'] = true if Gitlab['gitlab_rails']['enable'].nil?
+
     Services.enable_group('patroni_role')
   end
 end
diff --git a/files/gitlab-cookbooks/package/libraries/config/roles/pgbouncer.rb b/files/gitlab-cookbooks/package/libraries/config/roles/pgbouncer.rb
index c5757ee7c0b7742560e1f9d006296c285e9e6d35_ZmlsZXMvZ2l0bGFiLWNvb2tib29rcy9wYWNrYWdlL2xpYnJhcmllcy9jb25maWcvcm9sZXMvcGdib3VuY2VyLnJi..634455a2a9f36e291d8d5c93113fd6cb8f186739_ZmlsZXMvZ2l0bGFiLWNvb2tib29rcy9wYWNrYWdlL2xpYnJhcmllcy9jb25maWcvcm9sZXMvcGdib3VuY2VyLnJi 100644
--- a/files/gitlab-cookbooks/package/libraries/config/roles/pgbouncer.rb
+++ b/files/gitlab-cookbooks/package/libraries/config/roles/pgbouncer.rb
@@ -18,6 +18,9 @@
   def self.load_role
     return unless Gitlab['pgbouncer_role']['enable']
 
+    # Do not run GitLab Rails related recipes unless explicitly enabled
+    Gitlab['gitlab_rails']['enable'] ||= false
+
     Services.enable_group('pgbouncer_role')
   end
 end
diff --git a/files/gitlab-cookbooks/package/libraries/config/roles/postgres.rb b/files/gitlab-cookbooks/package/libraries/config/roles/postgres.rb
index c5757ee7c0b7742560e1f9d006296c285e9e6d35_ZmlsZXMvZ2l0bGFiLWNvb2tib29rcy9wYWNrYWdlL2xpYnJhcmllcy9jb25maWcvcm9sZXMvcG9zdGdyZXMucmI=..634455a2a9f36e291d8d5c93113fd6cb8f186739_ZmlsZXMvZ2l0bGFiLWNvb2tib29rcy9wYWNrYWdlL2xpYnJhcmllcy9jb25maWcvcm9sZXMvcG9zdGdyZXMucmI= 100644
--- a/files/gitlab-cookbooks/package/libraries/config/roles/postgres.rb
+++ b/files/gitlab-cookbooks/package/libraries/config/roles/postgres.rb
@@ -18,6 +18,11 @@
   def self.load_role
     return unless Gitlab['postgres_role']['enable']
 
+    # We need to set Gitlab['gitlab_rails']['enable'] to true because DB
+    # creation in database_objects resource is gated on whether Rails is
+    # enabled or not.
+    Gitlab['gitlab_rails']['enable'] = true if Gitlab['gitlab_rails']['enable'].nil?
+
     Services.enable_group('postgres_role')
   end
 end
diff --git a/files/gitlab-cookbooks/package/libraries/config/roles/redis_master.rb b/files/gitlab-cookbooks/package/libraries/config/roles/redis_master.rb
index c5757ee7c0b7742560e1f9d006296c285e9e6d35_ZmlsZXMvZ2l0bGFiLWNvb2tib29rcy9wYWNrYWdlL2xpYnJhcmllcy9jb25maWcvcm9sZXMvcmVkaXNfbWFzdGVyLnJi..634455a2a9f36e291d8d5c93113fd6cb8f186739_ZmlsZXMvZ2l0bGFiLWNvb2tib29rcy9wYWNrYWdlL2xpYnJhcmllcy9jb25maWcvcm9sZXMvcmVkaXNfbWFzdGVyLnJi 100644
--- a/files/gitlab-cookbooks/package/libraries/config/roles/redis_master.rb
+++ b/files/gitlab-cookbooks/package/libraries/config/roles/redis_master.rb
@@ -19,5 +19,7 @@
     master_role = Gitlab['redis_master_role']['enable']
     replica_role = Gitlab['redis_replica_role']['enable']
 
+    return unless master_role || replica_role
+
     raise 'Cannot define both redis_master_role and redis_replica_role in the same machine.' if master_role && replica_role
 
@@ -22,5 +24,8 @@
     raise 'Cannot define both redis_master_role and redis_replica_role in the same machine.' if master_role && replica_role
 
+    # Do not run GitLab Rails related recipes unless explicitly enabled
+    Gitlab['gitlab_rails']['enable'] ||= false
+
     Services.enable_group('redis_node') if master_role || replica_role
   end
 end
diff --git a/files/gitlab-cookbooks/package/libraries/config/roles/redis_sentinel.rb b/files/gitlab-cookbooks/package/libraries/config/roles/redis_sentinel.rb
index c5757ee7c0b7742560e1f9d006296c285e9e6d35_ZmlsZXMvZ2l0bGFiLWNvb2tib29rcy9wYWNrYWdlL2xpYnJhcmllcy9jb25maWcvcm9sZXMvcmVkaXNfc2VudGluZWwucmI=..634455a2a9f36e291d8d5c93113fd6cb8f186739_ZmlsZXMvZ2l0bGFiLWNvb2tib29rcy9wYWNrYWdlL2xpYnJhcmllcy9jb25maWcvcm9sZXMvcmVkaXNfc2VudGluZWwucmI= 100644
--- a/files/gitlab-cookbooks/package/libraries/config/roles/redis_sentinel.rb
+++ b/files/gitlab-cookbooks/package/libraries/config/roles/redis_sentinel.rb
@@ -16,6 +16,11 @@
 
 module RedisSentinelRole
   def self.load_role
-    Services.enable('sentinel') if Gitlab['redis_sentinel_role']['enable']
+    return unless Gitlab['redis_sentinel_role']['enable']
+
+    # Do not run GitLab Rails related recipes unless explicitly enabled
+    Gitlab['gitlab_rails']['enable'] ||= false
+
+    Services.enable('sentinel')
   end
 end
diff --git a/files/gitlab-cookbooks/package/libraries/config/roles/sidekiq.rb b/files/gitlab-cookbooks/package/libraries/config/roles/sidekiq.rb
index c5757ee7c0b7742560e1f9d006296c285e9e6d35_ZmlsZXMvZ2l0bGFiLWNvb2tib29rcy9wYWNrYWdlL2xpYnJhcmllcy9jb25maWcvcm9sZXMvc2lkZWtpcS5yYg==..634455a2a9f36e291d8d5c93113fd6cb8f186739_ZmlsZXMvZ2l0bGFiLWNvb2tib29rcy9wYWNrYWdlL2xpYnJhcmllcy9jb25maWcvcm9sZXMvc2lkZWtpcS5yYg== 100644
--- a/files/gitlab-cookbooks/package/libraries/config/roles/sidekiq.rb
+++ b/files/gitlab-cookbooks/package/libraries/config/roles/sidekiq.rb
@@ -18,4 +18,5 @@
   def self.load_role
     return unless Gitlab['sidekiq_role']['enable']
 
+    # Do not run any DB migrations
     Gitlab['gitlab_rails']['auto_migrate'] ||= false
@@ -21,4 +22,5 @@
     Gitlab['gitlab_rails']['auto_migrate'] ||= false
+
     Services.enable_group('sidekiq_role')
   end
 end
diff --git a/files/gitlab-cookbooks/package/libraries/config/roles/spamcheck.rb b/files/gitlab-cookbooks/package/libraries/config/roles/spamcheck.rb
index c5757ee7c0b7742560e1f9d006296c285e9e6d35_ZmlsZXMvZ2l0bGFiLWNvb2tib29rcy9wYWNrYWdlL2xpYnJhcmllcy9jb25maWcvcm9sZXMvc3BhbWNoZWNrLnJi..634455a2a9f36e291d8d5c93113fd6cb8f186739_ZmlsZXMvZ2l0bGFiLWNvb2tib29rcy9wYWNrYWdlL2xpYnJhcmllcy9jb25maWcvcm9sZXMvc3BhbWNoZWNrLnJi 100644
--- a/files/gitlab-cookbooks/package/libraries/config/roles/spamcheck.rb
+++ b/files/gitlab-cookbooks/package/libraries/config/roles/spamcheck.rb
@@ -18,7 +18,7 @@
   def self.load_role
     return unless Gitlab['spamcheck_role']['enable']
 
-    # Turning off GitLab Rails unless explicitly enabled.
+    # Do not run GitLab Rails related recipes unless explicitly enabled
     Gitlab['gitlab_rails']['enable'] ||= false
 
     Services.enable_group('spamcheck_role')