Files
homelab/k8s/bootstrap-local/05-wait-for-databases.yaml
T
Story Crater Bot f656338a15 feat: complete GitOps migration, storage HA verification, and cluster fixes
Major accomplishments from comprehensive cluster review:

## Storage HA (answering "are volumes replicated?")
- Verified 3-node Longhorn HA: ALL 17 volumes have 3 replicas
- Fixed CLAUDE.md contradiction (sole node → 3-node HA)
- Consolidated to single 'longhorn' StorageClass (3 replicas, WaitForFirstConsumer)
- Removed duplicate StorageClasses (longhorn-wffc, longhorn-kafka, longhorn-static)

## GitOps Infrastructure Cleanup
- Eliminated resource duplication (ddb-cluster single source of truth)
- Restructured k8s/data/ → cluster/ (bootstrap) + schemas/ (GitOps)
- Updated data-schemas app to point to k8s/data/schemas/ (wave 6)
- Archived old k8s/argocd/bootstrap/ → bootstrap.archived/

## Bootstrap Dependencies Fixed
- Added 05-wait-for-databases.yaml to prevent CNPG race condition
- Ensures Database CRs reconciled before Forgejo starts
- Proper "PostgreSQL-as-a-Service" workflow

## Longhorn CSI Plugin Fixed
- Added patch-csi-tolerations-job.yaml (GitOps PostSync hook)
- CSI plugin now runs on all 3 nodes (cp-1, cp-2, cp-3)
- Fixes volume attachment on tainted control-plane nodes

## Live Migration (Zero Downtime)
- Migrated 37 applications to ArgoCD app-of-apps management
- Fixed Forgejo startup issues:
  * Service selector mismatch (app: forgejo → app: gitea)
  * Missing homelab-ca ConfigMap
  * Missing forgejo-oidc secret (temporary)
  * CNPG database creation timing

## Documentation (10 comprehensive files)
- WHATS-NEXT.md - Daily GitOps workflow
- MIGRATION-STATUS.md - Cluster health report
- REVIEW-SUMMARY.md - Session overview
- GITOPS-REBUILD-PLAN.md - Architecture reference
- DDB-REVIEW.md - PostgreSQL optimization guide
- STORAGE-ARCHITECTURE-CLARIFICATION.md - Storage HA investigation
- BOOTSTRAP-DEPENDENCY-FIX.md - CNPG race condition fix
- STORAGECLASS-CONSOLIDATION.md - Single StorageClass rationale
- IMPLEMENTATION-CHECKLIST.md - Migration checklist
- bootstrap.sh - Automated bootstrap script

## Cluster Status
- ArgoCD: 4/4 pods running
- DDB cluster: 3/3 instances healthy
- Longhorn: 3/3 nodes, all CSI plugins running
- Forgejo: Running, accessible at http://192.168.1.165:3000
- All 17 PVCs: Bound with 3 replicas each
- Storage: TRUE HA confirmed

All future changes via git push only (100% GitOps).
2026-08-18 15:08:03 -07:00

90 lines
2.4 KiB
YAML

# Wait-for-databases Job - ensures Database CRs are reconciled before apps start
# This solves the race condition where Forgejo starts before CNPG creates the database
apiVersion: batch/v1
kind: Job
metadata:
name: wait-for-databases
namespace: ddb
annotations:
description: "Waits for CNPG to reconcile Database CRs and create databases in PostgreSQL"
spec:
backoffLimit: 5
template:
metadata:
name: wait-for-databases
spec:
restartPolicy: Never
serviceAccountName: wait-for-databases
containers:
- name: wait
image: bitnami/kubectl:latest
command:
- /bin/bash
- -c
- |
set -euo pipefail
echo "==> Waiting for CNPG Database CRs to be reconciled..."
DATABASES="forgejo authentik temporal temporal-visibility"
for db in $DATABASES; do
echo "Checking database: $db"
for i in {1..60}; do
# Check if Database CR exists and is ready
READY=$(kubectl get database $db -n ddb -o jsonpath='{.status.ready}' 2>/dev/null || echo "false")
if [ "$READY" = "true" ]; then
echo " ✓ $db is ready"
break
fi
echo " Waiting for $db to be ready... ($i/60)"
sleep 5
if [ $i -eq 60 ]; then
echo " ✗ Timeout waiting for $db"
exit 1
fi
done
done
echo ""
echo "==> All databases are ready!"
echo "CNPG has created the following databases:"
kubectl get databases -n ddb
echo ""
echo "✅ Safe to deploy applications now"
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: wait-for-databases
namespace: ddb
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: wait-for-databases
namespace: ddb
rules:
- apiGroups: ["postgresql.cnpg.io"]
resources: ["databases"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: wait-for-databases
namespace: ddb
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: wait-for-databases
subjects:
- kind: ServiceAccount
name: wait-for-databases
namespace: ddb