Initial commit: complete WebsiteBox project
Docker-based self-hosted WordPress deployment system with: - Four-container stack (nginx, wordpress/php-fpm, mariadb, certbot) - Automatic SSL via Let's Encrypt with self-signed fallback - First-boot WordPress setup via WP-CLI (GeneratePress + child theme, plugins) - Interactive setup wizard and one-line install script - Backup, update, healthcheck, and SSL renewal scripts Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
69
scripts/backup.sh
Executable file
69
scripts/backup.sh
Executable file
@@ -0,0 +1,69 @@
|
||||
#!/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/"
|
||||
Reference in New Issue
Block a user