πŸ”GitOps

  • How a change actually ships, by layer. The common thread: author desired state in git, let an operator apply it. Rationale in ADR/0001 GitOps apply model.

  • Terraform β†’ Atlantis

    • Open a PR touching a root module β†’ Atlantis autoplans it β†’ review β†’ comment atlantis apply β†’ a successful apply automerges the PR.

    • Local terraform plan is inspection-only; applying locally races Atlantis and corrupts locks.

  • Kubernetes β†’ Flux (+ ArgoCD)

    • Merge to main β†’ Flux reconciles clusters/**. ArgoCD deploys apps sourced from external repos (definitions in terraform/argo/).

    • flux reconcile kustomization <name> -n flux-system forces a sync; kubectl is for inspection.

  • NixOS β†’ nixos-rebuild + auto-upgrade

    • nixos-rebuild switch/boot --flake .#<host> --target-host <host> is the apply path, and hosts also auto-rebuild from GitHub main β€” so out-of-band or branch deploys silently revert unless merged promptly.

  • CI workflows

    • terraform.yml β€” validates changed .tf files; auto-formats + regenerates terraform-docs on merge

    • containers.yml β€” builds container images from apps/, packages/, images/

    • trivy.yml β€” scans .tf and clusters/** for CRITICAL/HIGH IaC vulnerabilities

    • wiki.yml β€” builds this wiki from docs/ and deploys it to Cloudflare Pages

    • pulsifer-ca.yml β€” builds and deploys the Hugo site to GitHub Pages

    • nixos-deploy.yaml, nix-ci.yaml, nix-image-builder.yaml β€” NixOS build/deploy pipelines

    • Renovate opens PRs for Helm charts, container images, Terraform providers, and GitHub Actions

  • The bootstrap exceptions

    • Two places where a layer reaches into another: the Flux bootstrap (clusters/<site>/bootstrap/ Terraform installs flux-operator/flux-instance), and the Atlantis ↔ ArgoCD auth wiring (see Runbooks/Kubernetes GitOps Change for token rotation).

Linked references 5

Home

Everything ships the same way: open a PR, let the operators apply it. See Architecture/GitOps.

Runbooks

When a runbook procedure changes the fleet's desired state, the change still ships via git β€” see Architecture/GitOps.

Architecture

Architecture/GitOps β€” how a change actually ships, layer by layer