lib/gdk/config.rb (1,167 lines of code) (raw):
# frozen_string_literal: true
require 'cgi'
require 'etc'
require 'uri'
require 'pathname'
module GDK
class Config < ConfigSettings
GDK_ROOT = Pathname.new(__dir__).parent.parent
FILE = File.join(GDK_ROOT, 'gdk.yml')
string(:__platform) { GDK::Machine.platform }
bool(:__supports_precompiled_binaries) { GDK::PackageHelper.supported_os_arch?(GDK::Machine.package_platform) }
path(:__brew_prefix_path) do
if GDK::Machine.macos?
if File.exist?('/opt/homebrew/bin/brew')
'/opt/homebrew'
elsif File.exist?('/usr/local/bin/brew')
'/usr/local'
else
''
end
else
''
end
end
path(:__openssl_bin_path) do
if config.__brew_prefix_path.to_s.empty?
Pathname.new(find_executable!('openssl'))
else
config.__brew_prefix_path.join('opt', 'openssl', 'bin', 'openssl')
end
end
def gdk_root
self.class::GDK_ROOT
end
path(:__data_dir) { gdk_root.join('data') }
path(:__cache_dir) { gdk_root.join('.cache') }
integer(:restrict_cpu_count) { Etc.nprocessors }
hash_setting(:env, merge: true) do
{
'RAILS_ENV' => 'development',
'CUSTOMER_PORTAL_URL' => config.license.customer_portal_url,
'GITLAB_LICENSE_MODE' => config.license.license_mode
}.tap do |env|
if config.tracer.jaeger?
env.merge!(
'GITLAB_TRACING' => config.tracer.jaeger.__tracer_url,
'GITLAB_TRACING_URL' => config.tracer.jaeger.__search_url
)
end
end
end
settings :common do
string(:ca_path) { '' }
end
settings :gitlab_ai_gateway do
bool(:enabled) { false }
bool(:auto_update) { true }
port(:port, 'gitlab_ai_gateway')
string(:version) { 'main' }
string(:__listen) { "http://#{config.hostname}:#{config.gitlab_ai_gateway.port}" }
string(:__service_command) { 'support/exec-cd gitlab-ai-gateway poetry run ai_gateway' }
end
settings :gitlab_http_router do
bool(:enabled) { true }
bool(:auto_update) { true }
bool(:use_distinct_port) { false }
string(:gitlab_rules_config) { 'session_prefix' }
port(:port, 'gitlab_http_router')
string(:__version) { ConfigHelper.version_from(config, 'GITLAB_HTTP_ROUTER_VERSION') }
end
settings :gitlab_observability_backend do
bool(:enabled) { false }
bool(:auto_update) { true }
end
settings :siphon do
bool(:enabled) { false }
bool(:auto_update) { true }
array(:tables) { %w[namespaces projects] }
end
settings :nats do
bool(:enabled) { config.siphon? }
bool(:auto_update) { true }
end
settings :gitlab_topology_service do
bool(:enabled) { true }
bool(:auto_update) { true }
port(:grpc_port, 'gitlab_topology_service_grpc')
port(:rest_port, 'gitlab_topology_service_rest')
path(:certificate_file) { config.gdk_root.join("gitlab-topology-service/tmp/certs/server-cert.pem") }
path(:key_file) { config.gdk_root.join("gitlab-topology-service/tmp/certs/server-key.pem") }
path(:client_certificate_file) { config.gdk_root.join("gitlab-topology-service/tmp/certs/client-cert.pem") }
string(:__version) { ConfigHelper.version_from(config, 'GITLAB_TOPOLOGY_SERVICE_VERSION') }
end
settings :telemetry do
string(:username) { '' }
bool(:enabled) { false }
string(:environment) { 'native' }
end
settings :repositories do
string(:charts_gitlab) { 'https://gitlab.com/gitlab-org/charts/gitlab.git' }
string(:docs_gitlab_com) { 'https://gitlab.com/gitlab-org/technical-writing/docs-gitlab-com.git' }
string(:gitaly) { 'https://gitlab.com/gitlab-org/gitaly.git' }
string(:gitlab) { 'https://gitlab.com/gitlab-org/gitlab.git' }
string(:gitlab_ai_gateway) { 'https://gitlab.com/gitlab-org/modelops/applied-ml/code-suggestions/ai-assist.git' }
string(:gitlab_http_router) { 'https://gitlab.com/gitlab-org/cells/http-router.git' }
string(:gitlab_elasticsearch_indexer) { 'https://gitlab.com/gitlab-org/gitlab-elasticsearch-indexer.git' }
string(:gitlab_k8s_agent) { 'https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent.git' }
string(:gitlab_operator) { 'https://gitlab.com/gitlab-org/cloud-native/gitlab-operator.git' }
string(:gitlab_pages) { 'https://gitlab.com/gitlab-org/gitlab-pages.git' }
string(:gitlab_shell) { 'https://gitlab.com/gitlab-org/gitlab-shell.git' }
string(:gitlab_topology_service) { 'https://gitlab.com/gitlab-org/cells/topology-service.git' }
string(:gitlab_runner) { 'https://gitlab.com/gitlab-org/gitlab-runner.git' }
string(:gitlab_ui) { 'https://gitlab.com/gitlab-org/gitlab-ui.git' }
string(:gitlab_zoekt_indexer) { 'https://gitlab.com/gitlab-org/gitlab-zoekt-indexer.git' }
string(:omnibus_gitlab) { 'https://gitlab.com/gitlab-org/omnibus-gitlab.git' }
string(:openbao_internal) { 'https://gitlab.com/gitlab-org/govern/secrets-management/openbao-internal.git' }
string(:registry) { 'https://gitlab.com/gitlab-org/container-registry.git' }
string(:gitlab_observability_backend) { 'git@gitlab.com:gitlab-org/opstrace/opstrace.git' }
string(:siphon) { 'https://gitlab.com/gitlab-org/analytics-section/siphon.git' }
string(:duo_workflow_executor) { 'https://gitlab.com/gitlab-org/duo-workflow/duo-workflow-executor.git' }
end
settings :dev do
path(:__go_path) { GDK.root.join('dev') }
path(:__bins) { config.dev.__go_path.join('bin') }
path(:__go_binary) { find_executable!('go') }
bool(:__go_binary_available?) do
!config.dev.__go_binary.nil?
rescue TypeError
false
end
settings(:checkmake) do
string(:version) { '8915bd4' }
path(:__binary) { config.dev.__bins.join('checkmake') }
path(:__versioned_binary) { config.dev.__bins.join("checkmake_#{config.dev.checkmake.version}") }
end
end
array(:git_repositories) do
# This list in not exhaustive yet, as some git repositories are based on
# a fake GOPATH inside a projects sub directory
["/", "gitlab"].map { |d| File.join(gdk_root, d) }.select { |d| Dir.exist?(d) }
end
settings :gdk do
bool(:ask_to_restart_after_update) { true }
bool(:debug) { false }
bool(:__debug) { ENV.fetch('GDK_DEBUG', 'false') == 'true' || config.gdk.debug? }
integer(:runit_wait_secs) { 20 }
bool(:auto_reconfigure) { true }
bool(:auto_rebase_projects) { false }
bool(:use_bash_shim) { false }
bool(:overwrite_changes) { false }
bool(:system_packages_opt_out) { false }
bool(:rubygems_update_opt_out) { false }
bool(:preflight_checks_opt_out) { false }
array(:protected_config_files) { [] }
settings :start_hooks do
array(:before) { [] }
array(:after) { [] }
end
settings :stop_hooks do
array(:before) { [] }
array(:after) { [] }
end
settings :update_hooks do
array(:before, merge: true) { ['support/exec-cd gitlab bin/spring stop || true'] }
array(:after) { [] }
end
end
path(:repositories_root) { config.gdk_root.join('repositories') }
path(:repository_storages) { config.gdk_root.join('repository_storages') }
string(:listen_address) { '127.0.0.1' }
string(:hostname) { config.listen_address }
port(:port, 'gdk')
integer(:port_offset) { 0 }
settings :https do
bool(:enabled) { false }
end
string(:relative_url_root) { '' }
anything :__uri do
# Only include the port if it's 'non standard'
klass = config.https? ? URI::HTTPS : URI::HTTP
relative_url_root = config.relative_url_root.gsub(%r{/+$}, '')
klass.build(host: config.hostname, port: config.port, path: relative_url_root)
end
string(:username) { Etc.getpwuid.name }
string(:__whoami) { Etc.getpwuid.name }
settings :license do
string(:customer_portal_url) { 'https://customers.staging.gitlab.com' }
string(:license_mode) { 'test' }
end
settings :load_balancing do
bool(:enabled) { false }
settings :discover do
bool(:enabled) { false }
end
end
settings :vite do
bool(:enabled) { false }
settings :https do
bool(:enabled) { config.https.enabled }
end
port(:port, 'vite')
bool(:hot_module_reloading) { true }
integer(:vue_version) { 2 }
end
settings :webpack do
bool(:enabled) { true }
string(:host) { config.gitlab.rails.hostname }
port(:port, 'webpack')
string(:public_address) { "" }
bool(:static) { false }
bool(:vendor_dll) { false }
bool(:incremental) { true }
integer(:incremental_ttl) { 30 }
bool(:sourcemaps) { true }
bool(:live_reload) { true }
array(:allowed_hosts) { config.gitlab.rails.allowed_hosts }
integer(:vue_version) { 2 }
bool(:__set_vue_version) do
config.webpack.vue_version == 3
end
string(:__dev_server_public) do
if !config.webpack.live_reload
""
elsif !config.webpack.public_address.empty?
config.webpack.public_address
elsif config.nginx?
# webpack behind nginx
if config.https?
"wss://#{config.nginx.__listen_address}/_hmr/"
else
"ws://#{config.nginx.__listen_address}/_hmr/"
end
else
""
end
end
end
settings :action_cable do
integer(:worker_pool_size) { 4 }
end
settings :workhorse do
bool(:enabled) { true }
bool(:skip_compile) { config.__supports_precompiled_binaries }
bool(:skip_setup) { false }
port(:configured_port, 'workhorse')
integer(:ci_long_polling_seconds) { 0 }
settings :__listen_settings do
string(:__type) do
if config.gitlab.rails.address.empty?
'authSocket'
else
'authBackend'
end
end
string(:__address) do
config.gitlab.rails.__workhorse_url
end
end
string(:__active_host) { config.hostname }
integer :__active_port do
if config.gitlab_http_router? || config.nginx?
config.workhorse.configured_port
else
# Workhorse is the user-facing entry point whenever neither nginx nor
# AutoDevOps is used, so in that situation use the configured GDK port.
config.port
end
end
string :__listen_address do
"#{config.workhorse.__active_host}:#{config.workhorse.__active_port}"
end
string :__command_line_listen_addr do
if config.https?
"#{config.hostname}:0"
else
config.workhorse.__listen_address
end
end
end
settings :gitlab_shell do
bool(:skip_compile) { config.__supports_precompiled_binaries }
bool(:skip_setup) { false }
bool(:auto_update) { true }
path(:dir) { config.gdk_root.join('gitlab-shell') }
settings :lfs do
# https://gitlab.com/groups/gitlab-org/-/epics/11872
bool(:pure_ssh_protocol_enabled) { false }
end
settings :pat do
bool(:enabled) { true }
array(:allowed_scopes) { [] }
end
string(:__version) { ConfigHelper.version_from(config, 'gitlab/GITLAB_SHELL_VERSION') }
end
settings :gitlab_ui do
bool(:enabled) { false }
bool(:auto_update) { true }
end
settings :rails_web do
bool(:enabled) { true }
end
settings :docs_gitlab_com do
bool(:enabled) { false }
bool(:auto_update) { true }
port(:port, 'docs_gitlab_com')
end
settings :snowplow_micro do
bool(:enabled) { false }
port(:port, 'snowplow_micro')
string(:image) { 'snowplow/snowplow-micro:latest' }
end
settings :gitlab_runner do
bool(:enabled) { false }
bool(:auto_update) { true }
end
settings :omnibus_gitlab do
bool(:enabled) { false }
bool(:auto_update) { true }
end
settings :charts_gitlab do
bool(:enabled) { false }
bool(:auto_update) { true }
end
settings :gitlab_operator do
bool(:enabled) { false }
bool(:auto_update) { true }
end
settings :gitlab_elasticsearch_indexer do
bool(:auto_update) { true }
path(:__dir) { config.gdk_root.join('gitlab-elasticsearch-indexer') }
string(:__version) { ConfigHelper.version_from(config, 'gitlab/GITLAB_ELASTICSEARCH_INDEXER_VERSION') }
end
settings :registry do
path(:dir) { config.gdk_root.join('container-registry') }
bool(:auto_update) { true }
bool(:enabled) { false }
string(:host) { config.hostname }
string(:listen_address) { config.listen_address }
string(:api_host) { config.hostname }
path(:__registry_build_bin_path) { config.registry.dir.join('bin/registry') }
port(:port, 'registry')
string(:__listen) { "#{host}:#{port}" }
bool(:self_signed) { false }
bool(:auth_enabled) { true }
bool(:compatibility_schema1_enabled) { false }
bool(:notifications_enabled) { false }
bool(:read_only_maintenance_enabled) { false }
settings(:database) do
bool(:enabled) { false }
string(:host) { config.geo.secondary? ? config.postgresql.geo.host : config.postgresql.host }
integer(:port) { config.geo.secondary? ? config.postgresql.geo.port : config.postgresql.port }
string(:dbname) { 'registry_dev' }
string(:sslmode) { 'disable' }
end
string(:version) { 'v4.14.0-gitlab' }
end
settings :object_store do
bool(:consolidated_form) { false }
bool(:enabled) { false }
string(:host) { config.listen_address }
port(:port, 'object_store')
port(:console_port, 'object_store_console')
string(:backup_remote_directory) { '' }
hash_setting(:connection) do
{
'provider' => 'AWS',
'aws_access_key_id' => 'minio',
'aws_secret_access_key' => 'gdk-minio',
'region' => 'gdk',
'endpoint' => "http://#{config.object_store.host}:#{config.object_store.port}",
'path_style' => true
}
end
hash_setting(:objects) do
{
'artifacts' => { 'bucket' => 'artifacts' },
'backups' => { 'bucket' => 'backups' },
'external_diffs' => { 'bucket' => 'external-diffs' },
'lfs' => { 'bucket' => 'lfs-objects' },
'uploads' => { 'bucket' => 'uploads' },
'packages' => { 'bucket' => 'packages' },
'dependency_proxy' => { 'bucket' => 'dependency-proxy' },
'terraform_state' => { 'bucket' => 'terraform' },
'pages' => { 'bucket' => 'pages' },
'ci_secure_files' => { 'bucket' => 'ci-secure-files' },
'gitaly_backups' => { 'bucket' => 'gitaly-backups' }
}
end
end
settings :gitlab_pages do
bool(:enabled) { false }
string(:host) { "#{config.listen_address}.nip.io" }
port(:port, 'gitlab_pages')
string(:__uri) { "#{config.gitlab_pages.host}:#{config.gitlab_pages.port}" }
bool(:auto_update) { true }
string(:secret_file) { config.gdk_root.join('gitlab-pages-secret') }
bool(:verbose) { false }
bool(:propagate_correlation_id) { false }
bool(:access_control) { false }
string(:auth_client_id) { '' }
string(:auth_client_secret) { '' }
bool(:enable_custom_domains) { false }
string(:auth_scope) { 'api' }
# random 32-byte string
string(:__auth_secret) { SecureRandom.alphanumeric(32) }
string(:__auth_redirect_uri) { "http://#{config.gitlab_pages.__uri}/auth" }
string(:__version) { ConfigHelper.version_from(config, 'gitlab/GITLAB_PAGES_VERSION') }
end
settings :gitlab_k8s_agent do
bool(:enabled) { false }
bool(:auto_update) { true }
string(:__version) { ConfigHelper.version_from(config, 'gitlab/GITLAB_KAS_VERSION') }
bool(:configure_only) { false }
string(:agent_listen_network) { 'tcp' }
string(:agent_listen_address) { "#{config.listen_address}:8150" }
string(:__agent_listen_url_path) { '/-/kubernetes-agent' }
bool(:__agent_listen_websocket) do
config.nginx?
end
string(:__url_for_agentk) do
if config.nginx?
# kas is behind nginx
if config.https?
"wss://#{config.nginx.__listen_address}#{config.gitlab_k8s_agent.__agent_listen_url_path}"
else
"ws://#{config.nginx.__listen_address}#{config.gitlab_k8s_agent.__agent_listen_url_path}"
end
elsif config.gitlab_k8s_agent.agent_listen_network == 'tcp'
"grpc://#{config.gitlab_k8s_agent.agent_listen_address}"
else
raise UnsupportedConfiguration, "Unsupported listen network #{config.gitlab_k8s_agent.agent_listen_network}"
end
end
bool(:run_from_source) { false }
string(:__command) do
if config.gitlab_k8s_agent.run_from_source?
'support/exec-cd gitlab-k8s-agent go run -race cmd/kas/main.go'
else
'gitlab-k8s-agent/build/gdk/bin/kas_race'
end
end
string(:private_api_listen_network) { 'tcp' }
string(:private_api_listen_address) { "#{config.listen_address}:8155" }
string(:__private_api_secret_file) { config.gitlab_k8s_agent.__secret_file }
string(:__private_api_url) { "grpc://#{config.gitlab_k8s_agent.private_api_listen_address}" }
string(:k8s_api_listen_network) { 'tcp' }
string(:k8s_api_listen_address) { "#{config.listen_address}:8154" }
string(:__k8s_api_listen_url_path) { '/-/k8s-proxy/' }
string(:__k8s_api_url) do
if config.nginx?
# kas is behind nginx
if config.https?
"https://#{config.nginx.__listen_address}#{config.gitlab_k8s_agent.__k8s_api_listen_url_path}"
else
"http://#{config.nginx.__listen_address}#{config.gitlab_k8s_agent.__k8s_api_listen_url_path}"
end
elsif config.gitlab_k8s_agent.k8s_api_listen_network == 'tcp'
"http://#{config.gitlab_k8s_agent.k8s_api_listen_address}"
else
raise UnsupportedConfiguration, "Unsupported listen network #{config.gitlab_k8s_agent.k8s_api_listen_network}"
end
end
string(:internal_api_listen_network) { 'tcp' }
string(:internal_api_listen_address) { "#{config.listen_address}:8153" }
string(:__internal_api_url) do
case config.gitlab_k8s_agent.internal_api_listen_network
when 'tcp'
"grpc://#{internal_api_listen_address}"
when 'unix'
"unix://#{internal_api_listen_address}"
else
raise UnsupportedConfiguration, "Unsupported listen network #{config.gitlab_k8s_agent.internal_api_listen_network}"
end
end
string(:__gitlab_address) { "#{config.https? ? 'https' : 'http'}://#{config.workhorse.__listen_address}" }
string(:__gitlab_external_url) do
if config.nginx?
"#{config.https? ? 'https' : 'http'}://#{config.nginx.__listen_address}"
else
config.gitlab_k8s_agent.__gitlab_address
end
end
string(:__config_file) { config.gdk_root.join('gitlab-k8s-agent-config.yml') }
string(:__secret_file) { config.gdk_root.join('gitlab', '.gitlab_kas_secret') }
string(:__websocket_token_secret_file) { config.gdk_root.join('gitlab-kas-websocket-token-secret') }
string(:otlp_endpoint) { '' }
string(:otlp_ca_certificate_file) { '' }
string(:otlp_token_secret_file) { '' }
settings :autoflow do
bool(:enabled) { false }
settings :__http_client do
array(:allowed_ips) do
[
config.listen_address
]
end
array(:allowed_ports) do
[
80,
443,
config.port
]
end
end
settings :temporal do
# localhost:7233 is the default host:port for the Temporal dev server.
string(:host_port) { 'localhost:7233' }
# "default" is the default namespace of the Temporal dev server.
string(:namespace) { 'default' }
# The following settings are for Temporal Cloud mTLS authentication.
bool(:enable_tls) { false }
string(:certificate_file) { '' }
string(:key_file) { '' }
settings :workflow_data_encryption do
bool(:enabled) { false }
string(:__secret_key_file) { config.gdk_root.join('gitlab-kas-autoflow-temporal-workflow-data-encryption-secret') }
settings :codec_server do
string(:nginx_url_path) { '/-/autoflow/codec-server/' }
settings :listen do
string(:network) { 'tcp' }
string(:address) { "#{config.listen_address}:8142" }
end
string(:temporal_web_ui_url) { 'https://cloud.temporal.io' }
string(:temporal_oidc_url) { 'https://login.tmprl.cloud/.well-known/openid-configuration' }
array(:authorized_user_emails) { [] }
end
end
end
end
end
settings :omniauth do
settings :gitlab do
bool(:enabled) { false }
string(:app_id) { '' }
string(:app_secret) { '' }
string(:scope) { 'read_user' }
end
settings :google_oauth2 do
bool(:enabled) { false }
string(:client_id) { '' }
string(:client_secret) { '' }
end
settings :github do
bool(:enabled) { false }
string(:client_id) { '' }
string(:client_secret) { '' }
end
settings :group_saml do
bool(:enabled) { false }
end
settings :openid_connect do
bool(:enabled) { false }
# See https://docs.gitlab.com/ee/administration/auth/oidc.html for more detail
hash_setting(:args) { {} }
end
end
settings :pgvector do
bool(:enabled) { false }
string(:repo) { 'https://github.com/pgvector/pgvector.git' }
string(:version) { 'v0.7.2' }
bool(:auto_update) { false }
end
settings :geo do
bool(:enabled) { false }
bool(:secondary) { false }
string(:node_name) { config.gdk_root.basename.to_s }
settings :registry_replication do
bool(:enabled) { false }
string(:primary_api_url) { 'http://localhost:5100' }
end
settings :experimental do
bool(:allow_secondary_tests_in_primary) { false }
end
end
settings :cells do
bool(:enabled) { false }
# Ensure that old/non-synced cells GDKs still work as expected
# See https://gitlab.com/gitlab-org/gitlab-development-kit/-/issues/2309
integer(:port_offset) { config.port_offset }
integer(:instance_count) { 0 }
integer(:__global_sequence_range) { CellManager::DEFAULT_SEQUENCE_RANGE }
settings_array :instances, size: -> { config.cells.instance_count } do |i|
integer(:id) { i + 1 + CellManager::LEGACY_CELL_ID }
array(:__sequence_range) do
[
1 + ((i + 1) * parent.parent.__global_sequence_range),
(i + 2) * parent.parent.__global_sequence_range
]
end
string(:gitlab_repo) { "git@gitlab.com:gitlab-org/gitlab.git" }
hash_setting(:config, merge: true) do
main_config = parent.config
{
'cells' => { 'enabled' => false },
'gitlab_http_router' => { 'enabled' => false },
# We cannot have multiple `gitlab_topology_service` services.
'gitlab_topology_service' => { 'enabled' => false },
'gitlab' => {
'cell' => {
'id' => id,
'database' => {
'skip_sequence_alteration' => false
}
},
# Enable client and use main cell's defaults
'topology_service' => {
'enabled' => main_config.gitlab.topology_service.enabled,
'address' => main_config.gitlab.topology_service.address,
'ca_file' => main_config.gitlab.topology_service.ca_file.to_s,
'certificate_file' => main_config.gitlab.topology_service.certificate_file.to_s,
'private_key_file' => main_config.gitlab.topology_service.private_key_file.to_s
},
'rails' => {
'hostname' => main_config.hostname,
'port' => main_config.port,
'session_store' => {
'session_cookie_token_prefix' => "cell-#{id}"
}
}
}
}
end
end
# postgresql_clusterwide setting is now deprecated
settings :postgresql_clusterwide do
string(:host) { config.postgresql.host }
# This deliberately shares a port for postgresql
port(:port, 'postgresql') { config.postgresql.port }
end
end
settings :elasticsearch do
bool(:enabled) { false }
string(:version) { '8.17.4' }
string(:__architecture) do
case GDK::Machine.architecture
when 'arm64'
'aarch64'
when 'amd64'
'x86_64'
else
GDK::Machine.architecture
end
end
end
settings :zoekt do
bool(:enabled) { false }
bool(:auto_update) { true }
port(:web_port_test, 'gitlab-zoekt-webserver-test')
port(:web_port_dev_1, 'gitlab-zoekt-webserver-development-1')
port(:web_port_dev_2, 'gitlab-zoekt-webserver-development-2')
port(:index_port_test, 'gitlab-zoekt-indexer-test')
port(:index_port_dev_1, 'gitlab-zoekt-indexer-development-1')
port(:index_port_dev_2, 'gitlab-zoekt-indexer-development-2')
string(:indexer_version) { 'main' }
end
settings :duo_workflow do
bool(:enabled) { false }
bool(:auto_update) { true }
port(:port, 'duo-workflow-service')
bool(:llm_cache) { false }
bool(:debug) { true }
string(:__executor_version) { ConfigHelper.version_from(config, 'gitlab/DUO_WORKFLOW_EXECUTOR_VERSION') }
# We build the executor for linux amd64 by default as we run
# this in docker and assume you will be using linux amd64 docker
# images. This means it may not run directly on your host.
string(:executor_build_os) { 'linux' }
string(:executor_build_arch) { 'amd64' }
string(:executor_binary_url) { "http://#{config.hostname}:#{config.port}/assets/duo-workflow-executor.tar.gz" }
end
settings :tracer do
string(:build_tags) { 'tracer_static tracer_static_jaeger' }
settings :jaeger do
bool(:enabled) { false }
string(:version) { '1.21.0' }
string(:listen_address) { config.hostname }
string(:__tracer_url) do
http_endpoint = "http://#{config.tracer.jaeger.listen_address}:14268/api/traces"
"opentracing://jaeger?http_endpoint=#{CGI.escape(http_endpoint)}&sampler=const&sampler_param=1"
end
string(:__search_url) do
tags = CGI.escape('{"correlation_id":"__CID__"}').gsub('__CID__', '{{ correlation_id }}')
"http://#{config.tracer.jaeger.listen_address}:16686/search?service={{ service }}&tags=#{tags}"
end
end
end
settings :nginx do
bool(:enabled) { false }
string(:listen_address) { config.hostname }
string(:bin) { find_executable!('nginx') || '/usr/local/bin/nginx' }
settings :ssl do
string(:certificate) { 'localhost.crt' }
string(:key) { 'localhost.key' }
end
settings :http do
bool(:enabled) { false }
port(:port, 'nginx')
end
settings :http2 do
bool(:enabled) { false }
end
integer(:__port) { config.gitlab_http_router? ? http.port : config.port }
string(:__listen_address) do
"#{listen_address}:#{__port}"
end
array(:__request_buffering_off_routes) do
[
'/api/v\d/jobs/\d+/artifacts$',
'\.git/git-receive-pack$',
'\.git/ssh-upload-pack$',
'\.git/ssh-receive-pack$',
'\.git/gitlab-lfs/objects',
'\.git/info/lfs/objects/batch$'
]
end
settings(:sendfile) do
bool(:enabled) { !GDK::Machine.macos? }
end
end
settings :postgresql do
bool(:enabled) { true }
port(:port, 'postgresql')
path(:bin_dir) { GDK::PostgresqlUpgrader.new.bin_path_or_fallback || '/usr/local/bin' }
path(:bin) { config.postgresql.bin_dir.join('postgres') }
string(:replication_user) { 'gitlab_replication' }
path(:dir) { config.gdk_root.join('postgresql') }
path(:data_dir) { config.postgresql.dir.join('data') }
string(:host) { config.postgresql.dir.to_s }
string(:active_version) { GDK::Postgresql.target_version.to_s }
string(:__active_host) { GDK::Postgresql.new.use_tcp? ? config.postgresql.host : '' }
integer(:max_connections) { 100 }
# Kept for backward compatibility. Use replica:root_directory instead
path(:replica_dir) { config.gdk_root.join('postgresql-replica') }
# Kept for backward compatibility. Use replica:data_directory instead
path(:replica_data_dir) { config.postgresql.replica_dir.join('data') }
settings :replica do
bool(:enabled) { false }
path(:root_directory) { config.postgresql.replica_dir } # fallback to config.postgresql.replica_dir for backward compatibility
path(:data_directory) { config.postgresql.replica_data_dir } # fallback to config.postgresql.replica_data_dir for backward compatibility
string(:host) { root_directory.to_s }
port(:port1, 'pgbouncer_replica-1')
port(:port2, 'pgbouncer_replica-2')
end
settings :replica_2 do
bool(:enabled) { false }
path(:root_directory) { config.gdk_root.join('postgresql-replica-2') }
path(:data_directory) { root_directory.join('data') }
string(:host) { root_directory.to_s }
port(:port1, 'pgbouncer_replica-2-1')
port(:port2, 'pgbouncer_replica-2-2')
end
settings :multiple_replicas do
bool(:enabled) { false }
end
settings :geo do
port(:port, 'postgresql_geo')
path(:dir) { config.gdk_root.join('postgresql-geo') }
string(:host) { config.postgresql.geo.dir.to_s }
string(:__active_host) { GDK::PostgresqlGeo.new.use_tcp? ? config.postgresql.geo.host : '' }
end
end
settings :pgbouncer_replicas do
bool(:enabled) { false }
end
settings :clickhouse do
bool(:enabled) { false }
path(:bin) { find_executable!('clickhouse') || '/usr/bin/clickhouse' }
path(:dir) { config.gdk_root.join('clickhouse') }
path(:data_dir) { config.clickhouse.dir.join('data') }
path(:log_dir) { config.gdk_root.join('log', 'clickhouse') }
string(:log_level) { 'trace' }
port(:http_port, 'clickhouse_http')
port(:tcp_port, 'clickhouse_tcp')
port(:interserver_http_port, 'clickhouse_interserver')
integer(:max_memory_usage) { 1000 * 1000 * 1000 } # 1 GB
integer(:max_thread_pool_size) { 1000 }
integer(:max_server_memory_usage) { 2 * 1000 * 1000 * 1000 } # 2 GB
end
settings :gitaly do
bool(:skip_compile) { config.__supports_precompiled_binaries }
bool(:skip_setup) { false }
path(:dir) { config.gdk_root.join('gitaly') }
bool(:enabled) { !config.praefect? || storage_count > 1 }
path(:address) { config.gdk_root.join('gitaly.socket') }
path(:assembly_dir) { config.gitaly.dir.join('assembly') }
path(:config_file) { config.gitaly.dir.join('gitaly.config.toml') }
path(:log_dir) { config.gdk_root.join('log', 'gitaly') }
path(:storage_dir) { config.repositories_root }
path(:repository_storages) { config.repository_storages }
path(:runtime_dir) { config.gdk_root.join('tmp') }
string(:auth_token) { '' }
bool(:auto_update) { true }
bool(:enable_all_feature_flags) { false }
integer(:storage_count) { 1 }
path(:__build_path) { config.gitaly.dir.join('_build') }
path(:__build_bin_path) { config.gitaly.__build_path.join('bin') }
path(:__build_bin_backup_path) { config.gitaly.__build_bin_path.join('gitaly-backup') }
path(:__gitaly_build_bin_path) { config.gitaly.__build_bin_path.join('gitaly') }
string(:__version) { ConfigHelper.version_from(config, 'gitlab/GITALY_SERVER_VERSION') }
array(:gitconfig) { [] }
settings_array :__storages, size: -> { storage_count } do |i|
string(:name) { i.zero? ? 'default' : "gitaly-#{i}" }
path(:path) do
if i.zero?
parent.parent.storage_dir
else
File.join(config.repository_storages, 'gitaly', name)
end
end
end
settings :backup do
bool(:enabled) { config.object_store? }
string(:go_cloud_url) do
bucket = config.object_store.objects['gitaly_backups']['bucket']
connection = config.object_store.connection
case connection['provider']
when 'AWS'
disable_ssl = connection['endpoint'].to_s.start_with?('http://')
path_style = !!connection['path_style']
region_endpoint = connection.slice('region', 'endpoint')
other_params = "&#{URI.encode_www_form(region_endpoint)}" unless region_endpoint.empty?
"s3://#{bucket}?awssdk=v2&disable_https=#{disable_ssl}&use_path_style=#{path_style}#{other_params}"
when 'AzureRM'
storage_account = connection['azure_storage_account_name']
"azblob://#{bucket}?storage_account=#{storage_account}"
when 'Google'
"gs://#{bucket}"
end
end
end
settings :transactions do
bool(:enabled) { false }
end
hash_setting :env do
{
'AWS_ACCESS_KEY_ID' => 'minio',
'AWS_SECRET_ACCESS_KEY' => 'gdk-minio'
}
end
end
settings :praefect do
path(:address) { config.gdk_root.join('praefect.socket') }
path(:config_file) { config.gitaly.dir.join('praefect.config.toml') }
bool(:enabled) { true }
path(:__praefect_build_bin_path) { config.gitaly.__build_bin_path.join('praefect') }
settings :database do
string(:host) { config.geo.secondary? ? config.postgresql.geo.host : config.postgresql.host }
integer(:port) { config.geo.secondary? ? config.postgresql.geo.port : config.postgresql.port }
string(:dbname) { 'praefect_development' }
string(:sslmode) { 'disable' }
end
integer(:node_count) { 1 }
settings_array :__nodes, size: -> { config.praefect.node_count } do |i|
path(:address) { config.gdk_root.join("gitaly-praefect-#{i}.socket") }
string(:config_file) { "gitaly/gitaly-#{i}.praefect.toml" }
path(:log_dir) { config.gdk_root.join('log', "praefect-gitaly-#{i}") }
string(:service_name) { "praefect-gitaly-#{i}" }
string(:storage) { "praefect-internal-#{i}" }
path(:storage_dir) { config.repositories_root }
path(:repository_storages) { config.repository_storages }
path(:runtime_dir) { config.gdk_root.join('tmp') }
array(:gitconfig) { [] }
settings_array :__storages, size: 1 do |j|
string(:name) { parent.parent.storage }
path(:path) { i.zero? && j.zero? ? parent.parent.storage_dir : File.join(parent.parent.repository_storages, parent.parent.service_name, name) }
end
end
end
settings :sshd do
string(:__log_file) do
if config.sshd.use_gitlab_sshd?
"/dev/stdout"
else
"#{config.gitlab_shell.dir}/gitlab-shell.log"
end
end
string(:__listen) do
host = config.sshd.listen_address
host = "[#{host}]" if host.include?(':')
"#{host}:#{config.sshd.listen_port}"
end
bool(:enabled) { true }
bool(:use_gitlab_sshd) { true }
string(:listen_address) { config.hostname }
port(:listen_port, 'sshd')
string(:user) do
if config.sshd.use_gitlab_sshd?
'git'
else
config.username
end
end
anything(:host_key) { '' } # kept for backward compatibility in case the user did set this
array(:host_key_algorithms) { %w[rsa ed25519] }
array(:host_keys) do
host_key_algorithms.map { |algorithm| config.gdk_root.join('openssh', "ssh_host_#{algorithm}_key").to_s }
.append(host_key)
.reject(&:empty?).uniq
end
# gitlab-sshd only
bool(:proxy_protocol) { false }
string(:web_listen) do
if config.prometheus?
"#{config.listen_address}:#{config.prometheus.gitlab_shell_exporter_port}"
else
""
end
end
# OpenSSH only
path(:bin) { find_executable!('sshd') || '/usr/local/sbin/sshd' }
string(:additional_config) { '' }
path(:authorized_keys_file) { config.gdk_root.join('.ssh', 'authorized_keys') }
end
settings :git do
path(:bin) { find_executable!('git') || '/usr/local/bin/git' }
end
settings :runner do
path(:config_file) { config.gdk_root.join('gitlab-runner-config.toml') }
bool(:enabled) { false }
integer(:concurrent) { 1 }
string(:install_mode) { "binary" }
string(:executor) { "docker" }
array(:extra_hosts) { [] }
string(:token) { 'DEFAULT TOKEN: Register your runner to get a valid token' }
string(:image) { "gitlab/gitlab-runner:latest" }
string(:docker_pull) { 'always' }
string(:pull_policy) { "if-not-present" }
string(:docker_host) { "" }
path(:bin) { find_executable!('gitlab-runner') || '/usr/local/bin/gitlab-runner' }
bool(:network_mode_host) { false }
bool(:__network_mode_host) do
raise UnsupportedConfiguration, 'runner.network_mode_host is only supported on Linux' if config.runner.network_mode_host && !GDK::Machine.linux?
config.runner.network_mode_host
end
bool(:__install_mode_binary) { config.runner? && config.runner.install_mode == "binary" }
bool(:__install_mode_docker) { config.runner? && config.runner.install_mode == "docker" }
string(:__ssl_certificate) { Pathname.new(File.basename(config.nginx.ssl.certificate)).sub_ext('.crt') }
string(:__add_host_flags) { config.runner.extra_hosts.map { |h| "--add-host='#{h}'" }.join(" ") }
end
settings :grafana do
bool(:enabled) { false }
port(:port, 'grafana')
anything(:__uri) { URI::HTTP.build(host: config.hostname, port: port) }
end
settings :prometheus do
bool(:enabled) { false }
port(:port, 'prometheus')
anything(:__uri) { URI::HTTP.build(host: config.hostname, port: port) }
port(:gitaly_exporter_port, 'gitaly_exporter')
port(:praefect_exporter_port, 'praefect_exporter')
port(:workhorse_exporter_port, 'workhorse_exporter')
port(:gitlab_shell_exporter_port, 'gitlab_shell_exporter')
port(:gitlab_ai_gateway_exporter_port, 'gitlab_ai_gateway_exporter')
array(:extra_hosts) { [] }
string(:__add_host_flags) { config.prometheus.extra_hosts.map { |h| "--add-host='#{h}'" }.join(" ") }
end
settings :openbao do
bool(:enabled) { false }
bool(:auto_update) { true }
path(:bin) { config.gdk_root.join('openbao', 'bin', 'bao') }
string(:__server_command) { "#{bin} server --config #{config.gdk_root.join('openbao', 'config.hcl')}" }
string(:dev_token) { 'dev-only-token' }
string(:__listen) { "#{config.hostname}:#{port}" }
port(:port, 'vault')
port(:cluster_port, 'openbao_cluster')
string(:root_token) { '' }
string(:unseal_key) { '' }
settings :vault_proxy do
bool(:enabled) { parent.enabled }
path(:bin) { parent.bin }
string(:__server_command) { "#{bin} proxy --config #{config.gdk_root.join('openbao', 'proxy_config.hcl')}" }
string(:__listen) { "#{config.hostname}:#{port}" }
port(:port, 'vault_proxy')
end
end
settings :openldap do
bool(:enabled) { false }
settings :main do
string(:host) { config.hostname }
end
settings :alt do
string(:host) { config.hostname }
end
end
settings :smartcard do
bool(:enabled) { false }
string(:hostname) { 'smartcard.gdk.test' }
port(:port, 'smartcard_nginx')
bool(:san_extensions) { true }
settings :ssl do
string(:certificate) { 'smartcard.gdk.test.pem' }
string(:key) { 'smartcard.gdk.test-key.pem' }
string(:client_cert_ca) { '/mkcert/rootCA.pem' }
end
end
settings :mattermost do
bool(:enabled) { false }
port(:port, 'mattermost')
string(:image) { 'mattermost/mattermost-preview' }
end
settings :gitlab do
bool(:auto_update) { true }
string(:default_branch) { 'master' }
bool(:lefthook_enabled) { true }
path(:dir) { config.gdk_root.join('gitlab') }
path(:log_dir) { config.gitlab.dir.join('log') }
bool(:cache_classes) { false }
bool(:gitaly_disable_request_limits) { false }
settings :rails do
string(:hostname) { config.hostname }
integer(:port) { config.port }
settings :https do
bool(:enabled) { config.https? }
end
bool(:bootsnap) { true }
string(:address) { '' }
string(:__bind) { "#{config.gitlab.rails.__listen_settings.__protocol}://#{config.gitlab.rails.__listen_settings.__address}" }
string(:__workhorse_url) do
if config.gitlab.rails.address.empty?
config.gitlab.rails.__socket_file
else
"http://#{config.gitlab.rails.__listen_settings.__address}"
end
end
path(:__socket_file) { config.gdk_root.join('gitlab.socket') }
string(:__socket_file_escaped) { CGI.escape(config.gitlab.rails.__socket_file.to_s) }
settings :__listen_settings do
string(:__protocol) do
if config.gitlab.rails.address.empty?
'unix'
else
'tcp'
end
end
string(:__address) do
if config.gitlab.rails.address.empty?
config.gitlab.rails.__socket_file
else
config.gitlab.rails.address
end
end
end
bool(:__has_jh_dir) { File.exist?(config.gitlab.dir.join('jh')) }
string(:bundle_gemfile) do
if __has_jh_dir
config.gitlab.dir.join('jh/Gemfile')
else
config.gitlab.dir.join('Gemfile')
end
end
# Deprecated, use :databases settings instead
bool(:multiple_databases) { false }
settings :databases do
settings :ci do
bool(:enabled) { true }
bool(:use_main_database) { false }
bool(:__enabled) do
config.gitlab.rails.multiple_databases || config.gitlab.rails.databases.ci.enabled
end
bool(:__use_main_database) do
if config.gitlab.rails.multiple_databases
false
elsif config.gitlab.rails.databases.ci.enabled
config.gitlab.rails.databases.ci.use_main_database
else
false
end
end
end
settings :sec do
bool(:enabled) { false }
bool(:use_main_database) { true }
bool(:__enabled) do
config.gitlab.rails.multiple_databases || config.gitlab.rails.databases.sec.enabled
end
bool(:__use_main_database) do
if config.gitlab.rails.multiple_databases
true
elsif config.gitlab.rails.databases.sec.enabled
config.gitlab.rails.databases.sec.use_main_database
else
true
end
end
end
settings :embedding do
bool(:enabled) { false }
bool(:__enabled) { enabled }
end
end
settings :puma do
integer(:workers) { 2 }
integer(:threads_max) { 4 }
integer(:__threads_max) { [config.gitlab.rails.puma.__threads_min, config.gitlab.rails.puma.threads_max].max }
integer(:threads_min) { 1 }
integer(:__threads_min) { config.gitlab.rails.puma.workers.zero? ? config.gitlab.rails.puma.threads_max : config.gitlab.rails.puma.threads_min }
end
settings :session_store do
# unique_cookie_key_postfix: Unique key postfix based on the root directory of GDK
# We enable it by default if all cells functionality is disabled.
# Therefore, excluding the primary cell, keeps it `false`.
bool(:unique_cookie_key_postfix) { !config.gitlab.topology_service.enabled? && !config.gitlab_topology_service.enabled }
string(:cookie_key) { "_gitlab_session" }
string(:session_cookie_token_prefix) do
config.gitlab.topology_service.enabled? ? "cell-#{config.gitlab.cell.id}" : ""
end
end
array(:allowed_hosts) { [] }
integer(:application_settings_cache_seconds) { 60 }
end
settings :rails_background_jobs do
bool(:enabled) { true }
bool(:verbose) { false }
integer(:timeout) { config.gdk.runit_wait_secs / 2 }
bool(:sidekiq_exporter_enabled) { false }
port(:sidekiq_exporter_port, 'sidekiq_exporter')
bool(:sidekiq_health_check_enabled) { false }
port(:sidekiq_health_check_port, 'sidekiq_health_check')
array(:sidekiq_queues) { %w[default mailers] }
array(:sidekiq_routing_rules) do
[
["*", "default"]
]
end
end
settings :sidekiq_cron do
bool(:enabled) { false }
bool(:verbose) { false }
integer(:timeout) { config.gdk.runit_wait_secs / 2 }
array(:sidekiq_queues) { %w[cronjob] }
end
settings :topology_service do
bool(:enabled) { config.gitlab_topology_service.enabled }
string(:address) { "#{config.hostname}:#{config.gitlab_topology_service.grpc_port}" }
path(:ca_file) { config.gdk_root.join("gitlab-topology-service/tmp/certs/ca-cert.pem") }
path(:private_key_file) { config.gdk_root.join("gitlab-topology-service/tmp/certs/client-key.pem") }
path(:certificate_file) { config.gdk_root.join("gitlab-topology-service/tmp/certs/client-cert.pem") }
end
settings :cell do
integer(:id) { CellManager::LEGACY_CELL_ID }
integer(:__legacy_cell_sequence_maxval) { CellManager::LEGACY_CELL_SEQUENCE_MAXVAL }
settings :database do
bool(:skip_sequence_alteration) { true }
end
end
end
settings :redis do
bool(:enabled) { true }
path(:dir) { config.gdk_root.join('redis') }
path(:__socket_file) { dir.join('redis.socket') }
settings(:databases) do
settings(:development) do
integer(:shared_state) { 0 } # This inherits db=0 for compatibility reasons
integer(:queues) { 1 }
integer(:cache) { 2 }
integer(:repository_cache) { 2 }
integer(:trace_chunks) { 3 }
integer(:rate_limiting) { 4 }
integer(:sessions) { 5 }
end
settings(:test) do
integer(:shared_state) { 10 }
integer(:queues) { 11 }
integer(:cache) { 12 }
integer(:repository_cache) { 12 }
integer(:trace_chunks) { 13 }
integer(:rate_limiting) { 14 }
integer(:sessions) { 15 }
end
end
# See doc/howto/redis.md for more detail
hash_setting(:custom_config) { {} }
end
settings :redis_cluster do
bool(:enabled) { false }
path(:dir) { config.gdk_root.join('redis-cluster') }
port(:dev_port_1, 'redis_cluster_dev_1') { 6000 }
port(:dev_port_2, 'redis_cluster_dev_2') { 6001 }
port(:dev_port_3, 'redis_cluster_dev_3') { 6002 }
port(:test_port_1, 'redis_cluster_test_1') { 6003 }
port(:test_port_2, 'redis_cluster_test_2') { 6004 }
port(:test_port_3, 'redis_cluster_test_3') { 6005 }
end
settings :asdf do
bool(:opt_out) { false }
bool(:__available?) { GDK::Dependencies.asdf_available? }
end
settings :mise do
bool(:enabled) { false }
end
settings :packages do
path(:__dpkg_deb_path) do
if GDK::Machine.macos?
config.__brew_prefix_path.join('bin', 'dpkg-deb')
else
'/usr/bin/dpkg-deb'
end
end
end
end
end