Initial commit

This commit is contained in:
Ronald Huynen
2026-03-23 21:37:59 +01:00
commit 2547717edb
2193 changed files with 972171 additions and 0 deletions

338
scripts/setup-backups.sh Executable file
View File

@@ -0,0 +1,338 @@
#!/bin/bash
# Laravel Timebank Backup Setup Script
# Initializes the backup system and performs initial configuration
# Usage: ./setup-backups.sh
set -e
# Configuration
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Function to print colored output
print_status() {
local level="$1"
local message="$2"
case "$level" in
"INFO")
echo -e "${BLUE}[INFO]${NC} $message"
;;
"SUCCESS")
echo -e "${GREEN}[SUCCESS]${NC} $message"
;;
"WARNING")
echo -e "${YELLOW}[WARNING]${NC} $message"
;;
"ERROR")
echo -e "${RED}[ERROR]${NC} $message"
;;
esac
}
# Function to check prerequisites
check_prerequisites() {
print_status "INFO" "Checking prerequisites..."
local missing_tools=()
# Check required commands
local required_commands=("mysqldump" "mysql" "rsync" "tar" "gzip" "find" "awk")
for cmd in "${required_commands[@]}"; do
if ! command -v "$cmd" >/dev/null 2>&1; then
missing_tools+=("$cmd")
fi
done
if [ ${#missing_tools[@]} -gt 0 ]; then
print_status "ERROR" "Missing required tools: ${missing_tools[*]}"
print_status "INFO" "Please install missing tools and try again"
return 1
fi
print_status "SUCCESS" "All required tools are available"
return 0
}
# Function to verify environment configuration
check_environment() {
print_status "INFO" "Checking environment configuration..."
if [ ! -f "$PROJECT_ROOT/.env" ]; then
print_status "ERROR" ".env file not found in $PROJECT_ROOT"
return 1
fi
# Load environment loader
source "$SCRIPT_DIR/load-env.sh"
# Load environment variables
if ! load_env "$PROJECT_ROOT/.env"; then
return 1
fi
# Check required database variables
local missing_vars=()
if [ -z "$DB_DATABASE" ]; then missing_vars+=("DB_DATABASE"); fi
if [ -z "$DB_USERNAME" ]; then missing_vars+=("DB_USERNAME"); fi
if [ -z "$DB_HOST" ]; then missing_vars+=("DB_HOST"); fi
if [ ${#missing_vars[@]} -gt 0 ]; then
print_status "ERROR" "Missing required environment variables: ${missing_vars[*]}"
return 1
fi
print_status "SUCCESS" "Environment configuration is valid"
return 0
}
# Function to test database connection
test_database_connection() {
print_status "INFO" "Testing database connection..."
# Create MySQL configuration file for secure password handling
local mysql_cnf_file="/tmp/mysql_test_$$.cnf"
cat > "$mysql_cnf_file" <<EOF
[mysql]
host=${DB_HOST:-127.0.0.1}
port=${DB_PORT:-3306}
user=$DB_USERNAME
password=$DB_PASSWORD
EOF
# Set secure permissions on the config file
chmod 600 "$mysql_cnf_file"
if mysql --defaults-extra-file="$mysql_cnf_file" -e "SELECT 1;" >/dev/null 2>&1; then
print_status "SUCCESS" "Database connection successful"
rm -f "$mysql_cnf_file"
return 0
else
print_status "ERROR" "Database connection failed"
rm -f "$mysql_cnf_file"
return 1
fi
}
# Function to set up backup directories
setup_directories() {
print_status "INFO" "Setting up backup directories..."
local backup_dirs=(
"$PROJECT_ROOT/backups"
"$PROJECT_ROOT/backups/database/daily"
"$PROJECT_ROOT/backups/database/weekly"
"$PROJECT_ROOT/backups/database/monthly"
"$PROJECT_ROOT/backups/database/pre-restore"
"$PROJECT_ROOT/backups/storage/daily"
"$PROJECT_ROOT/backups/storage/weekly"
"$PROJECT_ROOT/backups/storage/monthly"
"$PROJECT_ROOT/backups/storage/snapshots"
"$PROJECT_ROOT/backups/storage/pre-restore"
"$PROJECT_ROOT/backups/logs"
)
for dir in "${backup_dirs[@]}"; do
if [ ! -d "$dir" ]; then
mkdir -p "$dir"
print_status "INFO" "Created directory: $dir"
fi
done
# Set appropriate permissions
chmod 755 "$PROJECT_ROOT/backups"
chmod -R 750 "$PROJECT_ROOT/backups"/{database,storage}
chmod 755 "$PROJECT_ROOT/backups/logs"
print_status "SUCCESS" "Backup directories created successfully"
}
# Function to make scripts executable
setup_script_permissions() {
print_status "INFO" "Setting up script permissions..."
local scripts=(
"$SCRIPT_DIR/backup-database.sh"
"$SCRIPT_DIR/backup-storage.sh"
"$SCRIPT_DIR/backup-all.sh"
"$SCRIPT_DIR/restore-database.sh"
"$SCRIPT_DIR/restore-storage.sh"
"$SCRIPT_DIR/cleanup-backups.sh"
)
for script in "${scripts[@]}"; do
if [ -f "$script" ]; then
chmod +x "$script"
print_status "INFO" "Made executable: $(basename "$script")"
else
print_status "WARNING" "Script not found: $(basename "$script")"
fi
done
print_status "SUCCESS" "Script permissions configured"
}
# Function to run initial test backup
run_test_backup() {
print_status "INFO" "Running initial test backup..."
# Test database backup
if [ -x "$SCRIPT_DIR/backup-database.sh" ]; then
print_status "INFO" "Testing database backup..."
if "$SCRIPT_DIR/backup-database.sh" daily; then
print_status "SUCCESS" "Database backup test successful"
else
print_status "ERROR" "Database backup test failed"
return 1
fi
fi
# Test storage backup
if [ -x "$SCRIPT_DIR/backup-storage.sh" ]; then
print_status "INFO" "Testing storage backup..."
if "$SCRIPT_DIR/backup-storage.sh" daily; then
print_status "SUCCESS" "Storage backup test successful"
else
print_status "ERROR" "Storage backup test failed"
return 1
fi
fi
return 0
}
# Function to show next steps
show_next_steps() {
print_status "SUCCESS" "Backup system setup completed successfully!"
echo ""
print_status "INFO" "Next steps:"
echo " 1. Review the backup configuration in BACKUP_GUIDE.md"
echo " 2. Set up automated backups using cron:"
echo " sudo cp scripts/cron-backup.conf /etc/cron.d/timebank-backup"
echo " sudo nano /etc/cron.d/timebank-backup # Edit paths and email"
echo " 3. Test the complete backup system:"
echo " ./scripts/backup-all.sh daily --verify"
echo " 4. Test restore procedures:"
echo " ./scripts/restore-database.sh --list-backups"
echo " 5. Set up monitoring and notifications"
echo ""
print_status "INFO" "Available commands:"
echo " ./scripts/backup-all.sh daily # Daily backup"
echo " ./scripts/backup-all.sh weekly # Weekly backup"
echo " ./scripts/backup-all.sh monthly # Monthly backup"
echo " ./scripts/restore-database.sh --latest # Restore database"
echo " ./scripts/restore-storage.sh --latest # Restore storage"
echo " ./scripts/cleanup-backups.sh --dry-run # Check cleanup"
echo ""
}
# Function to display backup status
show_backup_status() {
print_status "INFO" "Current backup status:"
local backup_dir="$PROJECT_ROOT/backups"
if [ -d "$backup_dir" ]; then
# Count backups
local db_backups=$(find "$backup_dir/database" -name "*.sql.gz" 2>/dev/null | wc -l)
local storage_backups=$(find "$backup_dir/storage" -name "*.tar.gz" 2>/dev/null | wc -l)
echo " Database backups: $db_backups"
echo " Storage backups: $storage_backups"
if [ -d "$backup_dir" ]; then
local total_size=$(du -sh "$backup_dir" 2>/dev/null | cut -f1)
echo " Total backup size: $total_size"
fi
# Show recent backups
local recent_db=$(find "$backup_dir/database" -name "*.sql.gz" -mtime -1 2>/dev/null | head -n 1)
local recent_storage=$(find "$backup_dir/storage" -name "*.tar.gz" -mtime -1 2>/dev/null | head -n 1)
if [ -n "$recent_db" ]; then
echo " Latest database backup: $(basename "$recent_db") ($(date -r "$recent_db" '+%Y-%m-%d %H:%M:%S'))"
fi
if [ -n "$recent_storage" ]; then
echo " Latest storage backup: $(basename "$recent_storage") ($(date -r "$recent_storage" '+%Y-%m-%d %H:%M:%S'))"
fi
else
echo " No backups found"
fi
echo ""
}
# Main execution
main() {
echo "============================================"
echo " Laravel Timebank Backup System Setup "
echo "============================================"
echo ""
# Check if already set up
if [ -d "$PROJECT_ROOT/backups" ] && [ -f "$PROJECT_ROOT/backups/backup.log" ]; then
print_status "INFO" "Backup system appears to already be configured"
show_backup_status
read -p "Do you want to re-run the setup? [y/N]: " -n 1 -r
echo ""
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
print_status "INFO" "Setup cancelled"
exit 0
fi
echo ""
fi
# Run setup steps
if ! check_prerequisites; then
exit 1
fi
if ! check_environment; then
print_status "INFO" "Please configure your .env file with proper database credentials"
exit 1
fi
if ! test_database_connection; then
print_status "INFO" "Please check your database configuration and connection"
exit 1
fi
setup_directories
setup_script_permissions
# Ask if user wants to run test backup
echo ""
read -p "Do you want to run an initial test backup? [Y/n]: " -n 1 -r
echo ""
if [[ ! $REPLY =~ ^[Nn]$ ]]; then
if run_test_backup; then
print_status "SUCCESS" "Test backup completed successfully"
else
print_status "WARNING" "Test backup had issues, but setup is complete"
fi
fi
echo ""
show_next_steps
}
# Check if running from correct directory
if [ ! -f "$PROJECT_ROOT/composer.json" ] || [ ! -f "$PROJECT_ROOT/.env.example" ]; then
print_status "ERROR" "This script must be run from the Laravel project root directory"
exit 1
fi
# Run main function
main