#! /usr/bin/env bash set -euo pipefail ### DEFAULTS ### BACKUP_SOURCE="/mnt/backup" ### CHECK REQUIRED ENV VARS ### REQ_VARS=( "PBS_SERVER" "PBS_DATASTORE" "PBS_BACKUP_ID" "PBS_PASSWORD" ) for var in "${REQ_VARS[@]}"; do if [[ -z "${!var:-}" ]]; then echo "ERROR: Required environment variable '$var' is not set." >&2 exit 1 fi done # Optional fingerprint if [[ -n "${PBS_FINGERPRINT:-}" ]]; then export PBS_FINGERPRINT fi export PBS_PASSWORD ### LOGGING SETUP ### LOGFILE="/var/log/pbs-backup.log" mkdir -p "$(dirname "$LOGFILE")" log() { # Log to stdout + file simultaneously, Docker-friendly printf "%s\n" "$*" | tee -a "$LOGFILE" >/proc/1/fd/1 } ### BACKUP OPERATION ### TIMESTAMP=$(date +"%Y-%m-%d_%H-%M-%S") SNAPSHOT_NAME="backup-$TIMESTAMP" log "===============================================" log " Starting PBS Backup: $SNAPSHOT_NAME" log " Source: $BACKUP_SOURCE" log " Repository: $PBS_SERVER:$PBS_DATASTORE" log " Backup ID: $PBS_BACKUP_ID" log "===============================================" proxmox-backup-client backup \ "$SNAPSHOT_NAME.pxar:$BACKUP_SOURCE" \ --repository "$PBS_SERVER:$PBS_DATASTORE" \ --backup-id "$PBS_BACKUP_ID" \ 2>&1 | tee -a "$LOGFILE" >/proc/1/fd/1 log "--- Backup completed ---" ### PRUNE (optional) ### PBS_PRUNE="${PBS_PRUNE:-true}" PRUNE_ARGS="${PBS_PRUNE_ARGS:---keep-daily=7 --keep-weekly=4 --keep-monthly=3}" if [[ "$PBS_PRUNE" == "true" ]]; then log "--- Running prune ---" proxmox-backup-client prune \ --repository "$PBS_SERVER:$PBS_DATASTORE" \ --backup-id "$PBS_BACKUP_ID" \ $PRUNE_ARGS \ 2>&1 | tee -a "$LOGFILE" >/proc/1/fd/1 log "--- Prune completed ---" else log "--- Prune disabled ---" fi echo "=== Done ===" | tee -a