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
This commit is contained in:
@@ -0,0 +1,361 @@
|
||||
# Nextcloud Backblaze B2 Backup - Deployment Checklist
|
||||
|
||||
Use this checklist to ensure your backup solution is properly deployed and working.
|
||||
|
||||
## 📋 Pre-Deployment (Before Running Installer)
|
||||
|
||||
- [ ] Read `README_NEXTCLOUD_BACKUPS.md` for overview
|
||||
- [ ] Have Backblaze B2 account ready (sign up at backblaze.com)
|
||||
- [ ] Know your Nextcloud installation path (e.g., `/srv/docker/nextcloud`)
|
||||
- [ ] Know your Nextcloud database password
|
||||
- [ ] Have root/sudo access to the system
|
||||
- [ ] Have ~10GB free disk space available
|
||||
- [ ] Ensure internet connectivity for B2 uploads
|
||||
|
||||
## 🔧 Installation Phase
|
||||
|
||||
### Run Installer
|
||||
- [ ] Run: `sudo ./install-nextcloud-backup.sh`
|
||||
- [ ] Installer completes without errors
|
||||
- [ ] All dependencies are installed
|
||||
- [ ] Directories created in `/opt/nextcloud-backup/`
|
||||
- [ ] systemd files installed
|
||||
|
||||
### Verify Installation
|
||||
- [ ] Files exist in `/opt/nextcloud-backup/`:
|
||||
```bash
|
||||
ls -la /opt/nextcloud-backup/
|
||||
```
|
||||
- [ ] Service file exists:
|
||||
```bash
|
||||
ls -la /etc/systemd/system/nextcloud-backup.*
|
||||
```
|
||||
- [ ] Config directory exists:
|
||||
```bash
|
||||
ls -la /etc/nextcloud-backup/
|
||||
```
|
||||
|
||||
## 🔑 Configuration Phase
|
||||
|
||||
### B2 Credentials (CRITICAL!)
|
||||
- [ ] Go to https://www.backblaze.com/b2/docs/application_keys.html
|
||||
- [ ] Create new Application Key
|
||||
- [ ] Note your Account ID
|
||||
- [ ] Note your Application Key (keep secret!)
|
||||
- [ ] Create bucket named `nextcloud-backups` (or your preference)
|
||||
- [ ] Edit: `sudo nano /etc/nextcloud-backup/b2-credentials.env`
|
||||
- [ ] Fill in:
|
||||
- `B2_ACCOUNT_ID=` your account ID
|
||||
- `B2_APPLICATION_KEY=` your app key
|
||||
- `B2_BUCKET_NAME=` your bucket name
|
||||
- `B2_REGION=` (e.g., us-west-002)
|
||||
- [ ] Save file (Ctrl+X, Y, Enter)
|
||||
- [ ] Check permissions: `sudo ls -la /etc/nextcloud-backup/b2-credentials.env`
|
||||
- Should show: `-rw-------` (600)
|
||||
|
||||
### Nextcloud Configuration
|
||||
- [ ] Edit: `sudo nano /opt/nextcloud-backup/.env`
|
||||
- [ ] Find your Nextcloud paths:
|
||||
```bash
|
||||
# Find docker-compose location
|
||||
find / -name "docker-compose.yml" -path "*nextcloud*" 2>/dev/null
|
||||
|
||||
# Find data directory
|
||||
find / -type d -name "nextcloud" -path "*/data" 2>/dev/null
|
||||
```
|
||||
- [ ] Fill in required fields:
|
||||
- [ ] `NEXTCLOUD_COMPOSE_DIR=` (path to docker-compose directory)
|
||||
- [ ] `NEXTCLOUD_DATA_PATH=` (path to nextcloud data folder)
|
||||
- [ ] `NEXTCLOUD_DB_NAME=` (usually `nextcloud`)
|
||||
- [ ] `NEXTCLOUD_DB_USER=` (usually `nextcloud`)
|
||||
- [ ] `NEXTCLOUD_DB_PASSWORD=` (from docker-compose or .env)
|
||||
- [ ] Review optional settings:
|
||||
- [ ] `BACKUP_RETENTION_DAYS=` (default 30)
|
||||
- [ ] `COMPRESSION=` (default zstd - recommended)
|
||||
- [ ] `BACKUP_RETENTION_DAYS=` (how long to keep backups)
|
||||
- [ ] Save file
|
||||
|
||||
### Verify Configurations
|
||||
- [ ] Check B2 credentials file exists and is readable:
|
||||
```bash
|
||||
sudo test -f /etc/nextcloud-backup/b2-credentials.env && echo "✓ Found"
|
||||
```
|
||||
- [ ] Check Nextcloud config exists:
|
||||
```bash
|
||||
sudo test -f /opt/nextcloud-backup/.env && echo "✓ Found"
|
||||
```
|
||||
- [ ] Verify B2 CLI is installed:
|
||||
```bash
|
||||
b2 version
|
||||
```
|
||||
- [ ] Test B2 authentication:
|
||||
```bash
|
||||
b2 authorize-account <YOUR_ACCOUNT_ID> <YOUR_APP_KEY>
|
||||
b2 account-info
|
||||
```
|
||||
|
||||
## 🧪 Testing Phase
|
||||
|
||||
### Dry-Run Test (No Upload)
|
||||
- [ ] Run dry-run test:
|
||||
```bash
|
||||
sudo DRY_RUN=true /opt/nextcloud-backup/nextcloud-backup-to-backblaze.sh
|
||||
```
|
||||
- [ ] Check output for errors
|
||||
- [ ] Verify it shows what WOULD be backed up
|
||||
- [ ] No actual files uploaded to B2 (good!)
|
||||
|
||||
### Manual Incremental Backup
|
||||
- [ ] Run actual backup:
|
||||
```bash
|
||||
sudo /opt/nextcloud-backup/nextcloud-backup-to-backblaze.sh incremental
|
||||
```
|
||||
- [ ] Monitor output for success
|
||||
- [ ] Check logs:
|
||||
```bash
|
||||
sudo tail -50 /opt/nextcloud-backup/.backups/logs/backup_*.log
|
||||
```
|
||||
- [ ] Verify backup was successful
|
||||
- [ ] Check B2 for uploaded files:
|
||||
```bash
|
||||
b2 list-file-names nextcloud-backups nextcloud-backups/
|
||||
```
|
||||
|
||||
### Verify Backup Contents
|
||||
- [ ] Backup includes database file: `nextcloud-db-*.sql.zst`
|
||||
- [ ] Backup includes file archive: `nextcloud-files-*.tar.zst`
|
||||
- [ ] File sizes are reasonable (not 0 bytes)
|
||||
- [ ] Timestamps are recent
|
||||
|
||||
### Test Status Command
|
||||
- [ ] Run status check:
|
||||
```bash
|
||||
sudo /opt/nextcloud-backup/nextcloud-backup-to-backblaze.sh status
|
||||
```
|
||||
- [ ] Shows last backup info
|
||||
- [ ] Shows B2 bucket contents
|
||||
- [ ] Shows recent backups
|
||||
|
||||
## ⏰ Scheduler Setup
|
||||
|
||||
### Enable Timer
|
||||
- [ ] Enable the systemd timer:
|
||||
```bash
|
||||
sudo systemctl enable nextcloud-backup.timer
|
||||
```
|
||||
- [ ] Start the timer:
|
||||
```bash
|
||||
sudo systemctl start nextcloud-backup.timer
|
||||
```
|
||||
- [ ] Check status:
|
||||
```bash
|
||||
sudo systemctl status nextcloud-backup.timer
|
||||
```
|
||||
- [ ] Should show: `active (waiting)`
|
||||
|
||||
### Verify Timer Configuration
|
||||
- [ ] View timer status:
|
||||
```bash
|
||||
sudo systemctl list-timers nextcloud-backup.timer
|
||||
```
|
||||
- [ ] Should show:
|
||||
- Timer: nextcloud-backup.timer
|
||||
- Unit: nextcloud-backup.service
|
||||
- Next trigger time (usually within 24 hours)
|
||||
|
||||
### Check Timer Logs
|
||||
- [ ] View system logs:
|
||||
```bash
|
||||
sudo journalctl -u nextcloud-backup.service -n 20
|
||||
```
|
||||
- [ ] Should show your manual test backups
|
||||
|
||||
## 🔍 Post-Deployment Verification
|
||||
|
||||
### Check Backup Execution
|
||||
- [ ] Wait for scheduled time (default 2 AM) OR manually trigger
|
||||
- [ ] Check if backup ran:
|
||||
```bash
|
||||
sudo journalctl -u nextcloud-backup.service -n 5
|
||||
```
|
||||
- [ ] Should show successful execution
|
||||
|
||||
### Monitor First Week
|
||||
- [ ] Day 1: Manual run ✓
|
||||
- [ ] Day 2-3: Automatic runs should start appearing in logs
|
||||
- [ ] Day 7: Should have multiple backups in B2
|
||||
- [ ] Monitor logs daily:
|
||||
```bash
|
||||
sudo journalctl -u nextcloud-backup.service -n 10
|
||||
```
|
||||
|
||||
### Verify B2 Storage
|
||||
- [ ] Check B2 console for uploads
|
||||
- [ ] Verify file sizes make sense
|
||||
- [ ] Confirm no upload errors
|
||||
- [ ] List backups:
|
||||
```bash
|
||||
b2 list-file-names nextcloud-backups nextcloud-backups/ | head -10
|
||||
```
|
||||
|
||||
## 🛡️ Security Verification
|
||||
|
||||
### Credential Security
|
||||
- [ ] B2 credentials file permissions (should be 600):
|
||||
```bash
|
||||
sudo ls -la /etc/nextcloud-backup/b2-credentials.env
|
||||
```
|
||||
- [ ] File NOT readable by other users
|
||||
- [ ] File NOT in git repository
|
||||
- [ ] B2 credentials NOT in logs (check with):
|
||||
```bash
|
||||
sudo grep -r "B2_ACCOUNT_ID" /opt/nextcloud-backup/ 2>/dev/null
|
||||
```
|
||||
|
||||
### Service Security
|
||||
- [ ] Service runs as root (necessary for DB dump)
|
||||
- [ ] Service has resource limits
|
||||
- [ ] Service has proper error handling
|
||||
- [ ] Service cleans up temp files
|
||||
|
||||
## 📊 Daily Operations
|
||||
|
||||
### Daily Monitoring
|
||||
- [ ] Check backup ran last night:
|
||||
```bash
|
||||
sudo journalctl -u nextcloud-backup.service -n 1 --since "24 hours ago"
|
||||
```
|
||||
- [ ] Look for "SUCCESS" messages
|
||||
- [ ] Check file sizes in B2
|
||||
|
||||
### Weekly Tasks
|
||||
- [ ] Review backup logs:
|
||||
```bash
|
||||
sudo ls -lh /opt/nextcloud-backup/.backups/logs/
|
||||
```
|
||||
- [ ] Check B2 console for cost estimates
|
||||
- [ ] Verify no error patterns in logs
|
||||
|
||||
### Monthly Tasks
|
||||
- [ ] Test restore procedure (practice!)
|
||||
- [ ] Check B2 account for any issues
|
||||
- [ ] Review retention policy (still appropriate?)
|
||||
- [ ] Monitor costs
|
||||
|
||||
## 🔄 Restore Testing (IMPORTANT!)
|
||||
|
||||
### Practice Database Restore
|
||||
- [ ] List available backups:
|
||||
```bash
|
||||
b2 list-file-names nextcloud-backups nextcloud-backups/ | grep "db"
|
||||
```
|
||||
- [ ] Download a database backup:
|
||||
```bash
|
||||
b2 download-file-by-id nextcloud-backups <FILE_ID> ~/test-db.sql.zst
|
||||
```
|
||||
- [ ] Verify it decompresses:
|
||||
```bash
|
||||
zstd -t ~/test-db.sql.zst
|
||||
```
|
||||
- [ ] (DON'T actually restore, just verify it works)
|
||||
|
||||
### Practice File Restore
|
||||
- [ ] List available file backups:
|
||||
```bash
|
||||
b2 list-file-names nextcloud-backups nextcloud-backups/ | grep "files"
|
||||
```
|
||||
- [ ] Download one:
|
||||
```bash
|
||||
b2 download-file-by-id nextcloud-backups <FILE_ID> ~/test-files.tar.zst
|
||||
```
|
||||
- [ ] Verify it extracts:
|
||||
```bash
|
||||
tar --zstd -tf ~/test-files.tar.zst | head -20
|
||||
```
|
||||
|
||||
## ⚠️ Troubleshooting Checklist
|
||||
|
||||
If something isn't working:
|
||||
|
||||
### Backup Not Running
|
||||
- [ ] Check timer status: `sudo systemctl status nextcloud-backup.timer`
|
||||
- [ ] Check service logs: `sudo journalctl -u nextcloud-backup.service -n 50`
|
||||
- [ ] Verify paths exist: `ls /srv/docker/nextcloud/data`
|
||||
- [ ] Test B2 auth: `b2 account-info`
|
||||
- [ ] Run manual test: `sudo DRY_RUN=true /opt/nextcloud-backup/nextcloud-backup-to-backblaze.sh`
|
||||
|
||||
### B2 Upload Fails
|
||||
- [ ] Check B2 credentials: `cat /etc/nextcloud-backup/b2-credentials.env`
|
||||
- [ ] Re-authenticate: `b2 authorize-account <ID> <KEY>`
|
||||
- [ ] Verify bucket exists: `b2 list-buckets`
|
||||
- [ ] Check account quotas in B2 console
|
||||
|
||||
### Database Dump Fails
|
||||
- [ ] Verify DB password in config: `sudo cat /opt/nextcloud-backup/.env | grep DB_PASSWORD`
|
||||
- [ ] Test DB connection manually: `sudo docker-compose ... exec mariadb mysql ...`
|
||||
- [ ] Check DB container is running: `docker ps | grep -i mariadb`
|
||||
|
||||
### Permission Denied Errors
|
||||
- [ ] Check script is executable: `ls -la /opt/nextcloud-backup/nextcloud-backup-to-backblaze.sh`
|
||||
- [ ] Check data directory readable: `sudo ls /srv/docker/nextcloud/data`
|
||||
- [ ] Verify running as root: `whoami` (should show root when using sudo)
|
||||
|
||||
## ✅ Final Checklist
|
||||
|
||||
Before considering deployment complete:
|
||||
|
||||
- [ ] Installer ran successfully
|
||||
- [ ] All configurations edited with real values
|
||||
- [ ] Dry-run test passed
|
||||
- [ ] Manual incremental backup successful
|
||||
- [ ] Files visible in B2 bucket
|
||||
- [ ] Timer enabled and active
|
||||
- [ ] First automatic backup completed
|
||||
- [ ] B2 credentials stored securely
|
||||
- [ ] Restore procedures tested (at least once)
|
||||
- [ ] Monitoring plan in place
|
||||
- [ ] Team aware of backup solution
|
||||
- [ ] Documentation saved/accessible
|
||||
|
||||
## 📞 Quick Reference
|
||||
|
||||
**Backup Status**
|
||||
```bash
|
||||
sudo /opt/nextcloud-backup/nextcloud-backup-to-backblaze.sh status
|
||||
```
|
||||
|
||||
**View Logs**
|
||||
```bash
|
||||
sudo journalctl -u nextcloud-backup.service -n 50
|
||||
sudo tail -f /opt/nextcloud-backup/.backups/logs/backup_*.log
|
||||
```
|
||||
|
||||
**Manual Backup**
|
||||
```bash
|
||||
sudo /opt/nextcloud-backup/nextcloud-backup-to-backblaze.sh incremental
|
||||
```
|
||||
|
||||
**Timer Status**
|
||||
```bash
|
||||
sudo systemctl status nextcloud-backup.timer
|
||||
sudo systemctl list-timers nextcloud-backup.timer
|
||||
```
|
||||
|
||||
## 📞 Emergency Contacts
|
||||
|
||||
If you encounter issues:
|
||||
1. Check logs: `journalctl -u nextcloud-backup.service -n 100`
|
||||
2. See troubleshooting in `NEXTCLOUD_BACKBLAZE_SETUP.md`
|
||||
3. Verify B2 credentials with: `b2 account-info`
|
||||
4. Test manually: `sudo DRY_RUN=true /opt/nextcloud-backup/nextcloud-backup-to-backblaze.sh`
|
||||
|
||||
---
|
||||
|
||||
**Deployment Date**: _______________
|
||||
**Deployed By**: _______________
|
||||
**Status**: [ ] Complete [ ] In Progress [ ] Failed
|
||||
**Notes**:
|
||||
|
||||
---
|
||||
|
||||
**Remember**: Test your restore procedures monthly! A backup that hasn't been tested is not a backup.
|
||||
Reference in New Issue
Block a user