1_settings.rb 33.7 KB
Newer Older
Kamil Trzciński's avatar
Kamil Trzciński committed
1
require_relative '../settings'
2
require_relative '../object_store_settings'
3 4 5

# Default settings
Settings['ldap'] ||= Settingslogic.new({})
6
Settings.ldap['enabled'] = false if Settings.ldap['enabled'].nil?
7

8 9 10 11 12 13 14
Gitlab.ee do
  Settings.ldap['sync_time'] = 3600 if Settings.ldap['sync_time'].nil?
  Settings.ldap['schedule_sync_daily'] = 1 if Settings.ldap['schedule_sync_daily'].nil?
  Settings.ldap['schedule_sync_hour'] = 1 if Settings.ldap['schedule_sync_hour'].nil?
  Settings.ldap['schedule_sync_minute'] = 30 if Settings.ldap['schedule_sync_minute'].nil?
end

15 16 17
# backwards compatibility, we only have one host
if Settings.ldap['enabled'] || Rails.env.test?
  if Settings.ldap['host'].present?
18 19
    # We detected old LDAP configuration syntax. Update the config to make it
    # look like it was entered with the new syntax.
20
    server = Settings.ldap.except('sync_time')
21
    Settings.ldap['servers'] = {
22
      'main' => server
23
    }
24 25
  end

26
  Settings.ldap['servers'].each do |key, server|
27 28
    server = Settingslogic.new(server)

29
    server['label'] ||= 'LDAP'
30
    server['timeout'] ||= 10.seconds
31
    server['block_auto_created_users'] = false if server['block_auto_created_users'].nil?
32
    server['allow_username_or_email_login'] = false if server['allow_username_or_email_login'].nil?
33
    server['smartcard_auth'] = false unless %w[optional required].include?(server['smartcard_auth'])
34
    server['active_directory'] = true if server['active_directory'].nil?
35
    server['attributes'] = {} if server['attributes'].nil?
36
    server['lowercase_usernames'] = false if server['lowercase_usernames'].nil?
37
    server['provider_name'] ||= "ldap#{key}".downcase
38
    server['provider_class'] = OmniAuth::Utils.camelize(server['provider_name'])
39 40
    server['external_groups'] = [] if server['external_groups'].nil?
    server['sync_ssh_keys'] = 'sshPublicKey' if server['sync_ssh_keys'].to_s == 'true'
41 42 43 44 45

    # For backwards compatibility
    server['encryption'] ||= server['method']
    server['encryption'] = 'simple_tls' if server['encryption'] == 'ssl'
    server['encryption'] = 'start_tls' if server['encryption'] == 'tls'
Michael Kozono's avatar
Michael Kozono committed
46

47 48 49 50 51
    # Certificate verification was added in 9.4.2, and defaulted to false for
    # backwards-compatibility.
    #
    # Since GitLab 10.0, verify_certificates defaults to true for security.
    server['verify_certificates'] = true if server['verify_certificates'].nil?
52

53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
    # Expose ability to set `tls_options` directly. Deprecate `ca_file` and
    # `ssl_version` in favor of `tls_options` hash option.
    server['tls_options'] ||= {}

    if server['ssl_version'] || server['ca_file']
      Rails.logger.warn 'DEPRECATED: LDAP options `ssl_version` and `ca_file` should be nested within `tls_options`'
    end

    if server['ssl_version']
      server['tls_options']['ssl_version'] ||= server['ssl_version']
      server.delete('ssl_version')
    end

    if server['ca_file']
      server['tls_options']['ca_file'] ||= server['ca_file']
      server.delete('ca_file')
    end

71
    Settings.ldap['servers'][key] = server
72 73
  end
end
74

75 76 77 78 79 80
Gitlab.ee do
  Settings['smartcard'] ||= Settingslogic.new({})
  Settings.smartcard['enabled'] = false if Settings.smartcard['enabled'].nil?
  Settings.smartcard['client_certificate_required_port'] = 3444 if Settings.smartcard['client_certificate_required_port'].nil?
end

81
Settings['omniauth'] ||= Settingslogic.new({})
Nick Thomas's avatar
Nick Thomas committed
82
Settings.omniauth['enabled'] = true if Settings.omniauth['enabled'].nil?
83
Settings.omniauth['auto_sign_in_with_provider'] = false if Settings.omniauth['auto_sign_in_with_provider'].nil?
84
Settings.omniauth['allow_single_sign_on'] = false if Settings.omniauth['allow_single_sign_on'].nil?
85
Settings.omniauth['external_providers'] = [] if Settings.omniauth['external_providers'].nil?
86 87
Settings.omniauth['block_auto_created_users'] = true if Settings.omniauth['block_auto_created_users'].nil?
Settings.omniauth['auto_link_ldap_user'] = false if Settings.omniauth['auto_link_ldap_user'].nil?
88
Settings.omniauth['auto_link_saml_user'] = false if Settings.omniauth['auto_link_saml_user'].nil?
89 90 91 92 93 94 95 96 97 98 99 100 101 102

Settings.omniauth['sync_profile_from_provider'] = false if Settings.omniauth['sync_profile_from_provider'].nil?
Settings.omniauth['sync_profile_attributes'] = ['email'] if Settings.omniauth['sync_profile_attributes'].nil?

