#!/bin/bash set -eo pipefail # WebsiteBox Manual Backup Script # Usage: ./scripts/backup.sh [--prune-only] SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" PROJECT_DIR="$(dirname "$SCRIPT_DIR")" BACKUP_DIR="${PROJECT_DIR}/websitebox-data/backups" # Load .env if [ -f "${PROJECT_DIR}/.env" ]; then # shellcheck disable=SC1091 source "${PROJECT_DIR}/.env" fi RETENTION_DAYS="${BACKUP_RETENTION_DAYS:-30}" prune_old_backups() { echo "Pruning backups older than ${RETENTION_DAYS} days..." if [ -d "${BACKUP_DIR}" ]; then find "${BACKUP_DIR}" -type f -mtime "+${RETENTION_DAYS}" -delete 2>/dev/null || true echo "Pruning complete." else echo "Backup directory does not exist: ${BACKUP_DIR}" fi } if [ "$1" = "--prune-only" ]; then prune_old_backups exit 0 fi echo "═══════════════════════════════════════════════════════════" echo " WebsiteBox Manual Backup" echo "═══════════════════════════════════════════════════════════" # Check that containers are running if ! docker compose -f "${PROJECT_DIR}/docker-compose.yml" ps --status running | grep -q websitebox-wordpress; then echo "ERROR: WordPress container is not running." echo "Start it with: docker compose up -d" exit 1 fi # Create database dump TIMESTAMP=$(date +%Y%m%d_%H%M%S) echo "Creating database backup..." docker compose -f "${PROJECT_DIR}/docker-compose.yml" exec -T db \ mariadb-dump -u"${DB_USER:-websitebox}" -p"${DB_PASSWORD}" "${DB_NAME:-websitebox}" \ > "${BACKUP_DIR}/db_${TIMESTAMP}.sql" echo "Database backup saved: websitebox-data/backups/db_${TIMESTAMP}.sql" # Create files backup echo "Creating files backup..." tar czf "${BACKUP_DIR}/files_${TIMESTAMP}.tar.gz" \ -C "${PROJECT_DIR}/websitebox-data" \ --exclude='backups' \ --exclude='database' \ wordpress/ certs/ echo "Files backup saved: websitebox-data/backups/files_${TIMESTAMP}.tar.gz" # Prune old backups prune_old_backups echo "" echo "Backup complete!" echo "Files stored in: websitebox-data/backups/"