Shepherd is a self-hosted, Kubernetes-first fleet manager for
Grafana Alloy. It runs in your cluster, holds your collectors’
configuration centrally, and serves each one exactly the config it should be running over
Alloy’s own remotecfg protocol. Collectors poll it; it never connects to
them, so it needs no access into the clusters it manages and no inbound path to a collector.
Alloy (spoke) ──remotecfg──▶ Shepherd ──serves──▶ merged Alloy config
│
┌────────────────┼────────────────────┐
▼ ▼ ▼
PostgreSQL Merge engine Git (GitOps)
(sessions, store) (matcher + declare) (repo_links)
One merged config, assembled from the pipelines that match it. A collector in an unclaimed cluster is served an empty config, and a claimed one that matches nothing a config with no pipelines (only the beacon), rather than an error, so an unclaimed or unmatched collector keeps running whatever it already had locally — nothing is disrupted until somebody claims its cluster and enables pipelines that select it.
Every pipeline passes a three-stage validation gate before it can be served, so a config that would not start is refused at authoring time rather than discovered by a collector at 3am.
Every claimed collector is also served a small baseline pipeline that reports which components
it is running and whether they are healthy. It reports component names and health
only — never config text, never raw samples. It is on by default; set
server.beacon_disabled: true to turn it off.
Everything is scoped to an organisation: collectors are claimed into one, pipelines belong to one, and roles are granted per organisation. An application administrator creates orgs and sets each one’s tenant identity; everyone else works inside one. See Roles and access.