# Handle backwards compatibility with merge request 11268
if Settings.omniauth['sync_email_from_provider']
  if Settings.omniauth['sync_profile_from_provider'].is_a?(Array)
    Settings.omniauth['sync_profile_from_provider'] |= [Settings.omniauth['sync_email_from_provider']]
  elsif !Settings.omniauth['sync_profile_from_provider']
    Settings.omniauth['sync_profile_from_provider'] = [Settings.omniauth['sync_email_from_provider']]
  end

  Settings.omniauth['sync_profile_attributes'] |= ['email'] unless Settings.omniauth['sync_profile_attributes'] == true
end
103

104
Settings.omniauth['providers'] ||= []
tduehr's avatar
tduehr committed
105 106 107 108
Settings.omniauth['cas3'] ||= Settingslogic.new({})
Settings.omniauth.cas3['session_duration'] ||= 8.hours
Settings.omniauth['session_tickets'] ||= Settingslogic.new({})
Settings.omniauth.session_tickets['cas3'] = 'ticket'
109

110 111 112
# Fill out omniauth-gitlab settings. It is needed for easy set up GHE or GH by just specifying url.

github_default_url = "https://github.com"
113
github_settings = Settings.omniauth['providers'].find { |provider| provider["name"] == "github" }
114 115 116 117 118 119 120 121 122 123

if github_settings
  # For compatibility with old config files (before 7.8)
  # where people dont have url in github settings
  if github_settings['url'].blank?
    github_settings['url'] = github_default_url
  end

  github_settings["args"] ||= Settingslogic.new({})

Douwe Maan's avatar
Douwe Maan committed
124 125 126 127 128 129 130 131 132 133
  github_settings["args"]["client_options"] =
    if github_settings["url"].include?(github_default_url)
      OmniAuth::Strategies::GitHub.default_options[:client_options]
    else
      {
        "site"          => File.join(github_settings["url"], "api/v3"),
        "authorize_url" => File.join(github_settings["url"], "login/oauth/authorize"),
        "token_url"     => File.join(github_settings["url"], "login/oauth/access_token")
      }
    end
134
end
135

136 137 138 139 140 141 142 143 144
# SAML should be enabled for the tests automatically, but only for EE.
saml_provider_enabled = Settings.omniauth.providers.any? do |provider|
  provider['name'] == 'group_saml'
end

if Gitlab.ee? && Rails.env.test? && !saml_provider_enabled
  Settings.omniauth.providers << Settingslogic.new({ 'name' => 'group_saml' })
end

145
Settings['shared'] ||= Settingslogic.new({})
146
Settings.shared['path'] = Settings.absolute(Settings.shared['path'] || "shared")
147

148
Settings['issues_tracker'] ||= {}
149

150 151 152
#
# GitLab
#
153
Settings['gitlab'] ||= Settingslogic.new({})
Gosia Ksionek's avatar
Gosia Ksionek committed
154
Settings.gitlab['default_project_creation'] ||= ::Gitlab::Access::DEVELOPER_MAINTAINER_PROJECT_ACCESS
155
Settings.gitlab['default_project_deletion_protection'] ||= false
156
Settings.gitlab['default_projects_limit'] ||= 100000
157
Settings.gitlab['default_branch_protection'] ||= 2
158
Settings.gitlab['default_can_create_group'] = true if Settings.gitlab['default_can_create_group'].nil?
159
Settings.gitlab['default_theme'] = Gitlab::Themes::APPLICATION_DEFAULT if Settings.gitlab['default_theme'].nil?
160
Settings.gitlab['host']       ||= ENV['GITLAB_HOST'] || 'localhost'
161
Settings.gitlab['ssh_host']   ||= Settings.gitlab.host
162
Settings.gitlab['https']        = false if Settings.gitlab['https'].nil?
163
Settings.gitlab['port']       ||= ENV['GITLAB_PORT'] || (Settings.gitlab.https ? 443 : 80)
164
Settings.gitlab['relative_url_root'] ||= ENV['RAILS_RELATIVE_URL_ROOT'] || ''
165 166
# / is not a valid relative URL root
Settings.gitlab['relative_url_root']   = '' if Settings.gitlab['relative_url_root'] == '/'
167
Settings.gitlab['protocol'] ||= Settings.gitlab.https ? "https" : "http"
168
Settings.gitlab['email_enabled'] ||= true if Settings.gitlab['email_enabled'].nil?
169 170 171
Settings.gitlab['email_from'] ||= ENV['GITLAB_EMAIL_FROM'] || "gitlab@#{Settings.gitlab.host}"
Settings.gitlab['email_display_name'] ||= ENV['GITLAB_EMAIL_DISPLAY_NAME'] || 'GitLab'
Settings.gitlab['email_reply_to'] ||= ENV['GITLAB_EMAIL_REPLY_TO'] || "noreply@#{Settings.gitlab.host}"
172
Settings.gitlab['email_subject_suffix'] ||= ENV['GITLAB_EMAIL_SUBJECT_SUFFIX'] || ""
173 174
Settings.gitlab['base_url']   ||= Settings.__send__(:build_base_gitlab_url)
Settings.gitlab['url']        ||= Settings.__send__(:build_gitlab_url)
175
Settings.gitlab['user']       ||= 'git'
176 177 178 179 180
Settings.gitlab['user_home']  ||= begin
  Etc.getpwnam(Settings.gitlab['user']).dir
rescue ArgumentError # no user configured
  '/home/' + Settings.gitlab['user']
