KURPOD mobile & desktop apps

Backup strategies

Protect your encrypted data with comprehensive backup strategies. This guide covers manual backups, automation, cloud storage, and disaster recovery procedures for Kurpod volumes.


Backup fundamentals

Understanding Kurpod backups

Kurpod backups maintain full encryption:

  • Encrypted at rest: Backup files remain encrypted
  • No key exposure: Encryption keys never included in backups
  • Volume integrity: Hidden volumes preserved invisibly
  • Incremental support: Backup only changes
  • Version history: Maintain multiple backup generations

Critical reminder

Backups are only useful if you remember your passwords. Store passwords securely in a password manager or use a memorable passphrase. Without the password, backups cannot be decrypted.

What to backup

Essential components for full recovery:

# 1. Encrypted volume blobs
/path/to/kurpod/blobs/*.blob

# 2. Configuration (optional, for settings)
/path/to/kurpod/config.json

# 3. Server keys (for API access)
/path/to/kurpod/keys/

# Password storage (separate, secure location)
# Never store passwords with backups!

Manual backup methods

Simple file copy

Basic backup for single volumes:

# Create backup directory
mkdir -p /backup/kurpod/$(date +%Y%m%d)

# Copy volume blob
cp /var/lib/kurpod/blobs/volume_abc123.blob \
   /backup/kurpod/$(date +%Y%m%d)/

# Verify integrity
sha256sum /var/lib/kurpod/blobs/volume_abc123.blob
sha256sum /backup/kurpod/$(date +%Y%m%d)/volume_abc123.blob

Compressed archives

Save space with compression:

# Backup with timestamp
tar -czf kurpod_backup_$(date +%Y%m%d_%H%M%S).tar.gz \
    -C /var/lib/kurpod blobs/

# With encryption (additional layer)
tar -czf - -C /var/lib/kurpod blobs/ | \
    gpg --symmetric --cipher-algo AES256 > \
    kurpod_backup_$(date +%Y%m%d).tar.gz.gpg

Snapshot backups

For filesystem-level snapshots:

# LVM snapshot
lvcreate -L 1G -s -n kurpod_snap /dev/vg0/kurpod

# Backup from snapshot
mount /dev/vg0/kurpod_snap /mnt/snapshot
rsync -av /mnt/snapshot/blobs/ /backup/kurpod/

# Clean up
umount /mnt/snapshot
lvremove -f /dev/vg0/kurpod_snap

Automated backups

Cron-based automation

Schedule regular backups:

# /etc/cron.d/kurpod-backup
# Daily backups at 3 AM
0 3 * * * kurpod /usr/local/bin/kurpod-backup.sh

# Weekly full backup on Sunday
0 2 * * 0 kurpod /usr/local/bin/kurpod-backup.sh --full

# Monthly archive on the 1st
0 1 1 * * kurpod /usr/local/bin/kurpod-backup.sh --archive

Backup script

Comprehensive backup automation:

#!/bin/bash
# /usr/local/bin/kurpod-backup.sh

# Configuration
KURPOD_DIR="/var/lib/kurpod"
BACKUP_DIR="/backup/kurpod"
RETENTION_DAYS=30
LOG_FILE="/var/log/kurpod-backup.log"

# Create dated backup directory
BACKUP_DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_PATH="$BACKUP_DIR/$BACKUP_DATE"
mkdir -p "$BACKUP_PATH"

# Function to log messages
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

# Start backup
log "Starting Kurpod backup to $BACKUP_PATH"

# Backup blobs with progress
rsync -av --progress \
    "$KURPOD_DIR/blobs/" \
    "$BACKUP_PATH/blobs/" \
    2>&1 | tee -a "$LOG_FILE"

# Backup configuration
cp "$KURPOD_DIR/config.json" "$BACKUP_PATH/" 2>/dev/null

# Create checksum file
cd "$BACKUP_PATH"
find . -type f -exec sha256sum {} \; > checksums.txt

# Compress if requested
if [[ "$1" == "--compress" ]]; then
    log "Compressing backup..."
    tar -czf "../kurpod_$BACKUP_DATE.tar.gz" .
    cd ..
    rm -rf "$BACKUP_DATE"
fi

# Clean old backups
log "Cleaning backups older than $RETENTION_DAYS days"
find "$BACKUP_DIR" -type f -name "kurpod_*.tar.gz" \
    -mtime +$RETENTION_DAYS -delete

log "Backup completed successfully"

Incremental backups

Efficient incremental strategy:

#!/bin/bash
# Incremental backup using rsync

KURPOD_DIR="/var/lib/kurpod"
BACKUP_DIR="/backup/kurpod"
CURRENT_LINK="$BACKUP_DIR/current"
BACKUP_DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_PATH="$BACKUP_DIR/$BACKUP_DATE"

# Create incremental backup
rsync -av --link-dest="$CURRENT_LINK" \
    "$KURPOD_DIR/blobs/" \
    "$BACKUP_PATH/blobs/"

# Update current link
rm -f "$CURRENT_LINK"
ln -s "$BACKUP_PATH" "$CURRENT_LINK"

# Keep only last 7 incremental backups
ls -dt "$BACKUP_DIR"/*/ | tail -n +8 | xargs rm -rf

Cloud backup solutions

AWS S3 backup

Automated S3 synchronization:

# Install AWS CLI
pip install awscli

# Configure credentials
aws configure

# Sync to S3 with encryption
aws s3 sync /var/lib/kurpod/blobs/ \
    s3://my-kurpod-backups/blobs/ \
    --storage-class GLACIER_IR \
    --sse AES256

# Restore from S3
aws s3 sync s3://my-kurpod-backups/blobs/ \
    /var/lib/kurpod/blobs/

Automated S3 backup script

#!/bin/bash
# s3-backup.sh

BUCKET="my-kurpod-backups"
PREFIX="backups/$(hostname)/$(date +%Y/%m/%d)"

# Backup with versioning
aws s3 sync /var/lib/kurpod/blobs/ \
    "s3://$BUCKET/$PREFIX/blobs/" \
    --delete \
    --storage-class STANDARD_IA \
    --sse AES256

# Tag with retention policy
aws s3api put-object-tagging \
    --bucket "$BUCKET" \
    --key "$PREFIX/metadata.json" \
    --tagging 'TagSet=[{Key=Retention,Value=90days}]'

Backblaze B2

Cost-effective cloud storage:

# Install B2 CLI
pip install b2

# Authorize
b2 authorize-account

# Create bucket
b2 create-bucket kurpod-backups allPrivate

# Sync files
b2 sync --delete --replaceNewer \
    /var/lib/kurpod/blobs/ \
    b2://kurpod-backups/blobs/

Rclone for multiple clouds

Universal cloud backup tool:

# Install rclone
curl https://rclone.org/install.sh | sudo bash

# Configure remotes
rclone config

# Backup to multiple destinations
#!/bin/bash
for remote in gdrive onedrive s3; do
    rclone sync /var/lib/kurpod/blobs/ \
        "$remote:kurpod-backups/blobs/" \
        --progress \
        --transfers 4
done

Disaster recovery

Recovery planning

Essential recovery checklist:

## Kurpod Disaster Recovery Plan

### Prerequisites
- [ ] Backup location documented
- [ ] Passwords stored securely (separate location)
- [ ] Recovery procedure tested quarterly
- [ ] Contact information updated

### Recovery Steps
1. Install fresh Kurpod instance
2. Stop Kurpod service
3. Restore blob files
4. Restore configuration
5. Start service
6. Verify volume access
7. Test hidden volumes

### Verification Tests
- [ ] All volumes accessible
- [ ] File integrity verified
- [ ] Hidden volumes functional
- [ ] Performance normal

Recovery procedures

From local backup

# Stop Kurpod
systemctl stop kurpod

# Restore blobs
rsync -av /backup/kurpod/latest/blobs/ \
    /var/lib/kurpod/blobs/

# Restore config
cp /backup/kurpod/latest/config.json \
    /var/lib/kurpod/

# Fix permissions
chown -R kurpod:kurpod /var/lib/kurpod/

# Start service
systemctl start kurpod

From cloud backup

# Download from S3
aws s3 sync s3://my-kurpod-backups/blobs/ \
    /var/lib/kurpod/blobs/

# Verify checksums
cd /var/lib/kurpod/blobs/
sha256sum -c /backup/checksums.txt

Testing recovery

Regular recovery drills:

#!/bin/bash
# test-recovery.sh

# Create test environment
TEST_DIR="/tmp/kurpod-recovery-test"
mkdir -p "$TEST_DIR"

# Restore to test location
rsync -av /backup/kurpod/latest/ "$TEST_DIR/"

# Start test instance
docker run -d \
    --name kurpod-test \
    -p 3001:3000 \
    -v "$TEST_DIR/blobs:/app/blobs" \
    ghcr.io/srv1n/kurpod-server:latest

# Verify access
curl -f http://localhost:3001/health || exit 1

# Cleanup
docker stop kurpod-test
docker rm kurpod-test
rm -rf "$TEST_DIR"

echo "Recovery test successful!"

Backup security

Encryption considerations

Additional backup encryption:

# Encrypt backup with GPG
tar -czf - /var/lib/kurpod/blobs/ | \
    gpg --symmetric \
        --cipher-algo AES256 \
        --compress-algo none \
        --batch --passphrase-file /secure/backup-pass \
        > kurpod_backup.tar.gz.gpg

# Decrypt when needed
gpg --decrypt \
    --batch --passphrase-file /secure/backup-pass \
    kurpod_backup.tar.gz.gpg | \
    tar -xzf - -C /restore/path/

Secure storage

Best practices for backup storage:

# Backup storage requirements
physical:
  - location: Separate from primary
  - access: Restricted physical access
  - media: Enterprise-grade drives
  - redundancy: RAID 6 or better

cloud:
  - encryption: Provider-side + client-side
  - access: MFA required
  - versioning: Enabled
  - regions: Multi-region replication

security:
  - passwords: Separate secure storage
  - keys: Hardware security module
  - audit: Access logging enabled
  - testing: Quarterly recovery drills

Access control

Limit backup access:

# Create backup user
useradd -r -s /bin/false kurpod-backup

# Restrict permissions
chmod 700 /backup/kurpod
chown kurpod-backup:kurpod-backup /backup/kurpod

# Sudoers for backup only
echo "kurpod-backup ALL=(kurpod) NOPASSWD: /usr/bin/rsync" \
    >> /etc/sudoers.d/kurpod-backup

Monitoring and alerts

Backup monitoring

Track backup health:

#!/bin/bash
# monitor-backups.sh

BACKUP_DIR="/backup/kurpod"
MAX_AGE_HOURS=25
ALERT_EMAIL="[email protected]"

# Check latest backup age
LATEST=$(find "$BACKUP_DIR" -type f -name "*.blob" -printf '%T@\n' | sort -n | tail -1)
AGE=$(($(date +%s) - ${LATEST%.*}))
AGE_HOURS=$((AGE / 3600))

if [ $AGE_HOURS -gt $MAX_AGE_HOURS ]; then
    echo "CRITICAL: Latest backup is $AGE_HOURS hours old" | \
        mail -s "Kurpod Backup Alert" "$ALERT_EMAIL"
    exit 2
fi

# Check backup size
BACKUP_SIZE=$(du -sb "$BACKUP_DIR" | awk '{print $1}')
SOURCE_SIZE=$(du -sb /var/lib/kurpod/blobs/ | awk '{print $1}')
SIZE_DIFF=$((SOURCE_SIZE - BACKUP_SIZE))

if [ $SIZE_DIFF -gt $((SOURCE_SIZE / 10)) ]; then
    echo "WARNING: Backup size mismatch detected" | \
        mail -s "Kurpod Backup Warning" "$ALERT_EMAIL"
    exit 1
fi

echo "OK: Backups are current and complete"
exit 0

Prometheus metrics

Export backup metrics:

# prometheus-backup-exporter.yml
kurpod_backup_last_success_timestamp:
  type: gauge
  help: "Timestamp of last successful backup"

kurpod_backup_size_bytes:
  type: gauge
  help: "Total size of backup directory"

kurpod_backup_file_count:
  type: gauge
  help: "Number of blob files in backup"

kurpod_backup_duration_seconds:
  type: histogram
  help: "Time taken to complete backup"

Best practices

3-2-1 rule

Follow the backup golden rule:

  • 3 copies of important data
  • 2 different storage media types
  • 1 offsite backup location
# Implementation example
Primary: /var/lib/kurpod/blobs/
Local backup: /backup/kurpod/ (different disk)
Cloud backup: s3://kurpod-backups/

Backup testing

Regular verification schedule:

## Monthly Backup Tests
- [ ] Restore random file - verify contents
- [ ] Check backup integrity - run checksums
- [ ] Test recovery procedure - document time
- [ ] Verify hidden volumes - test both passwords
- [ ] Update documentation - note any changes

## Quarterly Full Recovery
- [ ] Restore to test system
- [ ] Verify all volumes accessible
- [ ] Performance benchmarks
- [ ] Update disaster recovery plan

Documentation

Maintain recovery documentation:

# Kurpod Backup Recovery Guide

## Emergency Contacts
- Primary Admin: +1-555-0123
- Backup Admin: +1-555-0124
- Cloud Provider: +1-555-0125

## Backup Locations
- Local: /backup/kurpod/
- NAS: //nas.internal/kurpod-backups/
- Cloud: s3://company-kurpod-backups/

## Recovery Passwords
- Stored in: Company password manager
- Backup copy: Safety deposit box #123

## Recovery Priority
1. Executive volumes (15 min RTO)
2. Finance data (30 min RTO)
3. General storage (2 hour RTO)

Remember

The best backup strategy is one that's regularly tested. Schedule monthly verification tests and quarterly full recovery drills. Document everything and keep your recovery procedures up to date.