Back in the early days of GitLab.com, we've used to run Rails worker processes, Sidekiq background processes, and Git storage on a single server, a typical monolith. As expected, it's easy to deploy and maintain, though really hard to scale. Having a single server means we're only able to scale vertically, which becomes increasingly expensive and limiting.
At a given time, we had to run multiple servers, which meant Git repositories had to be available to all server nodes. For that, we first went for the "quick-win", NFS. It rapidly showed its limitations regarding observability, single point of failure and high latency.
Beside alternative solutions, we decided to slightly redesign the system and create a Go service called Gitaly, which now acts as a "git database" service for GitLab.com.
This talk will go through the history of how we've gradually separated it from the monolith using Feature flags, Protocol Buffers, gRPC and Go.