end
181
Settings.gitlab['time_zone'] ||= nil
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
182
Settings.gitlab['signup_enabled'] ||= true if Settings.gitlab['signup_enabled'].nil?
183
Settings.gitlab['signin_enabled'] ||= true if Settings.gitlab['signin_enabled'].nil?
184
Settings.gitlab['restricted_visibility_levels'] = Settings.__send__(:verify_constant_array, Gitlab::VisibilityLevel, Settings.gitlab['restricted_visibility_levels'], [])
185
Settings.gitlab['username_changing_enabled'] = true if Settings.gitlab['username_changing_enabled'].nil?
186
Settings.gitlab['issue_closing_pattern'] = '\b((?:[Cc]los(?:e[sd]?|ing)|\b[Ff]ix(?:e[sd]|ing)?|\b[Rr]esolv(?:e[sd]?|ing)|\b[Ii]mplement(?:s|ed|ing)?)(:?) +(?:(?:issues? +)?%{issue_ref}(?:(?: *,? +and +| *,? *)?)|([A-Z][A-Z0-9_]+-\d+))+)' if Settings.gitlab['issue_closing_pattern'].nil?
187
Settings.gitlab['default_projects_features'] ||= {}
188
Settings.gitlab['webhook_timeout'] ||= 10
189
Settings.gitlab['max_attachment_size'] ||= 10
190
Settings.gitlab['session_expire_delay'] ||= 10080
191
Settings.gitlab['unauthenticated_session_expire_delay'] ||= 2.hours.to_i
192 193 194
Settings.gitlab.default_projects_features['issues']             = true if Settings.gitlab.default_projects_features['issues'].nil?
Settings.gitlab.default_projects_features['merge_requests']     = true if Settings.gitlab.default_projects_features['merge_requests'].nil?
Settings.gitlab.default_projects_features['wiki']               = true if Settings.gitlab.default_projects_features['wiki'].nil?
195
Settings.gitlab.default_projects_features['snippets']           = true if Settings.gitlab.default_projects_features['snippets'].nil?
196 197
Settings.gitlab.default_projects_features['builds']             = true if Settings.gitlab.default_projects_features['builds'].nil?
Settings.gitlab.default_projects_features['container_registry'] = true if Settings.gitlab.default_projects_features['container_registry'].nil?
198
Settings.gitlab.default_projects_features['visibility_level']   = Settings.__send__(:verify_constant, Gitlab::VisibilityLevel, Settings.gitlab.default_projects_features['visibility_level'], Gitlab::VisibilityLevel::PRIVATE)
199
Settings.gitlab['domain_whitelist'] ||= []
200
Settings.gitlab['import_sources'] ||= Gitlab::ImportSources.values
201
Settings.gitlab['trusted_proxies'] ||= []
202
Settings.gitlab['no_todos_messages'] ||= YAML.load_file(Rails.root.join('config', 'no_todos_messages.yml'))
203
Settings.gitlab['impersonation_enabled'] ||= true if Settings.gitlab['impersonation_enabled'].nil?
204
Settings.gitlab['usage_ping_enabled'] = true if Settings.gitlab['usage_ping_enabled'].nil?
205

206 207 208 209 210 211
Gitlab.ee do
  Settings.gitlab['mirror_max_delay'] ||= 300
  Settings.gitlab['mirror_max_capacity'] ||= 30
  Settings.gitlab['mirror_capacity_threshold'] ||= 15
end

212 213 214 215 216 217 218 219 220
#
# Elasticseacrh
#
Gitlab.ee do
  Settings['elasticsearch'] ||= Settingslogic.new({})
  Settings.elasticsearch['enabled'] = false if Settings.elasticsearch['enabled'].nil?
  Settings.elasticsearch['url'] = ENV['ELASTIC_URL'] || "http://localhost:9200"
end

Valery Sizov's avatar
Valery Sizov committed
221 222 223 224
#
# CI
#
Settings['gitlab_ci'] ||= Settingslogic.new({})
225 226 227
Settings.gitlab_ci['shared_runners_enabled'] = true if Settings.gitlab_ci['shared_runners_enabled'].nil?
Settings.gitlab_ci['all_broken_builds']     = true if Settings.gitlab_ci['all_broken_builds'].nil?
Settings.gitlab_ci['add_pusher']            = false if Settings.gitlab_ci['add_pusher'].nil?
228
Settings.gitlab_ci['builds_path']           = Settings.absolute(Settings.gitlab_ci['builds_path'] || "builds/")
229
Settings.gitlab_ci['url']                 ||= Settings.__send__(:build_gitlab_ci_url)
Valery Sizov's avatar
Valery Sizov committed
230

Douwe Maan's avatar
Douwe Maan committed
231 232 233
#
# Reply by email
#
234
Settings['incoming_email'] ||= Settingslogic.new({})
235
Settings.incoming_email['enabled'] = false if Settings.incoming_email['enabled'].nil?
Douwe Maan's avatar
Douwe Maan committed
236

Kamil Trzcinski's avatar
Kamil Trzcinski committed
237 238 239 240 241
#
# Build Artifacts
#
Settings['artifacts'] ||= Settingslogic.new({})
Settings.artifacts['enabled']      = true if Settings.artifacts['enabled'].nil?
242 243 244 245
Settings.artifacts['storage_path'] = Settings.absolute(Settings.artifacts.values_at('path', 'storage_path').compact.first || File.join(Settings.shared['path'], "artifacts"))
# Settings.artifact['path'] is deprecated, use `storage_path` instead
Settings.artifacts['path']         = Settings.artifacts['storage_path']
Settings.artifacts['max_size'] ||= 100 # in megabytes
246
Settings.artifacts['object_store'] = ObjectStoreSettings.parse(Settings.artifacts['object_store'])
Kamil Trzcinski's avatar
Kamil Trzcinski committed
247

248 249 250 251
#
# Registry
#
Settings['registry'] ||= Settingslogic.new({})
252 253
Settings.registry['enabled']       ||= false
Settings.registry['host']          ||= "example.com"
254
Settings.registry['port']          ||= nil
255 256 257
Settings.registry['api_url']       ||= "http://localhost:5000/"
Settings.registry['key']           ||= nil
Settings.registry['issuer']        ||= nil
Kamil Trzcinski's avatar
Kamil Trzcinski committed
258
Settings.registry['host_port']     ||= [Settings.registry['host'], Settings.registry['port']].compact.join(':')
259
Settings.registry['path']            = Settings.absolute(Settings.registry['path'] || File.join(Settings.shared['path'], 'registry'))
260

261 262 263 264 265 266 267
#
# Error Reporting and Logging with Sentry
#
Settings['sentry'] ||= Settingslogic.new({})
Settings.sentry['enabled'] ||= false
Settings.sentry['dsn'] ||= nil
Settings.sentry['environment'] ||= nil
268
Settings.sentry['clientside_dsn'] ||= nil
269

270
#
Kamil Trzcinski's avatar
Kamil Trzcinski committed
271
# Pages
272
#
Kamil Trzcinski's avatar
Kamil Trzcinski committed
273
Settings['pages'] ||= Settingslogic.new({})
274
Settings.pages['enabled']           = false if Settings.pages['enabled'].nil?
275
Settings.pages['access_control']    = false if Settings.pages['access_control'].nil?
276 277 278 279 280 281 282 283
Settings.pages['path']              = Settings.absolute(Settings.pages['path'] || File.join(Settings.shared['path'], "pages"))
Settings.pages['https']             = false if Settings.pages['https'].nil?
Settings.pages['host']              ||= "example.com"
Settings.pages['port']              ||= Settings.pages.https ? 443 : 80
Settings.pages['protocol']          ||= Settings.pages.https ? "https" : "http"
Settings.pages['url']               ||= Settings.__send__(:build_pages_url)
Settings.pages['external_http']     ||= false unless Settings.pages['external_http'].present?
Settings.pages['external_https']    ||= false unless Settings.pages['external_https'].present?
284
Settings.pages['artifacts_server']  ||= Settings.pages['enabled'] if Settings.pages['artifacts_server'].nil?
Kamil Trzcinski's avatar
Kamil Trzcinski committed
285

286 287 288
Settings.pages['admin'] ||= Settingslogic.new({})
Settings.pages.admin['certificate'] ||= ''

289 290 291 292 293 294 295 296 297
#
# Geo
#
Gitlab.ee do
  Settings['geo'] ||= Settingslogic.new({})
  # For backwards compatibility, default to gitlab_url and if so, ensure it ends with "/"
  Settings.geo['node_name'] = Settings.geo['node_name'].presence || Settings.gitlab['url'].chomp('/').concat('/')
end

298 299 300 301 302
#
# External merge request diffs
#
Settings['external_diffs'] ||= Settingslogic.new({})
Settings.external_diffs['enabled']      = false if Settings.external_diffs['enabled'].nil?
303
Settings.external_diffs['when']         = 'always' if Settings.external_diffs['when'].nil?
304 305 306
Settings.external_diffs['storage_path'] = Settings.absolute(Settings.external_diffs['storage_path'] || File.join(Settings.shared['path'], 'external-diffs'))
Settings.external_diffs['object_store'] = ObjectStoreSettings.parse(Settings.external_diffs['object_store'])

Marin Jankovski's avatar
Marin Jankovski committed
307 308 309 310
#
# Git LFS
#
Settings['lfs'] ||= Settingslogic.new({})
Marin Jankovski's avatar
Marin Jankovski committed
311
Settings.lfs['enabled']      = true if Settings.lfs['enabled'].nil?
312
Settings.lfs['storage_path'] = Settings.absolute(Settings.lfs['storage_path'] || File.join(Settings.shared['path'], "lfs-objects"))
313
Settings.lfs['object_store'] = ObjectStoreSettings.parse(Settings.lfs['object_store'])
Marin Jankovski's avatar
Marin Jankovski committed
314

315 316 317 318 319 320
#
# Uploads
#
Settings['uploads'] ||= Settingslogic.new({})
Settings.uploads['storage_path'] = Settings.absolute(Settings.uploads['storage_path'] || 'public')
Settings.uploads['base_dir'] = Settings.uploads['base_dir'] || 'uploads/-/system'
321 322
Settings.uploads['object_store'] = ObjectStoreSettings.parse(Settings.uploads['object_store'])
Settings.uploads['object_store']['remote_directory'] ||= 'uploads'
323

324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349
#
# Packages
#
Gitlab.ee do
  Settings['packages'] ||= Settingslogic.new({})
  Settings.packages['enabled']      = true if Settings.packages['enabled'].nil?
  Settings.packages['storage_path'] = Settings.absolute(Settings.packages['storage_path'] || File.join(Settings.shared['path'], "packages"))
  Settings.packages['object_store'] = ObjectStoreSettings.parse(Settings.packages['object_store'])
end

#
# Dependency Proxy
#
Gitlab.ee do
  Settings['dependency_proxy'] ||= Settingslogic.new({})
  Settings.dependency_proxy['enabled']      = true if Settings.dependency_proxy['enabled'].nil?
  Settings.dependency_proxy['storage_path'] = Settings.absolute(Settings.dependency_proxy['storage_path'] || File.join(Settings.shared['path'], "dependency_proxy"))
  Settings.dependency_proxy['object_store'] = ObjectStoreSettings.parse(Settings.dependency_proxy['object_store'])

  # For first iteration dependency proxy uses Rails server to download blobs.
  # To ensure acceptable performance we only allow feature to be used with
  # multithreaded web-server Puma. This will be removed once download logic is moved
  # to GitLab workhorse
  Settings.dependency_proxy['enabled'] = false unless defined?(::Puma)
