# ๐Ÿ Python Virtual Environment Backup Script This Bash script automates the process of backing up Python virtual environments. It performs the following steps: 1. Locates virtual environments in a specified root directory 2. Archives them into a compressed `.tar.gz` file 3. Transfers the backup to a remote server using `rsync` 4. Deletes local backups older than a specified retention period --- ## ๐Ÿ“ฆ Features - Detects virtual environments by checking for `bin/activate` - Compresses selected environments into a tarball - Transfers the backup to a remote server via SSH - Deletes backups older than a retention threshold - Uses strict error handling to avoid silent failures --- ## โš™๏ธ Configuration | Variable | Description | |------------------|-------------------------------------------------------------------------| | `VENV_ROOT` | Directory where virtual environments are stored | | `BACKUP_DIR` | Local directory where the backup tarballs are saved | | `RETENTION_DAYS` | Number of days to retain local backups | | `REMOTE_USER` | SSH user for the remote backup server | | `REMOTE_HOST` | Hostname or IP address of the remote server | | `REMOTE_PATH` | Remote directory where backups will be copied via `rsync` | --- ## ๐Ÿ“ Script Walkthrough ### 1. Setup ```bash #!/usr/bin/env bash set -euo pipefail ``` - Enables strict error handling to prevent unnoticed failures. --- ### 2. Define Variables ```bash VENV_ROOT="/home/doc" BACKUP_DIR="$VENV_ROOT/backups" RETENTION_DAYS=7 REMOTE_USER="root" REMOTE_HOST="thevault.bounceme.net" REMOTE_PATH="/mnt/backup3/pythonvenvs" ``` --- ### 3. Generate Timestamped Backup Filename ```bash DATE=$(date +'%F_%H-%M-%S') BACKUP_FILE="$BACKUP_DIR/venvs_backup_$DATE.tar.gz" ``` --- ### 4. Ensure Backup Directory Exists ```bash mkdir -p "$BACKUP_DIR" ``` --- ### 5. Locate Virtual Environments ```bash mapfile -t VENV_DIRS < <( find "$VENV_ROOT" -maxdepth 1 -type d \ -exec test -f "{}/bin/activate" \; -print ) ``` If no environments are found, the script exits: ```bash if [ ${#VENV_DIRS[@]} -eq 0 ]; then echo "โŒ No virtual environments found under $VENV_ROOT" exit 1 fi ``` --- ### 6. Extract Environment Names and Archive ```bash VENV_NAMES=() for path in "${VENV_DIRS[@]}"; do VENV_NAMES+=( "$(basename "$path")" ) done echo "๐Ÿ”„ Backing up virtual environments: ${VENV_NAMES[*]}" tar czf "$BACKUP_FILE" -C "$VENV_ROOT" "${VENV_NAMES[@]}" echo "โœ… Local backup saved to $BACKUP_FILE" ``` --- ### 7. Sync Backup to Remote Server ```bash echo "๐Ÿ“ก Sending backup to ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PATH}/" rsync -az --progress "$BACKUP_FILE" \ "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PATH}/" ``` Check if sync was successful: ```bash if [ $? -ne 0 ]; then echo "โŒ Remote sync failed!" exit 1 else echo "โœ… Remote sync succeeded." fi ``` --- ### 8. Cleanup Old Backups ```bash echo "๐Ÿ—‘๏ธ Removing local backups older than $RETENTION_DAYS days..." find "$BACKUP_DIR" -type f -name "venvs_backup_*.tar.gz" \ -mtime +$RETENTION_DAYS -delete echo "๐ŸŽ‰ Backup and cleanup complete." ``` --- ## ๐Ÿงช Example Output ```text ๐Ÿ”„ Backing up virtual environments: venv1 venv2 โœ… Local backup saved to /home/doc/backups/venvs_backup_2025-05-01_02-00-00.tar.gz ๐Ÿ“ก Sending backup to root@thevault.bounceme.net:/mnt/backup3/pythonvenvs/ โœ… Remote sync succeeded. ๐Ÿ—‘๏ธ Removing local backups older than 7 days... ๐ŸŽ‰ Backup and cleanup complete. ``` --- ## ๐Ÿ›ก๏ธ Notes - Ensure SSH access is set up for passwordless login to the remote host. - Confirm that `rsync` is installed on both the local and remote systems. - Consider running this script via `cron` or `systemd` for automation. --- ## ๐Ÿ–‹๏ธ Author Maintained by **Doc**. Custom backup tooling for Genesis Hosting infrastructure.