GitOps repository for personal infrastructure management
  • Nix 32.5%
  • Jinja 21.5%
  • Python 17.9%
  • Shell 11.8%
  • Go 8.1%
  • Other 8.2%
Find a file
Erich Blume 268645f561 Fix goModules derivation: disable fixup to avoid store path references
The Go toolchain auto-download (triggered by `toolchain go1.25.8` in
go.mod) puts scripts with shebangs into the module cache. Nix fixup
phase patches these to reference /nix/store paths, violating the
fixed-output derivation contract. dontFixup = true leaves the cache
as-is, which is fine since these files are only consumed as build
inputs by the pyroscope derivation.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-26 14:25:33 -07:00
.claude Review 12 reference docs: fix stale image refs, expand stubs, add cross-refs 2026-03-23 09:51:57 -07:00
.dagger Upgrade Dagger from v0.19.11 to v0.20.0 (#285) 2026-03-05 09:32:13 -08:00
.forgejo/workflows Localize authentik-redis container (#309) 2026-03-24 13:27:36 -07:00
.github Switch git hooks from pre-commit to prek (#276) 2026-03-02 18:15:23 -08:00
ansible Decommission JobSync service (#308) 2026-03-24 08:44:23 -07:00
argocd Add Nix container build for Pyroscope and update to v1.19.1 2026-03-26 14:20:05 -07:00
containers Fix goModules derivation: disable fixup to avoid store path references 2026-03-26 14:25:33 -07:00
docs Deploy Grafana Pyroscope for continuous eBPF profiling on ringtail 2026-03-26 14:05:57 -07:00
fly Update tooling dependencies (March 2026) (#307) 2026-03-24 08:11:46 -07:00
mise-tasks Deploy Prowler CIS scanner (#310) 2026-03-24 16:08:09 -07:00
nixos/ringtail Deploy Tor Snowflake proxy on ringtail (#311) 2026-03-24 20:51:40 -07:00
pulumi Expose Forgejo publicly at forge.eblu.me (#278) 2026-03-03 08:40:41 -08:00
.ansible-lint Add pre-commit hooks for code quality (#19) 2026-01-16 19:33:02 -08:00
.gitignore agent memory ignore 2026-03-21 19:03:21 -07:00
.yamllint.yaml Allow implicit octals in yamllint and normalize k8s mode values 2026-03-03 13:10:44 -08:00
Brewfile Add op-backup mise task for encrypted 1Password disaster recovery (#136) 2026-02-09 20:37:39 -08:00
CHANGELOG.md Update docs release to v1.15.0 2026-03-24 19:51:17 -07:00
CLAUDE.md Exclude docs from ai-sources, mention ai-sources in CLAUDE.md 2026-03-15 18:40:35 -07:00
dagger.json Upgrade Dagger engine from v0.20.0 to v0.20.1 2026-03-06 20:41:02 -08:00
LICENSE Adopt Dagger CI for container builds (Phase 1) (#156) 2026-02-11 15:38:31 -08:00
mise.toml Upgrade Dagger engine from v0.20.0 to v0.20.1 2026-03-06 20:41:02 -08:00
prek.toml Update tooling dependencies (March 2026) (#307) 2026-03-24 08:11:46 -07:00
README.md Deploy Grafana Pyroscope for continuous eBPF profiling on ringtail 2026-03-26 14:05:57 -07:00
service-versions.yaml Add Nix container build for Pyroscope and update to v1.19.1 2026-03-26 14:20:05 -07:00
towncrier.toml Fix Quartz build to preserve git history for accurate file dates (#105) 2026-02-04 08:25:46 -08:00
update-loki-3.6.7.infra.md Update loki to 3.6.7 (#302) 2026-03-20 16:02:28 -07:00

blumeops

aka "Blue Mops"

Tools and configuration for Erich Blume's personal infrastructure, orchestrated across a Tailscale tailnet.

This is a homelab, but it's also a testing ground for AI-assisted infrastructure development. Much of this codebase was co-authored with Claude Code, and the repo places heavy emphasis on documentation, process, and change classification to make that collaboration work well. I don't know entirely how I feel about LLMs in our current era (there are real concerns about how training data is sourced and energy subsidy) but it felt important to learn how to work with these tools.

The full documentation is published at docs.eblu.me and lives in the docs/ directory, structured around the Diataxis framework and designed to be compatible with Obsidian/Obsidian.nvim.

What runs here

Services are a mix of Kubernetes pods (managed by ArgoCD), macOS LaunchAgent services (managed by Ansible), and NixOS systemd services (managed by Nix flakes), all connected via Tailscale:

  • Indri (Mac Mini M1) - primary server. Most services run in Minikube via ArgoCD; Forgejo, Caddy, and others run natively as LaunchAgent services via Ansible.
  • Ringtail (NixOS desktop, RTX 4080) - GPU workloads (Frigate NVR, Authentik SSO) on k3s, plus NixOS systemd services.
  • Sifaka (Synology NAS) - backup target and bulk storage.

Notable services include Immich photos, Jellyfin media, Forgejo git forge, a Zot container registry, and more. Public access is routed through a Fly.io proxy; everything else is tailnet-only.

Observability stack

The four(+) pillars of observability — metrics, logs, traces, and profiles — collected by Grafana Alloy and visualized in Grafana with cross-signal linking:

Pillar Backend How
Metrics Prometheus Alloy scrape + remote_write
Logs Loki Alloy pod log collection
Traces Tempo Alloy Beyla eBPF auto-instrumentation
Profiles Pyroscope Alloy eBPF continuous profiling

Project structure

ansible/            Ansible playbooks and roles (indri, sifaka)
argocd/apps/        ArgoCD Application definitions
argocd/manifests/   Kubernetes manifests per service
containers/         Custom container builds (Dockerfile + Nix)
docs/               Diataxis documentation (published at docs.eblu.me)
fly/                Fly.io public proxy configuration
mise-tasks/         Operational scripts run via mise
nixos/              NixOS configuration for ringtail
pulumi/             Pulumi IaC (Tailscale ACLs, Gandi DNS)
.dagger/            Dagger CI pipelines
.forgejo/           Forgejo Actions CI/CD workflows

Getting started

You'll need Homebrew and mise:

brew bundle                    # install CLI tools (argocd, tea, flyctl, etc.)
mise install                   # install managed toolchains (ansible, pulumi, dagger, etc.)
prek install                    # set up git hooks

Git hooks (via prek) enforce secret scanning (TruffleHog), linting, formatting, and custom checks like doc link validation and the Mikado branch invariant. They run automatically on git commit.

Operational tasks are driven through mise. Run mise tasks to see what's available. Key examples:

mise run provision-indri       # deploy to indri via Ansible
mise run services-check        # verify service health
mise run container-list        # list tracked container images

AI-assisted development

This repo is designed to be worked on by both humans and AI agents. The CLAUDE.md file provides instructions for Claude Code, and the docs/tutorials/ai-assistance-guide.md explains the full workflow.

Changes are classified before starting work:

  • C0 - quick fixes, committed directly to main
  • C1 - feature branch + PR, documentation written before code
  • C2 - multi-phase work using the Mikado method for dependency tracking

See the agent change process for details.

License

GPLv3