Two reasons dominate: sovereignty (source code never leaves your infra, useful for compliance) and cost at large team size (no per-seat license). The flip side: you’re the admin — backups, updates, availability.
The deployment principle (Docker, reverse proxy, HTTPS) is the same as in my Langfuse on EC2 guide.
GitLab CE fits in a single Docker container, with config, logs and data in persisted volumes. The Omnibus image even handles the Let’s Encrypt certificate on its own.
GitLab is hungry: count 4 GB RAM minimum, 8 GB comfortable. Below that, the first boot fails or crawls — don’t skimp on the instance.
GitLab without a runner runs no pipeline. A runner is a separate process that executes your CI jobs; you register it against the instance with a token.
Once runners are in place, you write your pipelines as in using GitLab CI/CD well.
The point that separates a serious self-host from a time bomb. GitLab has a built-in backup command — but it doesn’t include the config and secrets, which you must back up separately.
A backup never restored isn’t a backup. Test a full restore on a separate VM — that’s the whole point of backups that actually work.
LCP, CLS, INP: the concrete levers — images, fonts, server components — for an app that flies.
Sessions vs JWT, httpOnly cookies, OAuth, and where to put the checks: an auth foundation that holds.