Files
computer-playbook/roles/web-app-gitlab/meta/volumes.yml
kevinveenbirkenbachandClaude Opus 5 2389b6e38b fix(gitlab): discover the OIDC issuer over the scheme it actually uses
GitLab could not log anyone in through Keycloak on an onion deployment. The sign-in page carried the omniauth flash: Could not authenticate you from OpenIDConnect because Ssl connect returned=1 errno=0 peeraddr=172.30.0.10:443 state=error: tlsv1 unrecognized name (ssl alert number 112), and gitlab-webservice logged OpenIDConnect::Discovery::DiscoveryFailed eleven times.

The openid_connect gem rebuilds the well-known URL and never reads the scheme of the issuer. Its config resource also drops the port when it is 80 or 443, so http://auth.onion loses port 80 and URI::HTTPS.build puts 443 back. The hidden service publishes port 80 only, so 443 reaches the SNI-less default listener, which answers ssl_reject_handshake - alert 112, exactly the string in the flash.

An initializer sets SWD.url_builder and WebFinger.url_builder to URI::HTTP when the issuer is plaintext. These are the same two lines web-app-decidim already ships for the identical bug, and this repo has one such fix per role for zammad, mastodon, decidim and peertube; gitlab was the gap. The mount copies the smtp_settings.rb initializer pattern onto webservice and sidekiq.

The scheme test lives in the ruby file rather than in the render and mount conditions, which both gate on services.sso.enabled alone. Two separately spelled conditions could drift once an inventory sets OIDC_OVERRIDE.URL, and would then either render a file that is never mounted or mount one that was never rendered.

Boot safety: omniauth_openid_connect and openid_connect are default-group Gemfile entries without require: false, so Bundler.require loads them before the initializers run, and openid_connect requires swd and webfinger itself. Both writers are public and assign an ivar. GitLab never assigns url_builder anywhere.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-14 13:37:57 +02:00

249 lines
8.6 KiB
YAML

---
repositories:
type: volume
name: gitlab_repositories
# nocheck: nfs-false-data-loss Reason: gitaly does not support NFS (GitLab requirement); single-replica, repos are moved manually before a reschedule (see README).
nfs: false
mounts:
- service: gitaly
target: /home/git/repositories
shared:
type: volume
name: gitlab_shared
mounts:
- service: webservice
target: &shared_target /srv/gitlab/shared
- service: sidekiq
target: *shared_target
- service: workhorse
target: *shared_target
uploads:
type: volume
name: gitlab_uploads
mounts:
- service: webservice
target: &uploads_target /srv/gitlab/public/uploads
- service: sidekiq
target: *uploads_target
- service: workhorse
target: *uploads_target
builds:
type: volume
name: gitlab_builds
mounts:
- service: webservice
target: &builds_target /srv/gitlab/builds
- service: sidekiq
target: *builds_target
webservice_logs:
type: volume
name: gitlab_webservice_logs
# nocheck: nfs-false-data-loss Reason: container logs only, regenerated per boot, no persistent data to lose.
nfs: false
mounts:
- service: webservice
target: &var_log_target /var/log
webservice_state:
type: volume
name: gitlab_webservice_state
# nocheck: nfs-false-data-loss Reason: runtime state regenerated on boot from the mounted configs/secrets, no unique persistent data.
nfs: false
mounts:
- service: webservice
target: &var_opt_gitlab_target /var/opt/gitlab
sidekiq_logs:
type: volume
name: gitlab_sidekiq_logs
# nocheck: nfs-false-data-loss Reason: container logs only, regenerated per boot, no persistent data to lose.
nfs: false
mounts:
- service: sidekiq
target: *var_log_target
sidekiq_state:
type: volume
name: gitlab_sidekiq_state
# nocheck: nfs-false-data-loss Reason: runtime state regenerated on boot from the mounted configs/secrets, no unique persistent data.
nfs: false
mounts:
- service: sidekiq
target: *var_opt_gitlab_target
migrations_logs:
type: volume
name: gitlab_migrations_logs
# nocheck: nfs-false-data-loss Reason: container logs only, regenerated per boot, no persistent data to lose.
nfs: false
mounts:
- service: migrations
target: *var_log_target
migrations_state:
type: volume
name: gitlab_migrations_state
# nocheck: nfs-false-data-loss Reason: runtime state regenerated on boot from the mounted configs/secrets, no unique persistent data.
nfs: false
mounts:
- service: migrations
target: *var_opt_gitlab_target
shell_logs:
type: volume
name: gitlab_shell_logs
# nocheck: nfs-false-data-loss Reason: container logs only, regenerated per boot, no persistent data to lose.
nfs: false
mounts:
- service: shell
target: /var/log/gitlab-shell
gitaly_logs:
type: volume
name: gitlab_gitaly_logs
# nocheck: nfs-false-data-loss Reason: container logs only, regenerated per boot, no persistent data to lose.
nfs: false
mounts:
- service: gitaly
target: /var/log/gitaly
rails_gitlab_yml:
type: config
source: "{{ [lookup('container', 'web-app-gitlab', 'directories.config'), 'rails', 'gitlab.yml'] | path_join }}"
mode: "0444"
mounts:
- service: webservice
target: &rails_gitlab_yml_target /var/opt/gitlab/config/templates/gitlab.yml
- service: sidekiq
target: *rails_gitlab_yml_target
- service: migrations
target: *rails_gitlab_yml_target
rails_database_yml:
type: config
source: "{{ [lookup('container', 'web-app-gitlab', 'directories.config'), 'rails', 'database.yml'] | path_join }}"
mode: "0444"
mounts:
- service: webservice
target: &rails_database_yml_target /var/opt/gitlab/config/templates/database.yml
- service: sidekiq
target: *rails_database_yml_target
- service: migrations
target: *rails_database_yml_target
rails_resque_yml:
type: config
source: "{{ [lookup('container', 'web-app-gitlab', 'directories.config'), 'rails', 'resque.yml'] | path_join }}"
mode: "0444"
mounts:
- service: webservice
target: &rails_resque_yml_target /var/opt/gitlab/config/templates/resque.yml
- service: sidekiq
target: *rails_resque_yml_target
- service: migrations
target: *rails_resque_yml_target
rails_cable_yml:
type: config
source: "{{ [lookup('container', 'web-app-gitlab', 'directories.config'), 'rails', 'cable.yml'] | path_join }}"
mode: "0444"
mounts:
- service: webservice
target: &rails_cable_yml_target /var/opt/gitlab/config/templates/cable.yml
- service: sidekiq
target: *rails_cable_yml_target
- service: migrations
target: *rails_cable_yml_target
rails_sidekiq_queues_yml:
type: config
source: "{{ [lookup('container', 'web-app-gitlab', 'directories.config'), 'rails', 'sidekiq_queues.yml'] | path_join }}"
mode: "0444"
mounts:
- service: webservice
target: &rails_sidekiq_queues_yml_target /var/opt/gitlab/config/templates/sidekiq_queues.yml
- service: sidekiq
target: *rails_sidekiq_queues_yml_target
- service: migrations
target: *rails_sidekiq_queues_yml_target
rails_secrets_yml:
type: secret
source: "{{ [lookup('container', 'web-app-gitlab', 'directories.config'), 'rails', 'secrets.yml'] | path_join }}"
mode: "0444"
mounts:
- service: webservice
target: &rails_secrets_yml_target /var/opt/gitlab/config/templates/secrets.yml
- service: sidekiq
target: *rails_secrets_yml_target
- service: migrations
target: *rails_secrets_yml_target
shell_secret:
type: secret
source: "{{ [lookup('container', 'web-app-gitlab', 'directories.config'), 'secrets', '.gitlab_shell_secret'] | path_join }}"
mode: "0444"
mounts:
- service: webservice
target: &rails_shell_secret_target /var/opt/gitlab/config/secrets/.gitlab_shell_secret
- service: sidekiq
target: *rails_shell_secret_target
- service: migrations
target: *rails_shell_secret_target
- service: shell
target: /srv/gitlab-secrets/.gitlab_shell_secret
- service: gitaly
target: /etc/gitaly/.gitlab_shell_secret
workhorse_secret:
type: secret
source: "{{ [lookup('container', 'web-app-gitlab', 'directories.config'), 'secrets', '.gitlab_workhorse_secret'] | path_join }}"
mode: "0444"
mounts:
- service: workhorse
target: /etc/gitlab/gitlab-workhorse/secret
- service: webservice
target: /srv/gitlab/.gitlab_workhorse_secret
workhorse_config:
type: config
source: "{{ [lookup('container', 'web-app-gitlab', 'directories.config'), 'workhorse', 'workhorse-config.toml'] | path_join }}"
mode: "0444"
mounts:
- service: workhorse
target: /var/opt/gitlab/config/templates/workhorse-config.toml
shell_config:
type: config
source: "{{ [lookup('container', 'web-app-gitlab', 'directories.config'), 'shell', 'config.yml'] | path_join }}"
mode: "0444"
mounts:
- service: shell
target: /srv/gitlab-config/config.yml
gitaly_config:
type: config
source: "{{ [lookup('container', 'web-app-gitlab', 'directories.config'), 'gitaly', 'config.toml'] | path_join }}"
mode: "0444"
mounts:
- service: gitaly
target: /etc/gitaly/templates/config.toml
hostkey_rsa:
type: secret
source: "{{ [lookup('container', 'web-app-gitlab', 'directories.config'), 'hostkeys', 'ssh_host_rsa_key'] | path_join }}"
mode: "0444"
mounts:
- service: shell
target: /srv/ssh-hostkeys/ssh_host_rsa_key
hostkey_ed25519:
type: secret
source: "{{ [lookup('container', 'web-app-gitlab', 'directories.config'), 'hostkeys', 'ssh_host_ed25519_key'] | path_join }}"
mode: "0444"
mounts:
- service: shell
target: /srv/ssh-hostkeys/ssh_host_ed25519_key
smtp_initializer:
type: config
source: "{{ [lookup('container', 'web-app-gitlab', 'directories.config'), 'smtp_settings.rb'] | path_join }}"
mode: "0444"
mounts:
- service: webservice
target: &smtp_initializer_target /srv/gitlab/config/initializers/smtp_settings.rb
when: &smtp_initializer_when "{{ lookup('email', 'web-app-gitlab').enabled | bool }}"
- service: sidekiq
target: *smtp_initializer_target
when: *smtp_initializer_when
oidc_http_discovery_initializer:
type: config
source: "{{ [lookup('container', 'web-app-gitlab', 'directories.config'), 'oidc_http_discovery.rb'] | path_join }}"
mode: "0444"
mounts:
- service: webservice
target: &oidc_http_discovery_target /srv/gitlab/config/initializers/oidc_http_discovery.rb
when: &oidc_http_discovery_when "{{ lookup('config', 'web-app-gitlab', 'services.sso.enabled') | bool }}"
- service: sidekiq
target: *oidc_http_discovery_target
when: *oidc_http_discovery_when