gitlab-best-practiceslisted
Install: claude install-skill air-gapped/skills
# gitlab-best-practices
Run and upgrade a **self-managed GitLab on the official Helm chart** without
unplanned downtime. The hard part is never `helm upgrade`. It is that the
chart changes defaults the site never set, ships prerequisites written for a
configuration the site does not run, and removed its own bundled databases in a
release that breaks the *tooling* before it breaks the deployment.
Facts here were verified **2026-08-29** against machine-readable upstream
sources, the unpacked chart, and a live install taken through a multi-hop
18.x → 19.x campaign. Re-verify anything version-bearing.
**Version anchor (2026-08-29):** latest chart **10.3.1** / app **19.3.1**.
Chart major = app major − 9. Required stops through 19.x: **18.2 · 18.5 ·
18.8 · 18.11 · 19.2 · 19.5 · 19.8 · 19.11** — enumerate them fresh, never
from memory.
## Symptom index
| Symptom | Where |
|---|---|
| Planning a multi-version upgrade; which stops, which order | § The ladder below, then `references/upgrade-campaign.md` |
| Ingress objects gone after a chart bump; instance off the network | `references/upgrade-campaign.md` § the chart-10 wall |
| Default render fails: "external PostgreSQL became required" | `references/upgrade-campaign.md` § chart 10.0 makes external deps mandatory |
| Background migrations stuck, finalizing forever, `PG::UndefinedTable` | `references/failure-modes.md` |
| `deduplicated: dropped` in Sidekiq logs; migrations never run, install looks green | `references/failure-mode