diff --git a/.env.default b/.env.default new file mode 100644 index 0000000..912961a --- /dev/null +++ b/.env.default @@ -0,0 +1,7 @@ +PBS_SERVER="" +PBS_DATASTORE="" +PBS_BACKUP_ID="" +PBS_PASSWORD="" +PBS_FINGERPRINT="" +PBS_PRUNE="" +PBS_PRUNE_ARGS="" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4c49bd7 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.env diff --git a/Dockerfile b/Dockerfile index e97328b..9cfb9e1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -23,4 +23,11 @@ RUN apt-get update && \ apt-get install -y proxmox-backup-client && \ rm -rf /var/lib/apt/lists/* -CMD ["proxmox-backup-client", "--help"] +# Add script +WORKDIR /app +COPY ./app/* . + +# Change Permissions +RUN chmod +x ./backup.sh + +CMD ./backup.sh diff --git a/app/backup.sh b/app/backup.sh new file mode 100755 index 0000000..5526da1 --- /dev/null +++ b/app/backup.sh @@ -0,0 +1,87 @@ +#! /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 diff --git a/build.sh b/build.sh old mode 100644 new mode 100755 diff --git a/docker-compose.yaml b/docker-compose.yaml index efdc96e..8a51101 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -1,6 +1,17 @@ - services: - backup: - image: 6917544a5239ec13c3e66efdd245df2a9c9891e9c83bc78ddc733ea04d5777bd - container_name: backup_service + backup: + image: pbs-client + container_name: backup_service + network_mode: host + volumes: + - /root/tests:/mnt/backup + + environment: + PBS_SERVER: ${PBS_SERVER} + PBS_DATASTORE: ${PBS_DATASTORE} + PBS_BACKUP_ID: ${PBS_BACKUP_ID} + PBS_PASSWORD: ${PBS_PASSWORD} + PBS_FINGERPRINT: ${PBS_FINGERPRINT} + PBS_PRUNE: ${PBS_PRUNE} + PBS_PRUNE_ARGS: ${PBS_PRUNE_ARGS}