Introduction
An untested backup isn't a backup. A backup at the same place as the server is only half a backup. This guide gives you a realistic 3-2-1 strategy: 3 copies, 2 different media, 1 offsite, with encryption and automatic rotation.
Prerequisites
- A Minecraft server at VeryCloud (Paper / Spigot / Fabric / Forge / Vanilla)
- Wisp panel access
- An external VPS or S3 / B2 storage for offsite
- restic installed on the external VPS
Step 1: Local Wisp backup schedule
- Panel → Schedules → Create Schedule:
- Name:
Daily backup 4 AM - Cron:
0 4 * * * - Only when online: yes
- Name:
- Add Task: Create Backup, name
daily-{date}
Keep 7 days deep.
Step 2: Weekly schedule with longer retention
Name: Weekly backup Sunday 5 AM
Cron: 0 5 * * 0
Task: Create Backup
Step 3: Why offsite is non-negotiable
All backups in Wisp = same infrastructure as the server. If infra goes down, you lose everything. restic is the go-to: open source, native dedup, AES-256, multi-backend.
Step 4: Install restic
apt update && apt install -y restic
restic version
Step 5: Initialize the repo
export RESTIC_PASSWORD="A_VERY_LONG_RANDOM_PASS"
export RESTIC_REPOSITORY="/backups/restic-mc"
# Or for S3:
# export RESTIC_REPOSITORY="s3:s3.amazonaws.com/my-bucket"
restic init
⚠️ Save this password elsewhere. Without it, backups are unrecoverable.
Step 6: SFTP pull + restic script
#!/bin/bash
set -e
WISP_HOST="sftp.verycloud.fr"
WISP_PORT="2022"
WISP_USER="your.wisp.user"
WISP_KEY="/root/.ssh/wisp_id_ed25519"
WORKDIR="/tmp/mc-backup-$(date +%s)"
mkdir -p "$WORKDIR"
sftp -i $WISP_KEY -P $WISP_PORT -r "$WISP_USER@$WISP_HOST:/world*" "$WORKDIR/"
sftp -i $WISP_KEY -P $WISP_PORT -r "$WISP_USER@$WISP_HOST:/plugins" "$WORKDIR/"
sftp -i $WISP_KEY -P $WISP_PORT "$WISP_USER@$WISP_HOST:/server.properties" "$WORKDIR/"
sftp -i $WISP_KEY -P $WISP_PORT "$WISP_USER@$WISP_HOST:/ops.json" "$WORKDIR/"
sftp -i $WISP_KEY -P $WISP_PORT "$WISP_USER@$WISP_HOST:/whitelist.json" "$WORKDIR/"
export RESTIC_PASSWORD_FILE="/root/.restic-pass"
export RESTIC_REPOSITORY="/backups/restic-mc"
restic backup "$WORKDIR" --tag minecraft --tag $(date +%F)
rm -rf "$WORKDIR"
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune
if [ "$(date +%u)" = "7" ]; then
restic check
fi
/root/.restic-pass chmod 600.
Step 7: Cron
0 5 * * * /usr/local/bin/mc-backup-offsite.sh >> /var/log/mc-backup.log 2>&1
Step 8: Test a restore
restic snapshots
restic restore latest --target /tmp/test-restore
ls -la /tmp/test-restore
If coherent, your chain works.
Step 9: Retention strategy
| Level | Location | Frequency | Retention |
|---|---|---|---|
| 1 | Wisp local | Daily 4 AM | 7 days |
| 2 | Wisp local | Weekly Sun 5 AM | 4 weeks |
| 3 | External VPS + restic | Daily 5 AM | 7d + 4w + 6m |
| 4 (opt) | S3/B2 via restic | Weekly | 12 months |
Level 4 = extreme disaster recovery. A few €/month.
Troubleshooting
SFTP asks for password — generate SSH key, upload to Wisp Settings → SSH Keys.
restic "wrong password" — invisible chars in file. Check cat -A /root/.restic-pass.
External disk full — restic forget --prune actually frees space.
Minecraft world corrupted in pull — send save-off via RCON first, or only download Wisp's native archives.
Useful commands
restic snapshots
restic stats
restic stats --mode raw-data
restic restore <snapshot-id> --target /tmp/restore
restic check --read-data
Conclusion
Pro Minecraft backups = Wisp for daily + restic offsite for resilience. ~€3/month for B2 100 GB vs losing a whole season — no contest.
Going further: Slack/Discord alerts on failure, restic + healthchecks.io, multi-server dedup.

















