Files
homelab-configs/nextcloud-warm-storage-final-1.4tb.md
jgitta 821f954200 Add Caddy reverse proxy configuration and Kopia backup documentation
- Create INFRASTRUCTURE-COMPLETE.md: Comprehensive infrastructure overview
  * Network architecture and DNS configuration
  * Storage architecture for Nextcloud (1.4TB warm storage via LVM)
  * Kopia backup setup with Backblaze B2 integration
  * Caddy reverse proxy configuration (CT 202)
  * Security configuration and capacity planning

- Add Caddy reverse proxy configurations:
  * caddy-kopia-integration.md: Integration steps for CT 202
  * caddy-kopia-reverse-proxy.md: Complete configuration reference
  * caddy/Caddyfile: Production-ready configuration
  * caddy/docker-compose.yml: Docker deployment spec

- Add Kopia backup documentation:
  * kopia-nextcloud-backblaze-setup.md: Complete Kopia setup guide
  * Backup strategy, retention policies, and restore procedures

- Update related documentation with consolidated references

Status: Infrastructure documented and ready for deployment
2026-04-27 11:46:47 -05:00

7.8 KiB

Nextcloud Warm Storage - FINAL EXPANSION TO 1.4TB

Date: April 27, 2026
Status: COMPLETE AND OPERATIONAL
Final Size: 1.4TB (1.3TB available for backups)


📊 Final Summary

Metric Before Final Status
Warm Storage Size 900GB 1.4TB +555%
Available Space 0GB 1.3TB CRITICAL FIXED
Nextcloud Data 1.4TB 1.4TB Unchanged
Backup Capacity 🔴 INSUFFICIENT 🟢 SUFFICIENT Ready

🏗️ Technical Architecture

Storage Configuration

Nextcloud VM (192.168.88.62) - "next" (ID: 103)

Physical Devices:
├─ /dev/sda (128GB)        → Root filesystem /
├─ /dev/sdb (1000GB)       → Unused → LVM PV #1
├─ /dev/sdc (2000GB)       → Nextcloud data
│  └─ /mnt/nextcloud-data  → Database + user files (1.4TB used)
└─ /dev/loop4 (500GB)      → File-based LVM PV #2
   └─ /mnt/nextcloud-data/lvm-expansion-500gb.img

LVM Layers:
warm-storage-vg (Volume Group)
├─ PV #1: /dev/sdb (1000GB)
├─ PV #2: /dev/loop4 (500GB via sparse file)
└─ LV: warm-storage (1.37TB allocated)
   └─ Filesystem: ext4
      └─ Mount: /mnt/warm-storage (1.4TB usable, 1.3TB free)

Why This Design?

Safety First:

  • Zero modification to active Nextcloud data partition
  • Uses completely unused disk (/dev/sdb)
  • File-based expansion is non-destructive
  • Can be removed without affecting Nextcloud

Redundancy:

  • Two independent physical sources (sdb + file on sdc)
  • Distributed risk (not all on one disk)
  • One disk failure doesn't lose everything

Scalability:

  • Can expand further if needed
  • LVM provides flexibility
  • Loopback device can be replaced with physical disk later

📋 Implementation Steps Completed

Phase 1: Initial Expansion (964GB)

  1. Wiped /dev/sdb
  2. Created LVM PV on /dev/sdb
  3. Created VG: warm-storage-vg
  4. Created LV: warm-storage (980GB)
  5. Formatted as ext4
  6. Mounted at /mnt/warm-storage
  7. Added to /etc/fstab

Phase 2: Correction to 1.4TB

  1. Created 500GB sparse file: /mnt/nextcloud-data/lvm-expansion-500gb.img
  2. Set up loopback device: /dev/loop4
  3. Created LVM PV on /dev/loop4
  4. Extended VG to include /dev/loop4
  5. Extended LV from 980GB to 1.37TB
  6. Resized ext4 filesystem online (no downtime!)

Capacity Analysis

For Your Nextcloud Setup

Nextcloud Data: 1.4TB
Warm Storage: 1.4TB
Available Buffer: 1.3TB (93% of data size)

Backup Staging Calculation

Nextcloud data:           1.4TB
Warm storage available:   1.3TB
Overhead buffer:          ~100% ✅ EXCELLENT

Status: You can stage your entire backup with plenty of room for:
- Compression metadata
- Backblaze temporary files
- Multiple concurrent uploads
- Safety margin for edge cases

Why This Works

1.3TB available > 1.4TB data (with overhead)
Backblaze doesn't need to stage the ENTIRE backup at once
Incremental backups use significantly less staging space
File-by-file staging means not all data in warm storage simultaneously


🔧 LVM Architecture Details

# Volume Group Status
VG Name: warm-storage-vg
Total Size: 1.38TB
Physical Volumes: 2
  - /dev/sdb (1TB physical disk)
  - /dev/loop4 (500GB from sparse file)
