The problem GitOps solves
On manually managed infrastructure, the question “what exactly is running in production?” has no reliable answer. Someone edited a configuration file in a hurry eight months ago. An environment variable was adjusted during an incident and never recorded anywhere else. The documentation describes a system that no longer quite exists.
That gap between the documented system and the real one is where most long outages live. The day the server has to be rebuilt, nobody knows what is missing — and you find out in production.
GitOps removes the gap by construction: the Git repository describes the desired state, an agent continuously compares it with reality, and corrects the difference. What isn’t in Git doesn’t exist; what is changed by hand is detected and reverted.
What changes day to day
A deployment becomes a commit. It goes through a merge request, it gets reviewed, CI validates it. The deployment itself is no longer a craft operation performed by the only person who knows how.
A rollback becomes trivial. Going back to the previous state means reverting a commit. No rebuild to reconstruct from memory, no backup folder to hunt down, no dependency on whoever deployed it.
Auditing comes for free. Who changed what, when, with what justification and whose approval: the Git history answers, at no extra effort. It is also exactly what your auditors will ask for the day they ask.
Environments finally resemble each other. Staging is described by the same files as production, with different parameters. Bugs that “only happen in production” become the exception rather than the norm.
How we roll it out
We don’t impose a big-bang switch. The approach is incremental and always starts with an honest inventory of what exists: what runs, where, with what configuration, and what nobody can explain any more.
Then, in this order: existing configuration brought under Git, reproducible image builds, the continuous integration chain, and finally automated deployment — staging first, production after. Each step delivers value on its own and doesn’t require the next one to be worth doing.
The choice of forge and reconciliation agent matters less than the discipline they make possible. We work with GitLab CI, Forgejo Actions and GitHub Actions for integration; Argo CD or Flux for Kubernetes reconciliation; Terraform, Ansible, Helm and Kustomize for describing infrastructure. If your team already knows one of these, we start from that one: the best CI/CD chain is the one your developers will actually use.