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>
70 lines
2.2 KiB
Bash
Executable File
70 lines
2.2 KiB
Bash
Executable File
#!/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/"
|