GitLab cross-site replication Phase 2b: enable Gitaly + workhorse TLS

Per the approved plan (Istio federation scoped separately, current
NodePort/PeerAuth/cert-manager pattern continues for these 2 remaining
links). Real Let's Encrypt certs (not self-signed) via the same DNS-01
ClusterIssuer used everywhere else - both sites already trust Let's
Encrypt's public CA, no custom CA distribution needed.

- global.gitaly.tls.enabled: adds tls_listen_addr (8076) alongside the
  existing plaintext listener (8075, stays for in-cluster traffic
  that doesn't need it). Requires
  global.praefect.virtualStorages[0].tlsSecretName (chart's own NOTES.txt
  validation rejects the render without it, confirmed live).
- global.workhorse.tls.enabled + global.workhorse.host: Gitaly's [gitlab]
  url (internal-API callback for gitlab-shell hooks) switches from an
  unpublishable *.svc.cluster.local name to a real floating hostname
  (gitlab-internal-api.ha.huskypup.net) that Let's Encrypt CAN certify -
  confirmed live this replaces the plaintext [[listeners]] block with
  [listeners.tls] on the SAME port (8181), not a second port like Gitaly.
- praefect-ha-configmap.yaml (the manually-patched live config) updated
  to tls:// + floating hostnames for all 3 home nodes, so home's own
  Praefect uses the identical addresses it'll hand the VPS as peer
  addresses once Phase 2b's 4th node lands.
- New CoreDNS rewrite for gitlab-internal-api.ha.huskypup.net (same
  local-rewrite pattern as pg-*/gitaly-* already have).

Sequencing note: applying live - Certificates must issue before the
TLS-enabling values land, or Gitaly/webservice pods fail to start
(missing secret for their init container's cert copy).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Scooby Husky
2026-08-22 14:24:13 -05:00
co-authored by Claude Sonnet 5
parent 166ff0ffb7
commit bce3861083
6 changed files with 145 additions and 33 deletions
+37 -1
View File
@@ -54,7 +54,37 @@ global:
internal:
names: [] # No internal Gitaly, using Praefect
external: [] # Praefect configured below
# GitLab cross-site replication (see
# /home/scooby/.claude/plans/jiggly-snacking-iverson.md) - Gitaly's
# gRPC has no TLS by default. The VPS's 4th node has to be reached
# over the same public UniFi WAN forward already used for Postgres
# (confirmed live the direct-Netbird-IP path doesn't accept inbound
# connections to home, same as the existing etcd quorum) - without
# this, that WAN hop would carry the gitaly_token,
# gitlab_shell_secret, and raw repository contents in plaintext.
# Chart-native support (tls_listen_addr alongside the existing
# plaintext listener, both stay active) - cert is a real Let's
# Encrypt cert via the same DNS-01 ClusterIssuer already used
# everywhere else (gitaly-tls-certificate.yaml), not a self-signed
# one, so no custom CA needs distributing to either site.
tls:
enabled: true
# Gitaly's [gitlab] url (the internal-API callback every Gitaly node
# uses for gitlab-shell hooks) - a real, TLS-supported override,
# confirmed live via gitlab/charts/gitlab/templates/_workhorse.tpl.
# Uses the SAME floating-hostname + CoreDNS-local-rewrite pattern
# already proven for Postgres and Gitaly's own node addresses: home's
# 3 Gitaly nodes resolve this locally (no WAN round-trip), the VPS's
# 4th node resolves it via the UniFi WAN forward - one consistent
# https:// URL for every node regardless of site, rather than trying
# to TLS-certify an unpublishable *.svc.cluster.local name (which
# Let's Encrypt fundamentally can't issue for).
workhorse:
host: gitlab-internal-api.ha.huskypup.net
tls:
enabled: true
# Praefect configuration
praefect:
enabled: true
@@ -68,6 +98,12 @@ global:
- name: default
gitalyReplicas: 3 # Production HA
maxUnavailable: 1
# Required once global.gitaly.tls.enabled: true - the chart's own
# NOTES.txt validation rejects the render without it ("not
# specified ('default')... not supported", confirmed live).
# Matches gitlab.gitaly.tls.secret's default name/keys
# (gitaly-tls-certificate.yaml issues into this exact secret).
tlsSecretName: gitlab-gitaly-tls
# Praefect PostgreSQL configuration
psql: