ProxmoxBackupClientPBSClien.../docker/scripts/entrypoint.sh
zaphod-black fbe81d28ae Add Docker-based cross-platform solution (v1.2.0)
Major addition: Full Docker implementation for Windows, macOS, and Linux support

New Features:
- Docker container with PBS client in Debian environment
- Platform-specific docker-compose files (linux/windows/macos)
- Daemon mode with internal cron scheduler
- One-shot backup mode for manual execution
- Optional REST API server for remote management
- Health monitoring and status endpoints
- Automatic encryption key generation and management

Docker Structure:
- docker/Dockerfile - Container build definition
- docker/scripts/ - Entrypoint, backup, healthcheck, and API scripts
- docker/build.sh - Build script for Docker image
- docker/deploy.sh - Interactive deployment script
- docker/docker-compose-*.yml - Platform-specific configurations

Documentation:
- docker/README-DOCKER.md - Complete Docker documentation
- docker/QUICKSTART-DOCKER.md - Quick start guide
- docker/DOCKER-SOLUTION-SUMMARY.md - Architecture overview
- BACKUP-TYPES-GUIDE.md - File vs block device backup guide

Updated:
- README.md - Added cross-platform support section and platform matrix
- CHANGELOG.md - Documented all Docker features

This enables PBSClientTool to backup Windows and Mac systems via Docker,
while maintaining native Linux performance for full disk images.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-02 22:36:41 -06:00

180 lines
4.3 KiB
Bash
Executable file

#!/bin/bash
set -e
# Entrypoint for PBS Client Docker Container
# Handles both daemon mode (continuous with cron) and one-shot backup mode
log() {
echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" | tee -a /logs/container.log
}
error() {
echo "[$(date +'%Y-%m-%d %H:%M:%S')] ERROR: $1" | tee -a /logs/container.log >&2
}
# Set timezone
if [ -n "$TIMEZONE" ]; then
ln -snf /usr/share/zoneinfo/$TIMEZONE /etc/localtime
echo $TIMEZONE > /etc/timezone
fi
# Validate required environment variables
validate_config() {
if [ -z "$PBS_REPOSITORY" ]; then
error "PBS_REPOSITORY environment variable is required"
return 1
fi
if [ -z "$PBS_PASSWORD" ]; then
error "PBS_PASSWORD environment variable is required"
return 1
fi
return 0
}
# Initialize encryption key if not exists
init_encryption() {
if [ ! -f /config/encryption-key.json ]; then
log "Generating encryption key..."
mkdir -p /config
proxmox-backup-client key create --kdf none 2>/dev/null || true
# Copy to persistent config volume
if [ -f /root/.config/proxmox-backup/encryption-key.json ]; then
cp /root/.config/proxmox-backup/encryption-key.json /config/
log "Encryption key created and saved to /config/"
# Create paper backup
proxmox-backup-client key paperkey --output-format text > /config/encryption-key-paper.txt
log "Paper backup created: /config/encryption-key-paper.txt"
fi
else
log "Using existing encryption key from /config/"
mkdir -p /root/.config/proxmox-backup
cp /config/encryption-key.json /root/.config/proxmox-backup/
fi
}
# Setup cron for daemon mode
setup_cron() {
log "Setting up cron schedule: $BACKUP_SCHEDULE"
# Create cron job
cat > /etc/cron.d/pbs-backup << EOF
# PBS Backup Schedule
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
PBS_REPOSITORY=$PBS_REPOSITORY
PBS_PASSWORD=$PBS_PASSWORD
$BACKUP_SCHEDULE root /usr/local/bin/pbs-backup >> /logs/cron.log 2>&1
EOF
chmod 0644 /etc/cron.d/pbs-backup
# Apply cron environment
printenv | grep -v "no_proxy" >> /etc/environment
log "Cron configured successfully"
}
# Start daemon mode
start_daemon() {
log "Starting PBS Client in daemon mode"
log "Backup schedule: $BACKUP_SCHEDULE"
log "Monitoring logs at /logs/"
validate_config || exit 1
init_encryption
setup_cron
# Start API server if enabled
if [ "$ENABLE_API" = "true" ]; then
log "Starting API server on port 8080"
/usr/local/bin/api-server &
fi
# Start cron in foreground
log "Starting cron daemon..."
cron -f
}
# Run one-shot backup
run_backup() {
log "Running one-shot backup"
validate_config || exit 1
init_encryption
# Export for PBS client
export PBS_REPOSITORY
export PBS_PASSWORD
# Run backup
/usr/local/bin/pbs-backup
}
# Test connection
test_connection() {
log "Testing connection to PBS server..."
validate_config || exit 1
export PBS_REPOSITORY
export PBS_PASSWORD
if proxmox-backup-client snapshot list >/dev/null 2>&1; then
log "Connection test successful!"
return 0
else
error "Connection test failed"
return 1
fi
}
# Show status
show_status() {
log "PBS Client Container Status"
echo "=========================="
echo "Mode: $MODE"
echo "PBS Repository: $PBS_REPOSITORY"
echo "Backup Paths: $BACKUP_PATHS"
echo "Schedule: $BACKUP_SCHEDULE"
echo "Timezone: $TIMEZONE"
echo "=========================="
if [ "$MODE" = "daemon" ]; then
echo "Last backup:"
if [ -f /logs/last-backup.log ]; then
tail -5 /logs/last-backup.log
else
echo " No backups run yet"
fi
fi
}
# Main logic
case "${1:-$MODE}" in
daemon)
start_daemon
;;
backup)
run_backup
;;
test)
test_connection
;;
status)
show_status
;;
shell)
log "Starting interactive shell"
exec /bin/bash
;;
*)
error "Unknown command: $1"
echo "Usage: $0 {daemon|backup|test|status|shell}"
exit 1
;;
esac