end

350 351 352 353
#
# Mattermost
#
Settings['mattermost'] ||= Settingslogic.new({})
Kamil Trzcinski's avatar
Kamil Trzcinski committed
354 355
Settings.mattermost['enabled'] = false if Settings.mattermost['enabled'].nil?
Settings.mattermost['host'] = nil unless Settings.mattermost.enabled
356

357 358 359
#
# Gravatar
#
360
Settings['gravatar'] ||= Settingslogic.new({})
361
Settings.gravatar['enabled']      = true if Settings.gravatar['enabled'].nil?
362
Settings.gravatar['plain_url']  ||= 'https://www.gravatar.com/avatar/%{hash}?s=%{size}&d=identicon'
363
Settings.gravatar['ssl_url']    ||= 'https://secure.gravatar.com/avatar/%{hash}?s=%{size}&d=identicon'
364
Settings.gravatar['host']         = Settings.host_without_www(Settings.gravatar['plain_url'])
365

366 367 368 369
#
# Cron Jobs
#
Settings['cron_jobs'] ||= Settingslogic.new({})
370 371 372 373 374

if Gitlab.ee? && Settings['ee_cron_jobs']
  Settings.cron_jobs.merge!(Settings.ee_cron_jobs)
end

375 376 377
Settings.cron_jobs['stuck_ci_jobs_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['stuck_ci_jobs_worker']['cron'] ||= '0 * * * *'
Settings.cron_jobs['stuck_ci_jobs_worker']['job_class'] = 'StuckCiJobsWorker'
378
Settings.cron_jobs['pipeline_schedule_worker'] ||= Settingslogic.new({})
379
Settings.cron_jobs['pipeline_schedule_worker']['cron'] ||= '19 * * * *'
380
Settings.cron_jobs['pipeline_schedule_worker']['job_class'] = 'PipelineScheduleWorker'
381
Settings.cron_jobs['expire_build_artifacts_worker'] ||= Settingslogic.new({})
382
Settings.cron_jobs['expire_build_artifacts_worker']['cron'] ||= '50 * * * *'
383
Settings.cron_jobs['expire_build_artifacts_worker']['job_class'] = 'ExpireBuildArtifactsWorker'
384 385
Settings.cron_jobs['repository_check_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['repository_check_worker']['cron'] ||= '20 * * * *'
386
Settings.cron_jobs['repository_check_worker']['job_class'] = 'RepositoryCheck::DispatchWorker'
Jacob Vosmaer's avatar
Jacob Vosmaer committed
387
Settings.cron_jobs['admin_email_worker'] ||= Settingslogic.new({})
388
Settings.cron_jobs['admin_email_worker']['cron'] ||= '0 0 * * 0'
Jacob Vosmaer's avatar
Jacob Vosmaer committed
389
Settings.cron_jobs['admin_email_worker']['job_class'] = 'AdminEmailWorker'
390 391 392
Settings.cron_jobs['repository_archive_cache_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['repository_archive_cache_worker']['cron'] ||= '0 * * * *'
Settings.cron_jobs['repository_archive_cache_worker']['job_class'] = 'RepositoryArchiveCacheWorker'
393 394 395
Settings.cron_jobs['import_export_project_cleanup_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['import_export_project_cleanup_worker']['cron'] ||= '0 * * * *'
Settings.cron_jobs['import_export_project_cleanup_worker']['job_class'] = 'ImportExportProjectCleanupWorker'
396 397 398
Settings.cron_jobs['ci_archive_traces_cron_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['ci_archive_traces_cron_worker']['cron'] ||= '17 * * * *'
Settings.cron_jobs['ci_archive_traces_cron_worker']['job_class'] = 'Ci::ArchiveTracesCronWorker'
399 400 401
Settings.cron_jobs['requests_profiles_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['requests_profiles_worker']['cron'] ||= '0 0 * * *'
Settings.cron_jobs['requests_profiles_worker']['job_class'] = 'RequestsProfilesWorker'
402 403 404
Settings.cron_jobs['remove_expired_members_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['remove_expired_members_worker']['cron'] ||= '10 0 * * *'
Settings.cron_jobs['remove_expired_members_worker']['job_class'] = 'RemoveExpiredMembersWorker'
Douwe Maan's avatar
Douwe Maan committed
405 406 407
Settings.cron_jobs['remove_expired_group_links_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['remove_expired_group_links_worker']['cron'] ||= '10 0 * * *'
Settings.cron_jobs['remove_expired_group_links_worker']['job_class'] = 'RemoveExpiredGroupLinksWorker'
408
Settings.cron_jobs['prune_old_events_worker'] ||= Settingslogic.new({})
409
Settings.cron_jobs['prune_old_events_worker']['cron'] ||= '0 */6 * * *'
410
Settings.cron_jobs['prune_old_events_worker']['job_class'] = 'PruneOldEventsWorker'
411 412 413
Settings.cron_jobs['trending_projects_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['trending_projects_worker']['cron'] = '0 1 * * *'
Settings.cron_jobs['trending_projects_worker']['job_class'] = 'TrendingProjectsWorker'
414 415 416
Settings.cron_jobs['remove_unreferenced_lfs_objects_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['remove_unreferenced_lfs_objects_worker']['cron'] ||= '20 0 * * *'
Settings.cron_jobs['remove_unreferenced_lfs_objects_worker']['job_class'] = 'RemoveUnreferencedLfsObjectsWorker'
417 418 419
Settings.cron_jobs['stuck_import_jobs_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['stuck_import_jobs_worker']['cron'] ||= '15 * * * *'
Settings.cron_jobs['stuck_import_jobs_worker']['job_class'] = 'StuckImportJobsWorker'
420
Settings.cron_jobs['gitlab_usage_ping_worker'] ||= Settingslogic.new({})
421
Settings.cron_jobs['gitlab_usage_ping_worker']['cron'] ||= Settings.__send__(:cron_for_usage_ping)
422
Settings.cron_jobs['gitlab_usage_ping_worker']['job_class'] = 'GitlabUsagePingWorker'
423 424 425
Settings.cron_jobs['stuck_merge_jobs_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['stuck_merge_jobs_worker']['cron'] ||= '0 */2 * * *'
Settings.cron_jobs['stuck_merge_jobs_worker']['job_class'] = 'StuckMergeJobsWorker'
426 427 428
Settings.cron_jobs['pages_domain_verification_cron_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['pages_domain_verification_cron_worker']['cron'] ||= '*/15 * * * *'
Settings.cron_jobs['pages_domain_verification_cron_worker']['job_class'] = 'PagesDomainVerificationCronWorker'
429 430 431
Settings.cron_jobs['pages_domain_removal_cron_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['pages_domain_removal_cron_worker']['cron'] ||= '47 0 * * *'
Settings.cron_jobs['pages_domain_removal_cron_worker']['job_class'] = 'PagesDomainRemovalCronWorker'
432
Settings.cron_jobs['pages_domain_ssl_renewal_cron_worker'] ||= Settingslogic.new({})
433
Settings.cron_jobs['pages_domain_ssl_renewal_cron_worker']['cron'] ||= '*/10 * * * *'
434
Settings.cron_jobs['pages_domain_ssl_renewal_cron_worker']['job_class'] = 'PagesDomainSslRenewalCronWorker'
435 436 437
Settings.cron_jobs['issue_due_scheduler_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['issue_due_scheduler_worker']['cron'] ||= '50 00 * * *'
Settings.cron_jobs['issue_due_scheduler_worker']['job_class'] = 'IssueDueSchedulerWorker'
438 439 440
Settings.cron_jobs['prune_web_hook_logs_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['prune_web_hook_logs_worker']['cron'] ||= '0 */1 * * *'
Settings.cron_jobs['prune_web_hook_logs_worker']['job_class'] = 'PruneWebHookLogsWorker'
441 442 443 444
Settings.cron_jobs['schedule_migrate_external_diffs_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['schedule_migrate_external_diffs_worker']['cron'] ||= '15 * * * *'
Settings.cron_jobs['schedule_migrate_external_diffs_worker']['job_class'] = 'ScheduleMigrateExternalDiffsWorker'

445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486
Gitlab.ee do
  Settings.cron_jobs['clear_shared_runners_minutes_worker'] ||= Settingslogic.new({})
  Settings.cron_jobs['clear_shared_runners_minutes_worker']['cron'] ||= '0 0 1 * *'
  Settings.cron_jobs['clear_shared_runners_minutes_worker']['job_class'] = 'ClearSharedRunnersMinutesWorker'
  Settings.cron_jobs['geo_file_download_dispatch_worker'] ||= Settingslogic.new({})
  Settings.cron_jobs['geo_file_download_dispatch_worker']['cron'] ||= '*/1 * * * *'
  Settings.cron_jobs['geo_file_download_dispatch_worker']['job_class'] ||= 'Geo::FileDownloadDispatchWorker'
  Settings.cron_jobs['geo_metrics_update_worker'] ||= Settingslogic.new({})
  Settings.cron_jobs['geo_metrics_update_worker']['cron'] ||= '*/1 * * * *'
  Settings.cron_jobs['geo_metrics_update_worker']['job_class'] ||= 'Geo::MetricsUpdateWorker'
  Settings.cron_jobs['geo_migrated_local_files_clean_up_worker'] ||= Settingslogic.new({})
  Settings.cron_jobs['geo_migrated_local_files_clean_up_worker']['cron'] ||= '15 */6 * * *'
  Settings.cron_jobs['geo_migrated_local_files_clean_up_worker']['job_class'] ||= 'Geo::MigratedLocalFilesCleanUpWorker'
  Settings.cron_jobs['geo_prune_event_log_worker'] ||= Settingslogic.new({})
  Settings.cron_jobs['geo_prune_event_log_worker']['cron'] ||= '*/5 * * * *'
  Settings.cron_jobs['geo_prune_event_log_worker']['job_class'] ||= 'Geo::PruneEventLogWorker'
  Settings.cron_jobs['geo_repository_sync_worker'] ||= Settingslogic.new({})
  Settings.cron_jobs['geo_repository_sync_worker']['cron'] ||= '*/1 * * * *'
  Settings.cron_jobs['geo_repository_sync_worker']['job_class'] ||= 'Geo::RepositorySyncWorker'
  Settings.cron_jobs['geo_repository_verification_primary_batch_worker'] ||= Settingslogic.new({})
  Settings.cron_jobs['geo_repository_verification_primary_batch_worker']['cron'] ||= '*/1 * * * *'
  Settings.cron_jobs['geo_repository_verification_primary_batch_worker']['job_class'] ||= 'Geo::RepositoryVerification::Primary::BatchWorker'
  Settings.cron_jobs['geo_repository_verification_secondary_scheduler_worker'] ||= Settingslogic.new({})
  Settings.cron_jobs['geo_repository_verification_secondary_scheduler_worker']['cron'] ||= '*/1 * * * *'
  Settings.cron_jobs['geo_repository_verification_secondary_scheduler_worker']['job_class'] ||= 'Geo::RepositoryVerification::Secondary::SchedulerWorker'
  Settings.cron_jobs['historical_data_worker'] ||= Settingslogic.new({})
  Settings.cron_jobs['historical_data_worker']['cron'] ||= '0 12 * * *'
  Settings.cron_jobs['historical_data_worker']['job_class'] = 'HistoricalDataWorker'
  Settings.cron_jobs['ldap_group_sync_worker'] ||= Settingslogic.new({})
  Settings.cron_jobs['ldap_group_sync_worker']['cron'] ||= '0 * * * *'
  Settings.cron_jobs['ldap_group_sync_worker']['job_class'] = 'LdapAllGroupsSyncWorker'
  Settings.cron_jobs['ldap_sync_worker'] ||= Settingslogic.new({})
  Settings.cron_jobs['ldap_sync_worker']['cron'] ||= '30 1 * * *'
  Settings.cron_jobs['ldap_sync_worker']['job_class'] = 'LdapSyncWorker'
  Settings.cron_jobs['pseudonymizer_worker'] ||= Settingslogic.new({})
  Settings.cron_jobs['pseudonymizer_worker']['cron'] ||= '0 23 * * *'
  Settings.cron_jobs['pseudonymizer_worker']['job_class'] ||= 'PseudonymizerWorker'
  Settings.cron_jobs['update_max_seats_used_for_gitlab_com_subscriptions_worker'] ||= Settingslogic.new({})
  Settings.cron_jobs['update_max_seats_used_for_gitlab_com_subscriptions_worker']['cron'] ||= '0 12 * * *'
  Settings.cron_jobs['update_max_seats_used_for_gitlab_com_subscriptions_worker']['job_class'] = 'UpdateMaxSeatsUsedForGitlabComSubscriptionsWorker'
end

487 488 489 490 491 492
#
# Sidekiq
#
Settings['sidekiq'] ||= Settingslogic.new({})
Settings['sidekiq']['log_format'] ||= 'default'

493 494 495 496
#
# GitLab Shell
#
Settings['gitlab_shell'] ||= Settingslogic.new({})
497
Settings.gitlab_shell['path']           = Settings.absolute(Settings.gitlab_shell['path'] || Settings.gitlab['user_home'] + '/gitlab-shell/')
498
Settings.gitlab_shell['hooks_path']     = :deprecated_use_gitlab_shell_path_instead
499
Settings.gitlab_shell['authorized_keys_file'] ||= nil
500
Settings.gitlab_shell['secret_file'] ||= Rails.root.join('.gitlab_shell_secret')
501 502
Settings.gitlab_shell['receive_pack']   = true if Settings.gitlab_shell['receive_pack'].nil?
Settings.gitlab_shell['upload_pack']    = true if Settings.gitlab_shell['upload_pack'].nil?
503
Settings.gitlab_shell['ssh_host']     ||= Settings.gitlab.ssh_host
504 505 506
Settings.gitlab_shell['ssh_port']     ||= 22
Settings.gitlab_shell['ssh_user']     ||= Settings.gitlab.user
Settings.gitlab_shell['owner_group']  ||= Settings.gitlab.user
507
Settings.gitlab_shell['ssh_path_prefix'] ||= Settings.__send__(:build_gitlab_shell_ssh_path_prefix)
508
Settings.gitlab_shell['git_timeout'] ||= 10800
509

510 511 512 513 514 515
#
# Workhorse
#
Settings['workhorse'] ||= Settingslogic.new({})
Settings.workhorse['secret_file'] ||= Rails.root.join('.gitlab_workhorse_secret')

516 517 518 519 520
#
# Repositories
#
Settings['repositories'] ||= Settingslogic.new({})
Settings.repositories['storages'] ||= {}
521 522 523 524 525 526 527
unless Settings.repositories.storages['default']
  Settings.repositories.storages['default'] ||= {}
  # We set the path only if the default storage doesn't exist, in case it exists
  # but follows the pre-9.0 configuration structure. `6_validations.rb` initializer
  # will validate all storages and throw a relevant error to the user if necessary.
  Settings.repositories.storages['default']['path'] ||= Settings.gitlab['user_home'] + '/repositories/'
end
528

529
Settings.repositories.storages.each do |key, storage|
530
  Settings.repositories.storages[key] = Gitlab::GitalyClient::StorageSettings.new(storage)
531 532
end

533 534 535 536 537 538 539
#
# The repository_downloads_path is used to remove outdated repository
# archives, if someone has it configured incorrectly, and it points
# to the path where repositories are stored this can cause some
# data-integrity issue. In this case, we sets it to the default
# repository_downloads_path value.
#
540
repositories_storages          = Settings.repositories.storages.values
541
repository_downloads_path      = Settings.gitlab['repository_downloads_path'].to_s.gsub(%r{/$}, '')
542 543
repository_downloads_full_path = File.expand_path(repository_downloads_path, Settings.gitlab['user_home'])

544
# Gitaly migration: https://gitlab.com/gitlab-org/gitaly/issues/1255
545 546 547 548
Gitlab::GitalyClient::StorageSettings.allow_disk_access do
  if repository_downloads_path.blank? || repositories_storages.any? { |rs| [repository_downloads_path, repository_downloads_full_path].include?(rs.legacy_disk_path.gsub(%r{/$}, '')) }
    Settings.gitlab['repository_downloads_path'] = File.join(Settings.shared['path'], 'cache/archive')
  end
549 550
end

551 552 553
#
# Backup
#
554
Settings['backup'] ||= Settingslogic.new({})
555
Settings.backup['keep_time']  ||= 0
556
Settings.backup['pg_schema']    = nil
557
Settings.backup['path']         = Settings.absolute(Settings.backup['path'] || "tmp/backups/")
558
Settings.backup['archive_permissions'] ||= 0600
559
Settings.backup['upload'] ||= Settingslogic.new({ 'remote_directory' => nil, 'connection' => nil })
560
Settings.backup['upload']['multipart_chunk_size'] ||= 104857600
561
Settings.backup['upload']['encryption'] ||= nil
562
Settings.backup['upload']['encryption_key'] ||= ENV['GITLAB_BACKUP_ENCRYPTION_KEY']
563
Settings.backup['upload']['storage_class'] ||= nil
564

565 566 567 568 569 570 571 572 573 574
#
# Pseudonymizer
#
Gitlab.ee do
  Settings['pseudonymizer'] ||= Settingslogic.new({})
  Settings.pseudonymizer['manifest'] = Settings.absolute(Settings.pseudonymizer['manifest'] || Rails.root.join("config/pseudonymizer.yml"))
  Settings.pseudonymizer['upload'] ||= Settingslogic.new({ 'remote_directory' => nil, 'connection' => nil })
  # Settings.pseudonymizer['upload']['multipart_chunk_size'] ||= 104857600
end

575 576 577
#
# Git
#
578
Settings['git'] ||= Settingslogic.new({})
579
Settings.git['bin_path'] ||= '/usr/bin/git'
580

581 582 583
# Important: keep the satellites.path setting until GitLab 9.0 at
# least. This setting is fed to 'rm -rf' in
# db/migrate/20151023144219_remove_satellites.rb
584
Settings['satellites'] ||= Settingslogic.new({})
585
Settings.satellites['path'] = Settings.absolute(Settings.satellites['path'] || "tmp/repo_satellites/")
586

587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603
#
# Kerberos
#
Gitlab.ee do
  Settings['kerberos'] ||= Settingslogic.new({})
  Settings.kerberos['enabled'] = false if Settings.kerberos['enabled'].nil?
  Settings.kerberos['keytab'] = nil if Settings.kerberos['keytab'].blank? # nil means use default keytab
  Settings.kerberos['service_principal_name'] = nil if Settings.kerberos['service_principal_name'].blank? # nil means any SPN in keytab
  Settings.kerberos['use_dedicated_port'] = false if Settings.kerberos['use_dedicated_port'].nil?
  Settings.kerberos['https'] = Settings.gitlab.https if Settings.kerberos['https'].nil?
  Settings.kerberos['port'] ||= Settings.kerberos.https ? 8443 : 8088

  if Settings.kerberos['enabled'] && !Settings.omniauth.providers.map(&:name).include?('kerberos_spnego')
    Settings.omniauth.providers << Settingslogic.new({ 'name' => 'kerberos_spnego' })
  end
end

604 605 606 607
#
# Extra customization
#
Settings['extra'] ||= Settingslogic.new({})
608

609 610 611 612 613
#
# Rack::Attack settings
#
Settings['rack_attack'] ||= Settingslogic.new({})
Settings.rack_attack['git_basic_auth'] ||= Settingslogic.new({})
614
Settings.rack_attack.git_basic_auth['enabled'] = false if Settings.rack_attack.git_basic_auth['enabled'].nil?
615
Settings.rack_attack.git_basic_auth['ip_whitelist'] ||= %w{127.0.0.1}
616 617 618 619
Settings.rack_attack.git_basic_auth['maxretry'] ||= 10
Settings.rack_attack.git_basic_auth['findtime'] ||= 1.minute
Settings.rack_attack.git_basic_auth['bantime'] ||= 1.hour

620 621 622 623 624
#
# Gitaly
#
Settings['gitaly'] ||= Settingslogic.new({})

625 626 627 628 629 630 631 632 633
#
# Webpack settings
#
Settings['webpack'] ||= Settingslogic.new({})
Settings.webpack['dev_server'] ||= Settingslogic.new({})
Settings.webpack.dev_server['enabled'] ||= false
Settings.webpack.dev_server['host']    ||= 'localhost'
Settings.webpack.dev_server['port']    ||= 3808

634
#
635
# Monitoring settings
636
#
637
Settings['monitoring'] ||= Settingslogic.new({})
638
Settings.monitoring['ip_whitelist'] ||= ['127.0.0.1/8']
639
Settings.monitoring['unicorn_sampler_interval'] ||= 10
Jan Provaznik's avatar
Jan Provaznik committed
640
Settings.monitoring['puma_sampler_interval'] ||= 5
641
Settings.monitoring['ruby_sampler_interval'] ||= 60
642 643 644 645
Settings.monitoring['sidekiq_exporter'] ||= Settingslogic.new({})
Settings.monitoring.sidekiq_exporter['enabled'] ||= false
Settings.monitoring.sidekiq_exporter['address'] ||= 'localhost'
Settings.monitoring.sidekiq_exporter['port'] ||= 3807
646

647 648 649 650 651
#
# Testing settings
#
if Rails.env.test?
  Settings.gitlab['default_projects_limit']   = 42
652
  Settings.gitlab['default_can_create_group'] = true
653
  Settings.gitlab['default_can_create_team']  = false
Robert Speicher's avatar
Robert Speicher committed
654
end