Skip to content

How I set up a GitOps pipeline with ArgoCD in my homelab

From bare-metal k3s to application sync — what a practical GitOps loop looks like when everything lives in one repository.

7 min read

My homelab started as a small k3s cluster and gradually accumulated enough services that manual deployments stopped being reliable. ArgoCD gave me a simple rule: Git describes the desired state, and the cluster continuously reconciles toward it.

Repository layout

I keep cluster infrastructure and applications in one repository. Each application has its Kubernetes manifests, while environment-specific values live in separate overlays.

clusters/
  homelab/
apps/
  monitoring/
  media/
  internal-tools/

ArgoCD watches the homelab path and applies changes after they land on the main branch. Pull requests remain the review boundary; the cluster never depends on a developer laptop.

The practical sync loop

Every change follows the same short path:

  1. Update an image tag or manifest.
  2. Review the generated diff in a pull request.
  3. Merge the change.
  4. Let ArgoCD sync and report health.

Automatic sync works well for routine application updates. I still keep pruning and destructive infrastructure changes behind an explicit review because a green YAML diff is not a guarantee of a safe rollout.

What made it dependable

The useful part was not installing ArgoCD; it was making drift visible. Health checks, pinned image versions, and small application boundaries make failures easier to understand. When something goes wrong, I can compare the live cluster with Git and roll back with a revert instead of reconstructing the last working command.