Configuration Reference¶
Complete reference for config.yaml configuration options.
config.yaml Structure¶
namespace: string # Kubernetes namespace
domain: string # Primary domain
versions: # Component versions
nextcloud: string
postgres: string
redis: string
collabora: string
whiteboard: string
s3: # S3 object storage
endpoint: string
region: string
buckets:
data: string
backups: string
storage: # Persistent storage
storageClass: string
postgresSize: string
redisSize: string
resources: # Resource allocation
nextcloud: ResourceSpec
postgres: ResourceSpec
redis: ResourceSpec
replicas: # Replica counts
nextcloud: number
postgres: number
redis: number
collabora: # Collabora configuration
enabled: boolean
domain: string
resources: ResourceSpec
whiteboard: # Whiteboard configuration
enabled: boolean
resources: ResourceSpec
Field Descriptions¶
namespace¶
Type: string
Required: Yes
Example: nextcloudkup
Kubernetes namespace for all resources. Must be DNS-compatible.
domain¶
Type: string
Required: Yes
Example: cloud.kup6s.com
Primary domain for Nextcloud. Used for:
Ingress hostname
TLS certificate
trusted_domainsin config.phpWOPI server URL for Collabora
versions¶
versions.nextcloud¶
Type: string
Required: Yes
Example: "31.0.13"
Nextcloud Docker image tag from Docker Hub.
Version Compatibility:
Must match or be newer than database version
Downgrading not supported
Check upgrade path in Nextcloud docs
versions.postgres¶
Type: string
Required: Yes
Example: "16"
PostgreSQL major version. Used by CloudNativePG operator.
Supported Versions: 12, 13, 14, 15, 16
versions.redis¶
Type: string
Required: Yes
Example: "7.4"
Redis Docker image tag from Docker Hub.
versions.collabora¶
Type: string
Required: No (if collabora.enabled: false)
Example: "25.04.8.2.1"
Collabora Online Docker image tag from Docker Hub.
Finding Tags:
# List available tags
curl -s https://registry.hub.docker.com/v2/repositories/collabora/code/tags | jq -r '.results[].name' | head -20
versions.whiteboard¶
Type: string
Required: No (if whiteboard.enabled: false)
Example: "latest"
Whiteboard Docker image tag from GitHub Container Registry.
s3¶
s3.endpoint¶
Type: string
Required: Yes
Example: https://fsn1.your-objectstorage.com
S3-compatible endpoint URL. For Hetzner S3:
fsn1 (Falkenstein):
https://fsn1.your-objectstorage.comnbg1 (Nuremberg):
https://nbg1.your-objectstorage.comhel1 (Helsinki):
https://hel1.your-objectstorage.com
s3.region¶
Type: string
Required: Yes
Example: fsn1
S3 region identifier. Must match endpoint location.
s3.buckets.data¶
Type: string
Required: Yes
Example: data-nextcloudkup-kup6s
S3 bucket name for user files. Created via Crossplane.
Naming Convention: data-{instance}-kup6s
s3.buckets.backups¶
Type: string
Required: Yes
Example: backups-nextcloudkup-kup6s
S3 bucket name for PostgreSQL backups. Created via Crossplane.
Naming Convention: backups-{instance}-kup6s
storage¶
storage.storageClass¶
Type: string
Required: Yes
Example: longhorn
Kubernetes StorageClass for persistent volumes.
Options:
longhorn- Replicated block storage (recommended)hcloud-volumes- Hetzner Cloud Volumessmb-csi- SMB/CIFS network storage (RWX support)
storage.postgresSize¶
Type: string
Required: Yes
Example: 10Gi
PVC size for each PostgreSQL replica.
Sizing Guidelines:
Small (< 10,000 files): 10Gi
Medium (10,000-100,000 files): 20Gi
Large (> 100,000 files): 50Gi
Growth Rate: ~30KB per file (metadata only)
storage.redisSize¶
Type: string
Required: Yes
Example: 5Gi
PVC size for Redis data (cache only).
Recommendation: 5Gi sufficient for most workloads.
resources¶
Resource specifications follow Kubernetes ResourceRequirements format:
resources:
component:
requests:
cpu: string # e.g., "200m" = 0.2 CPU cores
memory: string # e.g., "512Mi" = 512 MiB RAM
limits:
cpu: string
memory: string
resources.nextcloud¶
Requests:
cpu: Minimum CPU guaranteed
memory: Minimum memory guaranteed
Limits:
cpu: Maximum CPU (throttled above)
memory: Maximum memory (OOMKilled above)
Sizing Guidelines:
Workload |
CPU Request |
Memory Request |
CPU Limit |
Memory Limit |
|---|---|---|---|---|
Small (< 10 users) |
200m |
512Mi |
1000m |
2Gi |
Medium (10-50 users) |
500m |
1Gi |
2000m |
4Gi |
Large (> 50 users) |
1000m |
2Gi |
4000m |
8Gi |
resources.postgres¶
Recommended:
requests:
cpu: 100m
memory: 256Mi
limits:
cpu: 500m
memory: 512Mi
PostgreSQL is generally I/O bound, not CPU bound.
resources.redis¶
Recommended:
requests:
cpu: 50m
memory: 128Mi
limits:
cpu: 200m
memory: 256Mi
Redis used only for caching (not persistent data).
replicas¶
replicas.nextcloud¶
Type: number
Required: Yes
Example: 1 or 3
Number of Nextcloud pod replicas.
Important: Multiple replicas require RWX storage for config/apps directory.
Current Limitation:
Longhorn: RWO only → Use
replicas: 1SMB CSI: RWX support → Can use
replicas: 3
replicas.postgres¶
Type: number
Required: Yes
Example: 2
Number of PostgreSQL replicas in CNPG cluster.
Recommendations:
Production:
2(primary + standby)Development:
1(no HA)
replicas.redis¶
Type: number
Required: Yes
Example: 1
Number of Redis replicas.
Recommendation: 1 (cache only, no HA needed)
collabora¶
collabora.enabled¶
Type: boolean
Required: Yes
Example: true
Enable Collabora Online for document editing.
collabora.domain¶
Type: string
Required: If enabled: true
Example: collabora.kup6s.com
Collabora Ingress hostname. Should be subdomain of main domain.
collabora.resources¶
Type: ResourceSpec
Required: If enabled: true
Resource allocation for Collabora pods.
Recommended:
requests:
cpu: 100m
memory: 512Mi
limits:
cpu: 1000m
memory: 1Gi
whiteboard¶
whiteboard.enabled¶
Type: boolean
Required: Yes
Example: true
Enable Nextcloud Whiteboard app.
whiteboard.resources¶
Type: ResourceSpec
Required: If enabled: true
Resource allocation for Whiteboard pod.
Recommended:
requests:
cpu: 50m
memory: 256Mi
limits:
cpu: 500m
memory: 512Mi
Example Configurations¶
Production (Multi-User)¶
namespace: nextcloudprod
domain: cloud.example.com
versions:
nextcloud: "31.0.13"
postgres: "16"
redis: "7.4"
collabora: "25.04.8.2.1"
whiteboard: "latest"
s3:
endpoint: https://fsn1.your-objectstorage.com
region: fsn1
buckets:
data: data-nextcloudprod-kup6s
backups: backups-nextcloudprod-kup6s
storage:
storageClass: longhorn
postgresSize: 20Gi
redisSize: 5Gi
resources:
nextcloud:
requests:
cpu: 500m
memory: 1Gi
limits:
cpu: 2000m
memory: 4Gi
postgres:
requests:
cpu: 200m
memory: 512Mi
limits:
cpu: 1000m
memory: 1Gi
redis:
requests:
cpu: 100m
memory: 256Mi
limits:
cpu: 500m
memory: 512Mi
replicas:
nextcloud: 1 # RWO limitation
postgres: 2
redis: 1
collabora:
enabled: true
domain: collabora.example.com
resources:
requests:
cpu: 100m
memory: 512Mi
limits:
cpu: 1000m
memory: 1Gi
whiteboard:
enabled: true
resources:
requests:
cpu: 50m
memory: 256Mi
limits:
cpu: 500m
memory: 512Mi
Development (Single User)¶
namespace: nextclouddev
domain: dev.kup6s.com
versions:
nextcloud: "31.0.13"
postgres: "16"
redis: "7.4"
collabora: "25.04.8.2.1"
whiteboard: "latest"
s3:
endpoint: https://fsn1.your-objectstorage.com
region: fsn1
buckets:
data: data-nextclouddev-kup6s
backups: backups-nextclouddev-kup6s
storage:
storageClass: longhorn
postgresSize: 10Gi
redisSize: 5Gi
resources:
nextcloud:
requests:
cpu: 100m
memory: 256Mi
limits:
cpu: 500m
memory: 1Gi
postgres:
requests:
cpu: 50m
memory: 128Mi
limits:
cpu: 200m
memory: 256Mi
redis:
requests:
cpu: 25m
memory: 64Mi
limits:
cpu: 100m
memory: 128Mi
replicas:
nextcloud: 1
postgres: 1 # No HA in dev
redis: 1
collabora:
enabled: false # Disable for dev
whiteboard:
enabled: false # Disable for dev
Validation¶
Check Configuration¶
# Validate YAML syntax
yamllint config.yaml
# Check for required fields
yq eval '.namespace, .domain, .versions.nextcloud' config.yaml
Test Manifest Generation¶
# Generate manifests
npm run synth
# Validate Kubernetes resources
kubectl apply --dry-run=client -f manifests/*.k8s.yaml
# Check for common issues
kubectl apply --dry-run=server -f manifests/*.k8s.yaml