Een production-ready GitOps platform voor het draaien van meerdere Nextcloud instances op Kubernetes
Quick Start β’ Architectuur β’ Documentatie β’ Bijdragen
- π Multi-tenant architectuur β Elke tenant draait in eigen namespace met volledige isolatie
- π GitOps-first β Alle configuratie in Git, automatische sync via Argo CD
- π¦ S3 Primary Storage β Geen NFS-afhankelijkheden, resilient tijdens node upgrades
- π Secrets Management β Ondersteuning voor External Secrets Operator of fallback generator
- π Observability β Prometheus metrics, ServiceMonitors, en alerting ready
- π― Canary Deployments β Wave-based rollouts met canary-first strategie
- β‘ Connection Pooling β Shared Redis en PgBouncer voor efficiΓ«nt resource gebruik
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Kubernetes Cluster β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β Platform Components ββ
β β βββββββββββββββ βββββββββββββββ ββββββββββββββββββββββββββββββββββββ ββ
β β β Redis β β PgBouncer β β External Secrets Operator β ββ
β β β (shared) β β (shared) β β (secrets from Vault/cloud) β ββ
β β βββββββββββββββ βββββββββββββββ ββββββββββββββββββββββββββββββββββββ ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β ββββββββββββββββββββ ββββββββββββββββββββ ββββββββββββββββββββ β
β β ns: nc-canary β β ns: nc-tenant-a β β ns: nc-tenant-b β ... β
β β ββββββββββββββ β β ββββββββββββββ β β ββββββββββββββ β β
β β β Nextcloud β β β β Nextcloud β β β β Nextcloud β β β
β β β Pod(s) β β β β Pod(s) β β β β Pod(s) β β β
β β ββββββββββββββ β β ββββββββββββββ β β ββββββββββββββ β β
β ββββββββββββββββββββ ββββββββββββββββββββ ββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β External Services β
β βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββββββββββββββ β
β β Ceph RGW S3 β β PostgreSQL β β CephFS β β
β β (user files) β β (database) β β (minimal appdata) β β
β βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Tijdens Kubernetes node upgrades kan de provider toegang tot de OpenStack API blokkeren, waardoor:
- CSI attach/mount operaties falen
- In-cluster NFS provisioner onbeschikbaar wordt
- Services uitvallen voor de duur van de upgrade
Onze oplossing: User files in S3 (Ceph RGW) zijn altijd toegankelijk, onafhankelijk van cluster-status.
| Component | Traditioneel | Dit Platform |
|---|---|---|
| User files | NFS/block storage | S3 Object Storage |
| Config | RWX NFS volume | ConfigMaps + Secrets |
| Sessions | Local/NFS | Redis (shared) |
| Locking | File-based | Redis (distributed) |
nextcloud-platform/
βββ argo/ # Argo CD configuratie
β βββ applicationsets/ # ApplicationSet voor tenants
β βββ projects/ # Argo CD project definitie
βββ platform/ # Shared platform components
β βββ redis/ # Shared Redis deployment
β βββ pgbouncer/ # Connection pooler
β βββ externalsecrets/ # ESO ClusterSecretStore
β βββ policies/ # NetworkPolicies, PDBs
βββ values/ # Helm values
β βββ common.yaml # Gedeelde configuratie
β βββ env/ # Environment overrides
β β βββ accept.yaml
β β βββ prod.yaml
β βββ tenants/ # Tenant configuraties
β βββ tenant-canary.yaml
βββ scripts/ # Utility scripts
β βββ create-tenant-secret.sh
β βββ validate-values.sh
β βββ smoke-checks.sh
βββ docs/ # Documentatie
βββ ADDING-TENANT.md
βββ DATABASE.md
βββ SECRETS.md
βββ UPGRADE.md
- Kubernetes 1.28+
- Argo CD geΓ―nstalleerd
- cert-manager met
letsencrypt-prodClusterIssuer - S3-compatible storage (Ceph RGW, MinIO, AWS S3)
- DNS geconfigureerd voor tenants
git clone https://github.com/your-org/nextcloud-platform.git
cd nextcloud-platformMaak een secret aan voor de canary tenant:
kubectl create namespace nc-canary
kubectl create secret generic nextcloud-secrets \
--namespace=nc-canary \
--from-literal=nextcloud-username=admin \
--from-literal=nextcloud-password='$(openssl rand -base64 24)' \
--from-literal=s3-access-key='YOUR_S3_ACCESS_KEY' \
--from-literal=s3-secret-key='YOUR_S3_SECRET_KEY' \
--from-literal=db-password='YOUR_DB_PASSWORD' \
--from-literal=redis-password='' \
--from-literal=nextcloud-secret="$(openssl rand -base64 48)"# Apply Argo CD project
kubectl apply -f nextcloud-platform/argo/projects/nextcloud-platform.yaml
# Apply ApplicationSet
kubectl apply -f nextcloud-platform/argo/applicationsets/nextcloud-tenants.yamlkubectl get applications -n argocd -w
kubectl get pods -n nc-canary -wOpen je browser en ga naar https://nextcloud-canary.commonground.nu (of je geconfigureerde hostname).
| Document | Beschrijving |
|---|---|
| SETUP.md | Volledige setup guide voor eerste deployment |
| ADDING-TENANT.md | Stap-voor-stap guide voor nieuwe tenants |
| DATABASE.md | Database opties (MariaDB, PostgreSQL, External) |
| SECRETS.md | Secrets management met ESO of fallback |
| UPGRADE.md | Upgrade procedures en rollback |
Maak een nieuw bestand values/tenants/tenant-<naam>.yaml:
tenant:
name: mijn-tenant
environment: prod
wave: "1"
hostname: mijn-tenant.nextcloud.example.com
s3:
bucket: nextcloud-mijn-tenant
nextcloud:
host: mijn-tenant.nextcloud.example.com
trustedDomains:
- mijn-tenant.nextcloud.example.com
ingress:
tls:
- secretName: nextcloud-mijn-tenant-tls
hosts:
- mijn-tenant.nextcloud.example.com
hosts:
- host: mijn-tenant.nextcloud.example.com
paths:
- path: /
pathType: PrefixCommit en push β Argo CD maakt automatisch de Application aan.
Het platform is voorbereid op Prometheus monitoring:
- ServiceMonitors voor Nextcloud, Redis, PgBouncer
- Pod annotations voor metrics scraping
- Aanbevolen alert rules in de documentatie
- Update chart version in
values/common.yaml - Canary rollout β Wave 0 (canary) wordt eerst geupgrade
- Validatie β Health checks op canary
- Wave rollout β Overige tenants per wave
# Controleer status
argocd app get nc-canary
# Valideer na upgrade
kubectl exec -it -n nc-canary deploy/nextcloud -- php occ status- Fork de repository
- Maak een feature branch (
git checkout -b feature/mijn-feature) - Valideer je wijzigingen:
./scripts/validate-values.sh ./scripts/smoke-checks.sh
- Commit je changes (
git commit -m 'feat: beschrijving') - Push naar de branch (
git push origin feature/mijn-feature) - Open een Pull Request
Dit project is gelicenseerd onder de MIT License - zie het LICENSE bestand voor details.