3.8 KiB
3.8 KiB
Blumeops Minikube Migration Plan
Status: Completed (2026-01-23)
This plan detailed the phased migration of blumeops services from direct hosting on indri (Mac Mini M1) to a minikube cluster. The migration is now complete for all services that will be migrated.
Final Status
| Phase | Name | Status | Notes |
|---|---|---|---|
| 0 | Foundation | ✅ Complete | Container registry (zot) + minikube cluster |
| 1 | K8s Infrastructure | ✅ Complete | Tailscale operator, ArgoCD, CloudNativePG, PostgreSQL cluster |
| 2 | Grafana | ✅ Complete | Migrated Grafana via ArgoCD |
| 3 | PostgreSQL | ✅ Complete | Data migration to k8s PostgreSQL |
| 4 | Miniflux | ✅ Complete | Migrated Miniflux via ArgoCD |
| 5 | devpi | ✅ Complete | Migrated devpi via ArgoCD |
| 5.1 | Docker Migration | ✅ Complete | Switched minikube to docker driver (not QEMU2) |
| 6 | Kiwix | ✅ Complete | Migrated Kiwix + Transmission via ArgoCD |
| 7 | Forgejo | ⏭️ Won't Do | Forgejo stays on indri - see CI/CD Bootstrap |
| 8 | Woodpecker | ⏭️ Won't Do | Replaced by Forgejo Actions - see CI/CD Bootstrap |
| 9 | Cleanup | ⏭️ Won't Do | Observability cleanup done separately (2026-01-22) |
What Was Migrated to K8s
| Service | Status | Notes |
|---|---|---|
| Grafana | ✅ In k8s | Helm chart via ArgoCD |
| PostgreSQL | ✅ In k8s | CloudNativePG operator |
| Miniflux | ✅ In k8s | Using k8s PostgreSQL |
| devpi | ✅ In k8s | Custom container image |
| Kiwix | ✅ In k8s | NFS mount from sifaka |
| Transmission | ✅ In k8s | NFS mount from sifaka |
| Prometheus | ✅ In k8s | Migrated 2026-01-22 |
| Loki | ✅ In k8s | Migrated 2026-01-22 |
| Alloy (k8s) | ✅ In k8s | DaemonSet for pod logs |
| TeslaMate | ✅ In k8s | Added 2026-01-23 |
What Stays on Indri
| Service | Reason |
|---|---|
| Forgejo | Critical infrastructure, avoids circular dependency with ArgoCD |
| Zot Registry | K8s needs images to start - must be outside k8s |
| Alloy (host) | Collects host-level metrics and logs |
| Borgmatic | Backup system must survive k8s failures |
| Plex | Uses own NAT traversal, not Tailscale |
Architecture Decisions Made
Minikube Driver: Docker (not QEMU2/Podman)
- Original plan called for QEMU2, but docker driver proved simpler
- NFS mounts work via Docker NAT through indri's LAN IP
- API server accessible via Tailscale TCP passthrough
Forgejo: Stays on Indri
- Original P7 planned k8s migration
- Decision changed: Forgejo is critical infrastructure
- Will be built from source via Forgejo Actions CI
- See CI/CD Bootstrap Plan for details
CI/CD: Forgejo Actions (not Woodpecker)
- Original P8 planned Woodpecker deployment
- Decision changed: Use Forgejo's native Actions instead
- Simpler (one less system), GitHub Actions compatible
- See CI/CD Bootstrap Plan for details
Observability: Migrated to K8s
- Original plan kept Prometheus/Loki on indri
- Changed: Migrated both to k8s (2026-01-22)
- Alloy on indri pushes to k8s endpoints
- Alloy DaemonSet in k8s collects pod logs
Lessons Learned
- Docker driver is simpler than QEMU2 - Direct NFS mounts work, no VM complexity
- Tailscale operator works well - Easy service exposure with automatic TLS
- CloudNativePG is production-ready - Good operator, easy backups
- Keep critical infra outside k8s - Forgejo and zot must survive k8s failures
- CGO matters on macOS - Alloy needed CGO=1 for Tailscale DNS resolution