diff --git a/Compose/matrix/crond/.dockerignore b/Compose/matrix/crond/.dockerignore
new file mode 100644
index 0000000000000000000000000000000000000000..93f29ef32f38a162dbfb387e72cddecf712abd36
--- /dev/null
+++ b/Compose/matrix/crond/.dockerignore
@@ -0,0 +1,3 @@
+*
+!backup
+!crontab
diff --git a/Compose/matrix/crond/Dockerfile b/Compose/matrix/crond/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..006a75ebbcd51b5a684cc3308492ff4cef2b171f
--- /dev/null
+++ b/Compose/matrix/crond/Dockerfile
@@ -0,0 +1,13 @@
+
+# hadolint ignore=DL3006
+FROM registry.shore.co.il/cron as supersonic
+# hadolint ignore=DL3002
+USER root
+# hadolint ignore=DL3018
+RUN apk add --update --no-cache \
+    docker-cli \
+    findutils \
+    ;
+COPY --chown=root:root backup /usr/local/bin/
+COPY --chown=root:root restore /usr/local/bin/
+VOLUME /var/backups
diff --git a/Compose/matrix/crond/README.md b/Compose/matrix/crond/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..c612af35729a8e2f301ffb4fdce95518f0de46b5
--- /dev/null
+++ b/Compose/matrix/crond/README.md
@@ -0,0 +1,5 @@
+# crond
+
+Runs background jobs for the Matrix server. The jobs are:
+
+- Postgres DB backup.
diff --git a/Compose/matrix/crond/backup b/Compose/matrix/crond/backup
new file mode 100755
index 0000000000000000000000000000000000000000..e338f791456beb5755e255551d1b2e7e8fa0d6c9
--- /dev/null
+++ b/Compose/matrix/crond/backup
@@ -0,0 +1,7 @@
+#!/bin/sh
+set -eu
+
+now="$(date --utc -Iseconds)"
+dest="/var/backups/${now}.sql.zstd"
+mkdir --parents "$(dirname "$dest")"
+docker exec matrix-postgres-1 backup > "$dest"
diff --git a/Compose/matrix/crond/crontab b/Compose/matrix/crond/crontab
new file mode 100644
index 0000000000000000000000000000000000000000..2aac7acbbf45c5f238468504963c625c587c1b03
--- /dev/null
+++ b/Compose/matrix/crond/crontab
@@ -0,0 +1,2 @@
+@weekly backup || wget --spider https://notify.shore.co.il/send?message=Matrix%20DB%20backup%20failed.
+@daily find /var/backups -atime +18 -delete
diff --git a/Compose/matrix/docker-compose.yaml b/Compose/matrix/docker-compose.yaml
index c955fded15207a4b821ae4dc9ce63342c64ed559..88f8a8644641b1b6758274b99d86e1aef2765ca5 100644
--- a/Compose/matrix/docker-compose.yaml
+++ b/Compose/matrix/docker-compose.yaml
@@ -2,6 +2,16 @@
 version: '3.5'
 
 services:
+  cron:
+    build:
+      context: crond/
+    depends_on:
+      - postgres
+    restart: always
+    volumes:
+      - /run/docker.sock:/run/docker.sock
+      - /var/backups/matrix:/var/backups
+
   postgres:
     environment:
       POSTGRES_DB: &postgres_db synapse
@@ -39,6 +49,8 @@ services:
 
 volumes:
   data:
+    labels:
+      snapshot: 'true'
   postgres:
   _run_slapd:
     external: true