Storage Overview
The storage slice spans three ownership layers in lumie-infra:
storage/**owns shared storage operators and utilities such as the CloudNativePG operator, shared Redis releases,infra-db, and PgWeb.bootstrap/minio/**owns MinIO because object storage must exist before later GitOps applications can use it.applications/lumie/**owns the product database clusters and their CNPG-native poolers, even though they depend on the shared storage operator.
Boundaries
| Surface | Primary source paths | Namespace or scope | Notes |
|---|---|---|---|
| CNPG operator | lumie-infra/storage/cnpg/**, lumie-infra/charts/cnpg/** | cnpg, cluster-scoped CRDs | Reconciles Cluster, Pooler, and ScheduledBackup resources. |
| Product PostgreSQL | lumie-infra/applications/lumie/cnpg-values.yaml, lumie-infra/applications/lumie/**/pooler.yaml | lumie-db, lumie-dev | Product databases are not defined under storage/**. |
| Shared infra database | lumie-infra/storage/infra-db/** | infra-db | Hosts Grafana, Keycloak, Umami, Coder, Gitea, OpenClaw, and Teleport-related state. |
| Redis | lumie-infra/storage/redis/** | lumie-cache, lumie-dev | Prod uses replication plus Sentinel; dev uses standalone. |
| MinIO | lumie-infra/bootstrap/minio/**, lumie-infra/provision/ansible/roles/storage-setup/** | minio | Bootstrap-owned because Vault, Zot, and backups depend on it. |
| PgWeb | lumie-infra/storage/pgweb/** | lumie-db | Read/write admin UI for the product database. |
| Velero | no active repo path under lumie-infra | legacy namespace only | The repo currently does not manage a live Velero deployment. |
Operational flow
- ArgoCD applies
lumie-infra/storage/application.yaml, which fans out into thestorage/kustomization.yamlapp-of-apps set. - The CNPG operator from
lumie-infra/storage/cnpg/argocd.yamlreconciles databaseClusterandPoolerCRs owned elsewhere in the repo. - MinIO comes from
lumie-infra/bootstrap/minio/argocd.yamland provides object storage for product uploads, Vault storage, CNPG dump jobs, and Thanos-related secrets. - Redis provides cache and coordination endpoints for backend and worker services.
- Backup paths split by store:
- CNPG clusters archive WAL and base backups to Cloudflare R2 for
lumie-dbandinfra-db. - MinIO snapshots the
lumie,lumie-dev, andvaultbuckets to R2 on a CronJob schedule.
- CNPG clusters archive WAL and base backups to Cloudflare R2 for
Current drift to keep in mind
lumie-infra/storage/kustomization.yamlsays the legacy Helm-based PgBouncer chart is retired, and the live poolers are CNPGPoolerresources underapplications/lumie/**.- The repository still keeps
lumie-infra/storage/pgbouncer/argocd-prod.yamlas a legacy artifact, but it is not part of the storage app-of-apps set. - A read-only
kubectl get nson June 14, 2026 showed aveleronamespace inTerminatingstate, but the repo has novelero/manifests or ArgoCD application.
Common failure patterns
- Local-path or local-PV storage ties database and MinIO data to specific nodes; node loss is an availability event, not just a pod reschedule.
- Vault-backed secret refresh failures break bootstrap credentials, database DSNs, and object-store access even when the workload manifests stay
Synced. - Pooler endpoint drift is easy to miss: product runtime traffic should use
lumie-poolerorlumie-dev-pooler, not direct superuser-style connections to primary services. - Backup coverage differs by surface. CNPG covers PostgreSQL; MinIO snapshots cover buckets; Velero is not the active backup mechanism described by this repo today.
Verification
kubectl get applications.argoproj.io -n argocd | rg 'storage|cnpg|minio|infra-db|redis|pgweb'
kubectl get clusters.postgresql.cnpg.io -A
kubectl get poolers.postgresql.cnpg.io -A
kubectl get pods -n minio
kubectl get pods -n lumie-cache