diff --git a/roles/debian_server/files/btrfs-scrub b/roles/debian_server/files/btrfs-scrub
new file mode 100755
index 0000000000000000000000000000000000000000..ac980d35477713f3f7284d53a0c3bd9a5c3a9483
--- /dev/null
+++ b/roles/debian_server/files/btrfs-scrub
@@ -0,0 +1,16 @@
+#!/bin/sh
+set -eu
+
+for mp in $(lsblk --list --noheadings --output fstype,mountpoint | \
+            awk '$1 == "btrfs" {print $2}' | \
+            sort -u)
+do
+    status="$(btrfs scrub status "$mp" | awk '$1 == "Status:" {print $2}')"
+    if [ "$status" = 'running' ]
+    then
+        echo "Scrub already running on $mp, skipping." >&2
+        continue
+    fi
+    btrfs scrub start "$mp"
+    echo "Started scrub on $mp." >&2
+done
diff --git a/roles/debian_server/files/scrub.service b/roles/debian_server/files/scrub.service
new file mode 100644
index 0000000000000000000000000000000000000000..62f1c8d1784d0441a3b1f9c2b51fa1356cb597f2
--- /dev/null
+++ b/roles/debian_server/files/scrub.service
@@ -0,0 +1,8 @@
+[Unit]
+Description=Scrub btrfs volumes
+ConditionACPower=true
+After=local-fs.target
+
+[Service]
+Type=oneshot
+ExecStart=btrfs-scrub
diff --git a/roles/debian_server/files/scrub.timer b/roles/debian_server/files/scrub.timer
new file mode 100644
index 0000000000000000000000000000000000000000..849656575316cc6206698771d3d778fe028d5b5d
--- /dev/null
+++ b/roles/debian_server/files/scrub.timer
@@ -0,0 +1,8 @@
+[Unit]
+Description=Scrub btrfs volumes
+
+[Timer]
+OnCalendar=weekly
+
+[Install]
+WantedBy=multi-user.target
diff --git a/roles/debian_server/tasks/main.yml b/roles/debian_server/tasks/main.yml
index 0a4df56d1b7d696e2b19021f4ad85dad424ef2bc..4abc17698e305f7d234a0681420bf60cfa4ad596 100644
--- a/roles/debian_server/tasks/main.yml
+++ b/roles/debian_server/tasks/main.yml
@@ -233,3 +233,24 @@
     enabled: true
     name: update.timer
     state: started
+
+- name: Copy the btrfs scrub script
+  ansible.builtin.copy:
+    dest: /usr/local/sbin/btrfs-scrub
+    mode: 0o0755
+    src: btrfs-scrub
+
+- name: Copy btrfs scrub service and timer
+  loop:
+    - scrub.service
+    - scrub.timer
+  ansible.builtin.copy:
+    dest: /etc/systemd/system
+    mode: 0o0644
+    src: '{{ item }}'
+
+- name: Enable the btrfs scrub timer
+  ansible.builtin.systemd:
+    enabled: true
+    name: scrub.timer
+    state: started