## Summary - Adds a second borgmatic config (`photos.yaml`) that backs up `/Volumes/photos` (sifaka SMB mount, ~128 GB) to a dedicated BorgBase repo (`immich-photos`), running daily at 4 AM - Separate launchd agent (`mcquack.eblume.borgmatic-photos`) so photo backups run independently from the main backup - Refactors `borgmatic_metrics` script to support multiple repos with a `repo` Prometheus label - Updates Grafana "Borg Backups" dashboard with a `repo` template variable so you can filter/compare repos - Docs updated: `backups.md`, `borgmatic.md` ## Prerequisites (manual) - [x] Create `immich-photos` repo on BorgBase with same SSH key - [ ] Upgrade BorgBase plan to Small ($24/yr) if currently on free tier (128 GB exceeds 10 GB limit) - [ ] After deploy: `borg init` the new repo (borgmatic does this automatically on first run) ## Test plan - [ ] Dry run: `mise run provision-indri -- --check --diff --tags borgmatic,borgmatic_metrics` - [ ] Deploy borgmatic role and verify both configs deployed - [ ] Run `borgmatic --config ~/.config/borgmatic/photos.yaml create --verbosity 1` manually for first backup (will take hours) - [ ] Verify metrics script collects from both repos: `~/.local/bin/borgmatic-metrics && cat /opt/homebrew/var/node_exporter/textfile/borgmatic.prom` - [ ] Sync grafana-config in ArgoCD and verify dashboard repo selector works 🤖 Generated with [Claude Code](https://claude.com/claude-code) Reviewed-on: #315 |
||
|---|---|---|
| .. | ||
| dashboards | ||
| external-secret-admin.yaml | ||
| external-secret-authentik-oauth.yaml | ||
| external-secret-teslamate-datasource.yaml | ||
| ingress-tailscale.yaml | ||
| kustomization.yaml | ||
| README.md | ||
Grafana Configuration
This directory contains Kubernetes manifests for Grafana configuration:
- Tailscale Ingress for external access
- Dashboard ConfigMaps for provisioning
Secrets Management
Current approach: Secrets are manually injected using 1Password CLI.
Before deploying Grafana, create the admin password secret:
kubectl create namespace monitoring
op inject -i secret-admin.yaml.tpl | kubectl apply -f -
The secret template (secret-admin.yaml.tpl) references 1Password:
- Vault:
vg6xf6vvfmoh5hqjjhlhbeoaie(blumeops) - Item:
oxkcr3xtxnewy7noep2izvyr6y - Field:
password
Future improvement: Migrate to External Secrets Operator or similar for automated secret synchronization from 1Password to Kubernetes.
Dashboards
Dashboard JSON files are stored as ConfigMaps in the dashboards/ directory.
The Grafana sidecar automatically discovers ConfigMaps with label
grafana_dashboard: "1" and provisions them.
To add a new dashboard:
- Export the dashboard JSON from Grafana UI
- Create a ConfigMap with the JSON content
- Add the
grafana_dashboard: "1"label - Add the ConfigMap to
kustomization.yaml