Files
homelab-configs/BACKUP_QUICK_START.md
jgitta 2625cf36d2 Add: Nextcloud Backblaze B2 backup solution - automated daily backups
- Complete backup script for native Nextcloud (MySQL + files)
- Systemd service and timer for daily automated backups at 2 AM
- Backblaze B2 integration with secure credential storage
- Incremental backup support with 30-day retention
- zstd compression for 40-70% storage reduction
- Comprehensive documentation and deployment guides
- Successfully tested with first backup: 203MB DB + 1.3GB files
- Cost-optimized: ~/bin/bash.01-0.02/month for 1.5GB data

Deployment Details:
- Installed B2 CLI via pipx
- Created backup directories at /opt/nextcloud-backup/
- Configured systemd timer for daily execution at 2 AM
- First backup verified in B2 bucket: jg-nextcloud
- Automated scheduling enabled and tested

Documentation includes:
- Deployment report with complete setup details
- Quick start guide for future deployments
- Comprehensive technical reference
- Troubleshooting procedures
- File manifest and index
2026-04-25 18:00:07 -05:00

5.0 KiB

Nextcloud Backblaze B2 Backup - Quick Start Guide

TL;DR Installation (5 minutes)

1. Install Everything

sudo ./install-nextcloud-backup.sh

2. Configure B2 Credentials

# Get your B2 Account ID and Application Key from:
# https://www.backblaze.com/b2/docs/application_keys.html

sudo nano /etc/nextcloud-backup/b2-credentials.env
# Add:
# B2_ACCOUNT_ID=your_account_id
# B2_APPLICATION_KEY=your_app_key
# B2_BUCKET_NAME=nextcloud-backups

3. Configure Nextcloud Details

sudo nano /opt/nextcloud-backup/.env
# Edit these for your setup:
# NEXTCLOUD_DATA_PATH=/srv/docker/nextcloud/data
# NEXTCLOUD_DB_PASSWORD=your_db_password

4. Test Backup

# Dry run (no upload)
sudo DRY_RUN=true /opt/nextcloud-backup/nextcloud-backup-to-backblaze.sh

# Real backup
sudo /opt/nextcloud-backup/nextcloud-backup-to-backblaze.sh incremental

5. Enable Automated Backups

sudo systemctl enable nextcloud-backup.timer
sudo systemctl start nextcloud-backup.timer

6. Verify It's Running

sudo systemctl list-timers nextcloud-backup.timer
sudo systemctl status nextcloud-backup.timer

Done! Your Nextcloud now backs up daily to Backblaze B2.


Common Commands

# Manual backup (incremental)
sudo /opt/nextcloud-backup/nextcloud-backup-to-backblaze.sh incremental

# Manual backup (full)
sudo /opt/nextcloud-backup/nextcloud-backup-to-backblaze.sh full

# Check backup status
sudo /opt/nextcloud-backup/nextcloud-backup-to-backblaze.sh status

# View logs
sudo tail -f /opt/nextcloud-backup/.backups/logs/backup_*.log

# Check timer status
sudo systemctl status nextcloud-backup.timer

# View last 50 backup runs
sudo journalctl -u nextcloud-backup.service -n 50

# Live monitor backups
sudo journalctl -u nextcloud-backup.service -f

File Locations

/opt/nextcloud-backup/
├── .env                           # Configuration (edit this!)
├── .backups/
│   ├── logs/                      # Backup logs
│   └── .backup-state.json        # Last backup info
├── .backups/logs/backup_*.log    # Detailed logs
└── nextcloud-backup-to-backblaze.sh  # Main script

/etc/nextcloud-backup/
└── b2-credentials.env            # B2 API credentials (keep secret!)

/etc/systemd/system/
├── nextcloud-backup.service      # Backup service
└── nextcloud-backup.timer        # Scheduler

What Gets Backed Up?

All Nextcloud files - Documents, photos, videos, etc.
Database - All settings, users, sharing info
Compressed - Smaller files = lower costs
Incremental - Only changed files daily (faster)


Backup Schedule

Default: Daily at 2 AM

To change time, edit: /etc/systemd/system/nextcloud-backup.timer

Then: sudo systemctl daemon-reload && sudo systemctl restart nextcloud-backup.timer


Storage Costs (Backblaze B2)

Typical Nextcloud: 100GB After compression: ~30-40GB Monthly cost: $0.18-0.24


Restore Instructions

Restore Database

# Find backup ID in B2
b2 list-file-names nextcloud-backups nextcloud-backups/ | jq

# Download
b2 download-file-by-id nextcloud-backups <FILE_ID> ./db-backup.sql.zst

# Restore
zstd -d db-backup.sql.zst -c | mysql -u root -p nextcloud

Restore Files

# Download
b2 download-file-by-id nextcloud-backups <FILE_ID> ./files-backup.tar.zst

# Extract
mkdir /tmp/restore && tar --zstd -xf files-backup.tar.zst -C /tmp/restore

# Copy back
cp -r /tmp/restore/srv/docker/nextcloud/data/* /srv/docker/nextcloud/data/

Troubleshooting

Backup fails immediately

# Check logs
sudo tail -100 /opt/nextcloud-backup/.backups/logs/backup_*.log

# Check B2 auth
b2 account-info

# Verify paths
sudo ls -la /srv/docker/nextcloud/data

B2 authentication error

# Clear cached auth
rm ~/.b2_account_info

# Re-authenticate
b2 authorize-account YOUR_ACCOUNT_ID YOUR_APP_KEY

Timer not running

# Check status
sudo systemctl status nextcloud-backup.timer

# Enable it
sudo systemctl enable nextcloud-backup.timer
sudo systemctl start nextcloud-backup.timer

Disk space issues

# Check backup dir size
du -sh /opt/nextcloud-backup/.backups

# Reduce retention (fewer days to keep)
# Edit: /opt/nextcloud-backup/.env
# BACKUP_RETENTION_DAYS=14

Security Best Practices

  1. Protect B2 credentials - Limit access to /etc/nextcloud-backup/
  2. Monitor B2 activity - Check console monthly for unusual uploads
  3. Test restores - Practice restoring monthly
  4. Rotate keys - Generate new B2 keys annually
  5. Keep logs - Monitor for errors in /opt/nextcloud-backup/.backups/logs/

Need Help?

See full documentation: NEXTCLOUD_BACKBLAZE_SETUP.md

Key sections:

  • Installation Issues - Dependencies, paths
  • Backup Not Working - Database, permissions
  • Restore Guide - Full restore procedures
  • Cost Optimization - Reduce B2 spending
  • Advanced Config - Custom schedules, hooks