@@ -8,6 +8,65 @@ For performing backups, Neo4j uses the _Admin Service_, which is only available
88For more information, see xref:kubernetes/accessing-neo4j.adoc[Accessing Neo4j]. 
99==== 
1010
11+ [[kubernetes-backup-modes]]
12+ == Backup modes
13+ 
14+ Neo4j's Helm chart supports two backup modes:
15+ 
16+ === Cloud provider mode
17+ Uses Neo4j's native cloud storage integration with direct upload to create immutable backup objects:
18+ 
19+ * **Supported providers**: AWS S3, Google Cloud Storage, Azure Blob Storage
20+ * **Benefits**: No persistent volume requirements, supports differential backups, immutable backup objects
21+ * **Configuration**: Set `cloudProvider` to `aws`, `gcp`, or `azure`
22+ 
23+ === Local mode  
24+ Creates local backups in `/backups` mount:
25+ 
26+ * **Requirements**: Persistent storage for large databases (configured via `tempVolume`)
27+ * **Configuration**: Leave `cloudProvider` empty
28+ 
29+ [[kubernetes-cloud-native-features]]
30+ == Cloud-native backup features
31+ 
32+ When using cloud providers, Neo4j's native backup provides:
33+ 
34+ * **Direct cloud storage upload** - No intermediate local storage required
35+ * **Differential backup chains** with `preferDiffAsParent: true`
36+ * **Immutable backup objects** in cloud storage
37+ * **Support for S3-compatible endpoints**
38+ * **Enhanced S3 configuration** including custom CA certificates and endpoint settings
39+ 
40+ [[kubernetes-differential-backups]]
41+ == Differential backups
42+ 
43+ For cloud providers, differential backups eliminate the need for persistent volumes:
44+ 
45+ [source, yaml, subs="attributes+,+macros"]
46+ ---- 
47+ backup: 
48+   cloudProvider: "aws" 
49+   bucketName: "my-backups" 
50+   preferDiffAsParent: true 
51+   type: "AUTO"  # First backup will be FULL, subsequent ones DIFF 
52+   fallbackToFull: true  # Fallback to FULL if DIFF fails 
53+ ---- 
54+ 
55+ **How it works:**
56+ 
57+ 1. First backup creates a FULL backup in cloud storage
58+ 2. Subsequent backups create DIFF backups that reference the cloud-stored FULL backup
59+ 3. No local storage of previous backups required
60+ 
61+ [NOTE]
62+ ==== 
63+ **`preferDiffAsParent` is fully supported and eliminates the need for persistent volumes!** 
64+ 
65+ * **Helm Value**: `backup.preferDiffAsParent: true` 
66+ * **Cloud-Native**: DIFF backups reference cloud-stored FULL backups directly 
67+ * **No PV Required**: Previous backups don't need to be stored locally 
68+ ==== 
69+ 
1170[[kubernetes-neo4j-backup-cloud]]
1271== Prepare to back up a database(s) to a cloud provider (AWS, GCP, and Azure) bucket
1372
@@ -120,6 +179,10 @@ backup:
120179  cloudProvider: "gcp" 
121180  secretName: "gcpcreds" 
122181  secretKeyName: "credentials" 
182+   # Enable cloud-native differential backups 
183+   preferDiffAsParent: true 
184+   type: "AUTO"  # First backup will be FULL, subsequent ones DIFF 
185+   fallbackToFull: true 
123186
124187consistencyCheck: 
125188  enabled: true 
@@ -145,6 +208,10 @@ backup:
145208  cloudProvider: "aws" 
146209  secretName: "awscreds" 
147210  secretKeyName: "credentials" 
211+   # Enable cloud-native differential backups 
212+   preferDiffAsParent: true 
213+   type: "AUTO"  # First backup will be FULL, subsequent ones DIFF 
214+   fallbackToFull: true 
148215
149216consistencyCheck: 
150217  enabled: true 
@@ -170,6 +237,10 @@ backup:
170237  cloudProvider: "azure" 
171238  secretName: "azurecreds" 
172239  secretKeyName: "credentials" 
240+   # Enable cloud-native differential backups 
241+   preferDiffAsParent: true 
242+   type: "AUTO"  # First backup will be FULL, subsequent ones DIFF 
243+   fallbackToFull: true 
173244
174245consistencyCheck: 
175246  enabled: true 
@@ -209,6 +280,10 @@ backup:
209280  cloudProvider: "gcp" 
210281  secretName: "" 
211282  secretKeyName: "" 
283+   # Enable cloud-native differential backups 
284+   preferDiffAsParent: true 
285+   type: "AUTO"  # First backup will be FULL, subsequent ones DIFF 
286+   fallbackToFull: true 
212287
213288consistencyCheck: 
214289  enabled: true 
@@ -236,6 +311,10 @@ backup:
236311  cloudProvider: "aws" 
237312  secretName: "" 
238313  secretKeyName: "" 
314+   # Enable cloud-native differential backups 
315+   preferDiffAsParent: true 
316+   type: "AUTO"  # First backup will be FULL, subsequent ones DIFF 
317+   fallbackToFull: true 
239318
240319consistencyCheck: 
241320  enabled: true 
@@ -262,6 +341,10 @@ backup:
262341  database: "neo4j,system" 
263342  cloudProvider: "azure" 
264343  azureStorageAccountName: "storageAccountName" 
344+   # Enable cloud-native differential backups 
345+   preferDiffAsParent: true 
346+   type: "AUTO"  # First backup will be FULL, subsequent ones DIFF 
347+   fallbackToFull: true 
265348
266349consistencyCheck: 
267350  enabled: true 
@@ -306,6 +389,16 @@ backup:
306389
307390  # Optional: Skip TLS verification (not recommended for production) 
308391  s3SkipVerify: false 
392+ 
393+   # Optional: Force path-style addressing for S3 requests 
394+   s3ForcePathStyle: true 
395+ 
396+   # Optional: Specify S3 region 
397+   s3Region: "us-east-1" 
398+ 
399+   # Alternative: Use Kubernetes secret for CA certificate 
400+   s3CASecretName: "s3-ca-cert" 
401+   s3CASecretKey: "ca.crt" 
309402---- 
310403
311404The following are examples of how to configure the backup system for different S3-compatible storage providers:
@@ -381,6 +474,31 @@ backup:
381474* Legacy MinIO support through the `minioEndpoint` parameter is deprecated - use `s3Endpoint` instead. 
382475==== 
383476
477+ === S3 CA certificate setup
478+ 
479+ For S3 endpoints with custom CA certificates:
480+ 
481+ ==== Using Kubernetes secrets
482+ 
483+ 1. **Create the CA certificate secret:**
484+ +
485+ [source, bash]
486+ ---- 
487+ kubectl create secret generic s3-ca-cert --from-file=ca.crt=/path/to/your/ca.crt 
488+ ---- 
489+ 
490+ 2. **Configure the backup job:**
491+ +
492+ [source, yaml]
493+ ---- 
494+ backup: 
495+   cloudProvider: "aws" 
496+   s3Endpoint: "https://your-s3-endpoint.com" 
497+   s3CASecretName: "s3-ca-cert" 
498+   s3CASecretKey: "ca.crt" 
499+   s3EndpointTLS: true  # Automatically set when s3CASecretName is provided 
500+ ---- 
501+ 
384502
385503[[kubernetes-neo4j-backup-on-prem]]
386504== Prepare to back up a database(s) to on-premises storage
@@ -502,6 +620,13 @@ backup:
502620  s3CACert: "" 
503621  # Optional: Skip TLS verification (not recommended for production) 
504622  s3SkipVerify: false 
623+   # Optional: Force path-style addressing for S3 requests 
624+   s3ForcePathStyle: false 
625+   # Optional: Specify S3 region 
626+   s3Region: "" 
627+   # Alternative: Use Kubernetes secret for CA certificate 
628+   s3CASecretName: "" 
629+   s3CASecretKey: "" 
505630  #name of the database to backup ex: neo4j or neo4j,system (You can provide command separated database names) 
506631  # In case of comma separated databases failure of any single database will lead to failure of complete operation 
507632  database: "" 
@@ -551,6 +676,11 @@ backup:
551676  parallelRecovery: false 
552677  verbose: true 
553678  heapSize: "" 
679+   # Enable differential backups using the latest differential backup as parent 
680+   # This eliminates the need for persistent volumes when using cloud providers 
681+   preferDiffAsParent: false 
682+   # Fallback to FULL backup if DIFF backup fails 
683+   fallbackToFull: true 
554684
555685  # https://neo4j.com/docs/operations-manual/current/backup-restore/aggregate/ 
556686  # Performs aggregate backup. If enabled, NORMAL BACKUP WILL NOT BE DONE only aggregate backup 
@@ -949,3 +1079,37 @@ For more information, see xref:backup-restore/restore-backup.adoc#restore-backup
9491079==== 
9501080To restore the `system` database, follow the steps described in xref:kubernetes/operations/dump-load.adoc[Dump and load databases (offline)]. 
9511081==== 
1082+ 
1083+ [[kubernetes-backup-migration]]
1084+ == Migration from traditional to cloud-native backups
1085+ 
1086+ To migrate from persistent volume-based backups to cloud-native:
1087+ 
1088+ 1. **Perform final traditional backup**
1089+ 2. **Upload existing backups to cloud storage** (if needed)
1090+ 3. **Update configuration** to use cloud provider
1091+ 4. **Remove persistent volume configuration**
1092+ 5. **Enable `preferDiffAsParent`** for future differential backups
1093+ 
1094+ .Example migration 
1095+ [source, yaml]
1096+ ---- 
1097+ # Before (Traditional) 
1098+ backup: 
1099+   database: "neo4j" 
1100+   databaseAdminServiceName: "neo4j-admin" 
1101+ tempVolume: 
1102+   persistentVolumeClaim: 
1103+     claimName: "backup-pvc" 
1104+ 
1105+ # After (Cloud-Native) 
1106+ backup: 
1107+   cloudProvider: "aws" 
1108+   bucketName: "neo4j-backups" 
1109+   database: "neo4j" 
1110+   databaseAdminServiceName: "neo4j-admin" 
1111+   secretName: "aws-credentials" 
1112+   secretKeyName: "credentials" 
1113+   preferDiffAsParent: true 
1114+ # tempVolume configuration removed 
1115+ ---- 
0 commit comments