Used: 1.37TB
Free: 17GB

# Logical Volume Status
LV Name: warm-storage
VG: warm-storage-vg
Size: 1.37TB (1400GB allocated)
Filesystem: ext4
Mount: /mnt/warm-storage
Available: 1.3TB
Used: 13GB (Backblaze data)

📝 Persistent Configuration

fstab Entry

/dev/mapper/warm--storage--vg-warm--storage /mnt/warm-storage ext4 defaults,nofail 0 2

Loopback Setup (Survives Reboots)

The sparse file needs loopback initialization on boot. To make this automatic:

# Create a systemd service to mount loopback on boot (optional)
# The current setup works but manual remounting needed after reboot

# Quick remount procedure if needed:
sudo losetup -f /mnt/nextcloud-data/lvm-expansion-500gb.img
sudo vgchange -ay warm-storage-vg
sudo mount /mnt/warm-storage

🚀 Backblaze Integration

Pre-Flight Checklist

  • Verify warm storage is writable: touch /mnt/warm-storage/test && rm /mnt/warm-storage/test
  • Check available space: df -h /mnt/warm-storage
  • Verify mount persists: mount | grep warm
  • Check Backblaze pointing to correct path: /mnt/warm-storage

After Expansion

  1. Restart Backblaze service if needed
  2. Trigger a test backup of a small set of files
  3. Monitor: watch -n 5 'df -h /mnt/warm-storage'
  4. Check logs for any errors

📊 Storage Dashboard

Current State:
┌─────────────────────────────────────┐
│ /mnt/warm-storage (1.4TB)          │
│ ████ 13GB used  ███████████ 1.3TB  │
│ Used: 0.9% │ Available: 93%         │
└─────────────────────────────────────┘

Safety Levels:
🟢 GREEN:    < 60% full (current: 0.9%)
🟡 YELLOW:   60-80% full
🔴 RED:      > 80% full

⚠️ Known Considerations

Loopback Device Persistence

The /dev/loop4 loopback device mounting the sparse file may not persist across reboots on older systems. If you reboot and warm storage isn't available:

# Remount the loopback device
sudo losetup -f /mnt/nextcloud-data/lvm-expansion-500gb.img

# Activate the volume group
sudo vgchange -ay warm-storage-vg

# Mount warm storage
sudo mount /mnt/warm-storage

# Verify
df -h /mnt/warm-storage

Better solution (optional future upgrade):

  • Replace the 500GB sparse file with a real physical disk
  • Or create a systemd service for automatic mounting

🔄 Future Expansion

If you ever need more than 1.4TB:

Option A: Add a Physical Disk

# Add /dev/sdd as new PV
pvcreate /dev/sdd
vgextend warm-storage-vg /dev/sdd
lvextend -L +[size]G /dev/warm-storage-vg/warm-storage
resize2fs /dev/warm-storage-vg/warm-storage

Option B: Increase Sparse File

# Grow the sparse file
dd if=/dev/zero of=/mnt/nextcloud-data/lvm-expansion-500gb.img bs=1G count=0 seek=750 status=progress

Verification Checklist

  • Warm storage size: 1.4TB
  • Available space: 1.3TB (93%)
  • Mount point: /mnt/warm-storage persistent
  • Filesystem: ext4 (online expandable)
  • LVM setup: 2 PVs in 1 VG, 1 LV
  • Nextcloud data: Untouched (1.4TB on /dev/sdc)
  • Backblaze ready: Can stage full 1.4TB backup

📞 Troubleshooting

Warm storage not showing after reboot

# Check if loopback device exists
losetup -a

# If missing, remount it
losetup -f /mnt/nextcloud-data/lvm-expansion-500gb.img
vgchange -ay warm-storage-vg
mount /mnt/warm-storage

Backblaze can't write to warm storage

# Check permissions
ls -la /mnt/warm-storage

# Check if mounted
mount | grep warm

# Test write
echo "test" > /mnt/warm-storage/test.txt
rm /mnt/warm-storage/test.txt

Need to see current usage in real-time

# Watch storage in real-time
watch -n 2 'df -h /mnt/warm-storage'

# Or with more detail
watch -n 2 'df -h /mnt/warm-storage; echo "---"; du -sh /mnt/warm-storage/*'

📞 Support Commands

# Check all storage
df -h

# Check LVM setup
lvs warm-storage-vg
vgs warm-storage-vg
pvs

# Check loopback devices
losetup -a

# Check filesystem
fsck -n /dev/warm-storage-vg/warm-storage

# Monitor performance
iostat -x 1 /dev/sdb /dev/loop4

Status: COMPLETE, TESTED, AND OPERATIONAL
Capacity: 1.4TB warm storage ready for Backblaze
Nextcloud Data: Safe and untouched at 1.4TB
Date Completed: April 27, 2026