diff --git a/flux2/apps/zulip/zulip-data-pvc.yaml b/flux2/apps/zulip/zulip-data-pvc.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..bea64b1ccd5d8c3945db37bfe9a1b7a5e88f7abb
--- /dev/null
+++ b/flux2/apps/zulip/zulip-data-pvc.yaml
@@ -0,0 +1,13 @@
+---
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+  name: zulip-data
+spec:
+  accessModes:
+    - ReadWriteOnce
+  volumeMode: Filesystem
+  resources:
+    requests:
+      storage: 2Gi
+  storageClassName: local-path
diff --git a/flux2/apps/zulip/zulip-postgres-pvc.yaml b/flux2/apps/zulip/zulip-postgres-pvc.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..c094878204ee856477326d41728a42d8f083b45f
--- /dev/null
+++ b/flux2/apps/zulip/zulip-postgres-pvc.yaml
@@ -0,0 +1,13 @@
+---
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+  name: zulip-postgres
+spec:
+  accessModes:
+    - ReadWriteOnce
+  volumeMode: Filesystem
+  resources:
+    requests:
+      storage: 2Gi
+  storageClassName: local-path
diff --git a/flux2/apps/zulip/zulip-redis-pvc.yaml b/flux2/apps/zulip/zulip-redis-pvc.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..6890704a47c11be6c760946e2d74da80a8318e1f
--- /dev/null
+++ b/flux2/apps/zulip/zulip-redis-pvc.yaml
@@ -0,0 +1,13 @@
+---
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+  name: zulip-redis
+spec:
+  accessModes:
+    - ReadWriteOnce
+  volumeMode: Filesystem
+  resources:
+    requests:
+      storage: 2Gi
+  storageClassName: local-path
diff --git a/flux2/apps/zulip/zulip-values-configmap.yaml b/flux2/apps/zulip/zulip-values-configmap.yaml
index 628cbd7fbf222e07adaadfe8e39bb10cd838357b..15f0f9c539eb4a98773f073d3851bc74d294f683 100644
--- a/flux2/apps/zulip/zulip-values-configmap.yaml
+++ b/flux2/apps/zulip/zulip-values-configmap.yaml
@@ -41,6 +41,8 @@ data:
     redis:
       auth:
         password: "${redis_password}"
+      persistence:
+        existingClaim: zulip-redis
       resources:
         limits:
           cpu: 200m
@@ -50,6 +52,8 @@ data:
           memory: 32Mi
 
     postgresql:
+      persistence:
+        existingClaim: zulip-postgres
       postgresqlPassword: "${postgresql_password}"
       resources:
         limits:
@@ -88,6 +92,8 @@ data:
         requests:
           cpu: 400m
           memory: 1Gi
+      persistence:
+        existingClaim: zulip-data
 
     postSetup:
       scripts: