diff --git a/keyserver/bash/scp-backup.sh b/keyserver/bash/scp-backup.sh
new file mode 100755
--- /dev/null
+++ b/keyserver/bash/scp-backup.sh
@@ -0,0 +1,49 @@
+#!/usr/bin/env bash
+
+set -e
+
+# Use like scp: bash/scp-backup.sh server:backup_src/ backup_dest/
+# - Will scp the latest backup from backup_src/
+# - Will make sure disk usage doesn't exceed $MAX_DISK_USAGE_KB in backup_dest/
+
+# The maximum amount of space to spend on backups
+MAX_DISK_USAGE_KB=5242880 # 5 GiB
+
+SCP_SOURCE=$1
+SCP_DEST_FOLDER=$2
+
+SCP_SOURCE_SERVER=$(cut -d: -f1 <<< "$SCP_SOURCE")
+SCP_SOURCE_FOLDER=$(cut -d: -f2 <<< "$SCP_SOURCE")
+NEWEST_BACKUP=$(ssh "$SCP_SOURCE_SERVER" 'find "'$SCP_SOURCE_FOLDER'" -maxdepth 1 -name "comm.*.sql.gz" -type f -printf "%T+ %p\n" | sort | tail -n 1 | cut -d " " -f2')
+
+function remove_oldest_backup {
+  OLDEST_BACKUP=$(find "$SCP_DEST_FOLDER" -maxdepth 1 -name 'comm.*.sql.gz' -type f -printf "%T+ %p\n" | sort | head -n 1 | cut -d ' ' -f2- | cut -d '' -f1)
+  if [[ ! "$OLDEST_BACKUP" ]]; then
+    return 1
+  fi
+  rm -f "$OLDEST_BACKUP"
+  return 0
+}
+
+RETRIES=2
+while [[ $RETRIES -ge 0 ]]; do
+  if scp "$SCP_SOURCE_SERVER":"$NEWEST_BACKUP" "$SCP_DEST_FOLDER"; then
+    break
+  fi
+  rm -f "$SCP_DEST_FOLDER"/"$NEWEST_BACKUP"
+
+  remove_oldest_backup || break
+  ((RETRIES--))
+done
+
+while true; do
+  TOTAL_USAGE=$(sudo du -cs "$SCP_DEST_FOLDER"/comm.*.sql.gz | awk '/total/ { print $1 }')
+  if [[ $TOTAL_USAGE -le $MAX_DISK_USAGE_KB ]]; then
+    break
+  fi
+  BACKUP_COUNT=$(find "$SCP_DEST_FOLDER" -maxdepth 1 -name "comm.*.sql.gz" -type f | wc -l)
+  if [[ $BACKUP_COUNT -lt 2 ]]; then
+    break
+  fi
+  remove_oldest_backup || break
+done