First Init
Deploy to Production / Build & Verify (push) Failing after 5m56s
Ping Search Engines / Notify Search Engines (push) Successful in 2s
Deploy to Production / Pre-Deploy Tests (push) Has been skipped
Deploy to Production / Deploy to Railway (push) Has been skipped
Deploy to Production / Deploy to Render (push) Has been skipped
Deploy to Production / Deploy to VPS (PM2) (push) Has been skipped
Deploy to Production / Deploy to Fly.io (push) Has been skipped
Deploy to Production / Post-Deploy Verification (push) Has been skipped
Deploy to Production / Notify on Failure (push) Successful in 2s
E2E Test Suite / Critical User Journeys (push) Has been skipped
E2E Test Suite / API Integration Tests (push) Has been skipped
E2E Test Suite / Smoke Tests (P0) (push) Failing after 11m26s
E2E Test Suite / Form Interaction Tests (push) Failing after 11m42s
E2E Test Suite / Destructive & Chaos Tests (push) Failing after 12m2s
E2E Test Suite / Cross-Browser Regression (chromium) (push) Failing after 16m14s
E2E Test Suite / Cross-Browser Regression (webkit) (push) Failing after 17m45s
E2E Test Suite / Cross-Browser Regression (firefox) (push) Failing after 25m23s
E2E Test Suite / Security Header Tests (push) Failing after 7m55s
E2E Test Suite / Test Report Summary (push) Failing after 20s
E2E Test Suite / Mobile Device Tests (push) Failing after 2h49m9s
Uptime Monitor / Health & Response Time (push) Failing after 2s
Uptime Monitor / SSL Certificate (push) Successful in 2s
Uptime Monitor / Send Alerts (push) Failing after 3s
Uptime Monitor / Record Uptime Success (push) Has been skipped

This commit is contained in:
2026-03-21 16:46:46 +05:30
commit d402256547
216 changed files with 48375 additions and 0 deletions
+119
View File
@@ -0,0 +1,119 @@
# Backup Scripts
Automated backup system for WorkRoot website.
## Quick Start
```bash
# First-time setup
mkdir -p backups/{daily,weekly,monthly,pre-deploy,incremental,safety}
# Create your first backup
npm run backup:full
# Verify it worked
npm run backup:verify
```
## Available Commands
| Command | Description |
|---------|-------------|
| `npm run backup:full` | Full backup of all critical files |
| `npm run backup:content` | Quick backup of content only |
| `npm run backup:config` | Backup configs and env files |
| `npm run backup:verify` | Check backup health and integrity |
| `npm run backup:list` | List all available backups |
| `npm run backup:restore` | Restore from backup (interactive) |
| `npm run backup:cleanup` | Remove old backups per retention policy |
## Automation Setup
### Linux/macOS (cron)
```bash
# Edit crontab
crontab -e
# Daily backup at 2 AM
0 2 * * * cd /path/to/project && npm run backup:full
# Cleanup weekly on Sunday at 3 AM
0 3 * * 0 cd /path/to/project && npm run backup:cleanup
```
### Windows (Task Scheduler)
```powershell
# Daily backup
schtasks /create /tn "WorkRoot-DailyBackup" /tr "npm run backup:full" /sc daily /st 02:00
# Weekly cleanup
schtasks /create /tn "WorkRoot-CleanupBackup" /tr "npm run backup:cleanup" /sc weekly /d SUN /st 03:00
```
## Restore Examples
```bash
# List available backups
npm run backup:list
# Restore from latest
npm run backup:restore backups/daily/latest-full.tar.gz
# Verify specific backup
npm run backup:verify backups/daily/full-backup-2026-03-21.tar.gz
```
## Storage Structure
```
backups/
├── daily/ # 7 days retention
├── weekly/ # 4 weeks retention
├── monthly/ # 3 months retention
├── incremental/ # 72 hours retention
├── pre-deploy/ # Last 10 deployments
└── safety/ # Pre-restore backups (30 days)
```
## Pre-Deployment
Always backup before deployment:
```bash
# Manual
npm run backup:config
# Automatic (in deployment script)
npm run deploy # Includes automatic config backup
```
## Troubleshooting
### Backup fails
```bash
# Check disk space
df -h
# Check permissions
ls -la backups/
# Make scripts executable
chmod +x scripts/backup/*.sh
```
### Restore fails
```bash
# Verify backup integrity
npm run backup:verify backups/daily/backup-file.tar.gz
# Check backup contents
tar -tzf backups/daily/backup-file.tar.gz
```
## Documentation
See [BACKUP_STRATEGY.md](../../.agents/devops-engineer/BACKUP_STRATEGY.md) for complete documentation.
+73
View File
@@ -0,0 +1,73 @@
#!/bin/bash
# Configuration Backup Script for WorkRoot Website
# Backs up critical config files and environment variables
set -e
# Configuration
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
BACKUP_DIR="$PROJECT_ROOT/backups/pre-deploy"
TIMESTAMP=$(date +"%Y-%m-%d_%H-%M-%S")
BACKUP_FILE="$BACKUP_DIR/config-$TIMESTAMP.tar.gz"
LOG_FILE="$PROJECT_ROOT/backups/backup.log"
# Colors
GREEN='\033[0;32m'
NC='\033[0m'
log() {
echo "[$(date +"%Y-%m-%d %H:%M:%S")] $1" | tee -a "$LOG_FILE"
}
mkdir -p "$BACKUP_DIR"
log "${GREEN}Starting configuration backup...${NC}"
# Configuration files to backup
CONFIG_FILES=(
"astro.config.mjs"
"tailwind.config.mjs"
"playwright.config.ts"
"tsconfig.json"
"package.json"
"package-lock.json"
".env"
".env.example"
"src/middleware.ts"
"src/content/config.ts"
)
# Filter out non-existent files
EXISTING_FILES=()
for file in "${CONFIG_FILES[@]}"; do
if [ -e "$PROJECT_ROOT/$file" ]; then
EXISTING_FILES+=("$file")
fi
done
# Create backup
cd "$PROJECT_ROOT"
tar -czf "$BACKUP_FILE" "${EXISTING_FILES[@]}" 2>/dev/null
# Verify
if [ ! -f "$BACKUP_FILE" ]; then
log "ERROR: Config backup failed"
exit 1
fi
BACKUP_SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
log "${GREEN}Configuration backup completed${NC}"
log "Location: $BACKUP_FILE"
log "Size: $BACKUP_SIZE"
# Create latest symlink
ln -sf "$BACKUP_FILE" "$BACKUP_DIR/latest-config.tar.gz"
# Cleanup (keep last 10 config backups)
cd "$BACKUP_DIR"
ls -t config-*.tar.gz 2>/dev/null | tail -n +11 | xargs -r rm -f
log "Old config backups cleaned up (kept last 10)"
echo -e "${GREEN}✓ Configuration backup completed${NC}"
echo -e " Location: $BACKUP_FILE"
echo -e " Size: $BACKUP_SIZE"
+60
View File
@@ -0,0 +1,60 @@
#!/bin/bash
# Content-Only Backup Script for WorkRoot Website
# Quick incremental backup of content files (blog posts, markdown)
set -e
# Configuration
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
BACKUP_DIR="$PROJECT_ROOT/backups/incremental"
TIMESTAMP=$(date +"%Y-%m-%d_%H-%M-%S")
BACKUP_FILE="$BACKUP_DIR/content-$TIMESTAMP.tar.gz"
LOG_FILE="$PROJECT_ROOT/backups/backup.log"
# Colors
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
log() {
echo "[$(date +"%Y-%m-%d %H:%M:%S")] $1" | tee -a "$LOG_FILE"
}
mkdir -p "$BACKUP_DIR"
log "${GREEN}Starting content backup...${NC}"
# Content directories to backup
CONTENT_ITEMS=(
"src/content/"
"public/images/"
"public/assets/"
)
# Create backup
cd "$PROJECT_ROOT"
tar -czf "$BACKUP_FILE" "${CONTENT_ITEMS[@]}" 2>/dev/null || {
log "${YELLOW}Warning: Some content directories may not exist${NC}"
}
# Verify backup
if [ ! -f "$BACKUP_FILE" ]; then
log "ERROR: Content backup failed"
exit 1
fi
BACKUP_SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
log "${GREEN}Content backup completed${NC}"
log "Location: $BACKUP_FILE"
log "Size: $BACKUP_SIZE"
# Create latest symlink
ln -sf "$BACKUP_FILE" "$BACKUP_DIR/latest-content.tar.gz"
# Cleanup old incremental backups (keep last 72 hours)
find "$BACKUP_DIR" -name "content-*.tar.gz" -type f -mtime +3 -delete 2>/dev/null || true
log "Old backups cleaned up"
echo -e "${GREEN}✓ Content backup completed${NC}"
echo -e " Location: $BACKUP_FILE"
echo -e " Size: $BACKUP_SIZE"
+150
View File
@@ -0,0 +1,150 @@
#!/bin/bash
# Full Backup Script for WorkRoot Website
# Backs up all critical files: content, source, configs, environment
set -e # Exit on error
# Configuration
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
BACKUP_DIR="$PROJECT_ROOT/backups/daily"
TIMESTAMP=$(date +"%Y-%m-%d_%H-%M-%S")
BACKUP_FILE="$BACKUP_DIR/full-backup-$TIMESTAMP.tar.gz"
LOG_FILE="$PROJECT_ROOT/backups/backup.log"
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# Logging function
log() {
echo "[$(date +"%Y-%m-%d %H:%M:%S")] $1" | tee -a "$LOG_FILE"
}
# Create backup directory if it doesn't exist
mkdir -p "$BACKUP_DIR"
log "${GREEN}Starting full backup...${NC}"
# Files and directories to backup
BACKUP_ITEMS=(
"src/"
"public/"
"astro.config.mjs"
"tailwind.config.mjs"
"playwright.config.ts"
"package.json"
"package-lock.json"
".env"
".env.example"
"tsconfig.json"
"DEPLOYMENT.md"
"README.md"
".agents/"
)
# Files to exclude
EXCLUDE_PATTERNS=(
"node_modules"
"dist"
".astro"
"test-results"
".git"
"backups"
"*.log"
)
# Build exclude arguments
EXCLUDE_ARGS=""
for pattern in "${EXCLUDE_PATTERNS[@]}"; do
EXCLUDE_ARGS="$EXCLUDE_ARGS --exclude=$pattern"
done
# Verify critical files exist
log "Verifying critical files..."
CRITICAL_FILES=("src/" "package.json" "astro.config.mjs")
for file in "${CRITICAL_FILES[@]}"; do
if [ ! -e "$PROJECT_ROOT/$file" ]; then
log "${RED}ERROR: Critical file/directory missing: $file${NC}"
exit 1
fi
done
# Create backup
log "Creating backup archive: $BACKUP_FILE"
cd "$PROJECT_ROOT"
tar -czf "$BACKUP_FILE" $EXCLUDE_ARGS "${BACKUP_ITEMS[@]}" 2>/dev/null || {
log "${RED}ERROR: Backup creation failed${NC}"
exit 1
}
# Verify backup was created
if [ ! -f "$BACKUP_FILE" ]; then
log "${RED}ERROR: Backup file was not created${NC}"
exit 1
fi
# Get backup size
BACKUP_SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
log "${GREEN}Backup created successfully${NC}"
log "Backup file: $BACKUP_FILE"
log "Backup size: $BACKUP_SIZE"
# Verify backup integrity
log "Verifying backup integrity..."
tar -tzf "$BACKUP_FILE" > /dev/null 2>&1 || {
log "${RED}ERROR: Backup verification failed - archive is corrupted${NC}"
rm "$BACKUP_FILE"
exit 1
}
log "${GREEN}Backup integrity verified${NC}"
# Count files in backup
FILE_COUNT=$(tar -tzf "$BACKUP_FILE" | wc -l)
log "Files backed up: $FILE_COUNT"
# Create latest symlink
LATEST_LINK="$BACKUP_DIR/latest-full.tar.gz"
ln -sf "$BACKUP_FILE" "$LATEST_LINK"
log "Latest backup link created: $LATEST_LINK"
# Cleanup old backups (keep last 7 days)
log "Cleaning up old daily backups (keeping last 7)..."
cd "$BACKUP_DIR"
ls -t full-backup-*.tar.gz 2>/dev/null | tail -n +8 | xargs -r rm -f
log "Cleanup completed"
# Weekly backup (if Sunday)
if [ "$(date +%u)" -eq 7 ]; then
WEEKLY_DIR="$PROJECT_ROOT/backups/weekly"
mkdir -p "$WEEKLY_DIR"
WEEKLY_FILE="$WEEKLY_DIR/weekly-backup-$(date +%Y-%m-%d).tar.gz"
cp "$BACKUP_FILE" "$WEEKLY_FILE"
log "${GREEN}Weekly backup created: $WEEKLY_FILE${NC}"
# Cleanup old weekly backups (keep last 4 weeks)
cd "$WEEKLY_DIR"
ls -t weekly-backup-*.tar.gz 2>/dev/null | tail -n +5 | xargs -r rm -f
fi
# Monthly backup (if 1st of month)
if [ "$(date +%d)" -eq 1 ]; then
MONTHLY_DIR="$PROJECT_ROOT/backups/monthly"
mkdir -p "$MONTHLY_DIR"
MONTHLY_FILE="$MONTHLY_DIR/monthly-backup-$(date +%Y-%m).tar.gz"
cp "$BACKUP_FILE" "$MONTHLY_FILE"
log "${GREEN}Monthly backup created: $MONTHLY_FILE${NC}"
# Cleanup old monthly backups (keep last 3 months)
cd "$MONTHLY_DIR"
ls -t monthly-backup-*.tar.gz 2>/dev/null | tail -n +4 | xargs -r rm -f
fi
log "${GREEN}Full backup completed successfully${NC}"
echo ""
echo -e "${GREEN}✓ Backup completed${NC}"
echo -e " Location: $BACKUP_FILE"
echo -e " Size: $BACKUP_SIZE"
echo -e " Files: $FILE_COUNT"
+100
View File
@@ -0,0 +1,100 @@
#!/bin/bash
# Cleanup Old Backups Script
# Enforces retention policy across all backup types
set -e
# Configuration
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
BACKUP_ROOT="$PROJECT_ROOT/backups"
LOG_FILE="$BACKUP_ROOT/cleanup.log"
# Retention periods (in days)
DAILY_RETENTION=7
INCREMENTAL_RETENTION=3
SAFETY_RETENTION=30
# Colors
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m'
log() {
echo "[$(date +"%Y-%m-%d %H:%M:%S")] $1" | tee -a "$LOG_FILE"
}
log "${YELLOW}Starting backup cleanup...${NC}"
# Daily backups - keep last 7
if [ -d "$BACKUP_ROOT/daily" ]; then
log "Cleaning daily backups (keeping last $DAILY_RETENTION)..."
cd "$BACKUP_ROOT/daily"
DELETED=$(ls -t full-backup-*.tar.gz 2>/dev/null | tail -n +$((DAILY_RETENTION + 1)) | wc -l)
ls -t full-backup-*.tar.gz 2>/dev/null | tail -n +$((DAILY_RETENTION + 1)) | xargs -r rm -f
log " Deleted $DELETED daily backups"
fi
# Weekly backups - keep last 4
if [ -d "$BACKUP_ROOT/weekly" ]; then
log "Cleaning weekly backups (keeping last 4)..."
cd "$BACKUP_ROOT/weekly"
DELETED=$(ls -t weekly-backup-*.tar.gz 2>/dev/null | tail -n +5 | wc -l)
ls -t weekly-backup-*.tar.gz 2>/dev/null | tail -n +5 | xargs -r rm -f
log " Deleted $DELETED weekly backups"
fi
# Monthly backups - keep last 3
if [ -d "$BACKUP_ROOT/monthly" ]; then
log "Cleaning monthly backups (keeping last 3)..."
cd "$BACKUP_ROOT/monthly"
DELETED=$(ls -t monthly-backup-*.tar.gz 2>/dev/null | tail -n +4 | wc -l)
ls -t monthly-backup-*.tar.gz 2>/dev/null | tail -n +4 | xargs -r rm -f
log " Deleted $DELETED monthly backups"
fi
# Incremental backups - keep last 3 days
if [ -d "$BACKUP_ROOT/incremental" ]; then
log "Cleaning incremental backups (keeping last $INCREMENTAL_RETENTION days)..."
cd "$BACKUP_ROOT/incremental"
DELETED=$(find . -name "content-*.tar.gz" -type f -mtime +$INCREMENTAL_RETENTION 2>/dev/null | wc -l)
find . -name "content-*.tar.gz" -type f -mtime +$INCREMENTAL_RETENTION -delete 2>/dev/null || true
log " Deleted $DELETED incremental backups"
fi
# Pre-deploy config backups - keep last 10
if [ -d "$BACKUP_ROOT/pre-deploy" ]; then
log "Cleaning pre-deploy backups (keeping last 10)..."
cd "$BACKUP_ROOT/pre-deploy"
DELETED=$(ls -t config-*.tar.gz 2>/dev/null | tail -n +11 | wc -l)
ls -t config-*.tar.gz 2>/dev/null | tail -n +11 | xargs -r rm -f
log " Deleted $DELETED pre-deploy backups"
fi
# Safety backups - keep last 30 days
if [ -d "$BACKUP_ROOT/safety" ]; then
log "Cleaning safety backups (keeping last $SAFETY_RETENTION days)..."
cd "$BACKUP_ROOT/safety"
DELETED=$(find . -name "pre-restore-*.tar.gz" -type f -mtime +$SAFETY_RETENTION 2>/dev/null | wc -l)
find . -name "pre-restore-*.tar.gz" -type f -mtime +$SAFETY_RETENTION -delete 2>/dev/null || true
log " Deleted $DELETED safety backups"
fi
# Report storage usage
log "Current backup storage usage:"
du -sh "$BACKUP_ROOT"/* 2>/dev/null | tee -a "$LOG_FILE" || true
# Check for large backups (>500MB)
log "Checking for large backups (>500MB)..."
find "$BACKUP_ROOT" -name "*.tar.gz" -type f -size +500M -exec ls -lh {} \; 2>/dev/null | tee -a "$LOG_FILE" || true
log "${GREEN}Cleanup completed${NC}"
# Summary
echo ""
echo -e "${GREEN}=== Cleanup Summary ===${NC}"
echo -e "Total backup storage: $(du -sh $BACKUP_ROOT | cut -f1)"
echo -e "Daily backups: $(ls $BACKUP_ROOT/daily/*.tar.gz 2>/dev/null | wc -l)"
echo -e "Weekly backups: $(ls $BACKUP_ROOT/weekly/*.tar.gz 2>/dev/null | wc -l)"
echo -e "Monthly backups: $(ls $BACKUP_ROOT/monthly/*.tar.gz 2>/dev/null | wc -l)"
echo -e "Pre-deploy backups: $(ls $BACKUP_ROOT/pre-deploy/*.tar.gz 2>/dev/null | wc -l)"
+54
View File
@@ -0,0 +1,54 @@
# WorkRoot Backup Automation - Cron Configuration
#
# To install:
# 1. Edit this file and replace /path/to/project with your actual project path
# 2. Add to your crontab: crontab -e
# 3. Paste the lines below (excluding comments)
# 4. Save and exit
#
# Verify cron jobs: crontab -l
# ============================================
# Daily Full Backup - 2:00 AM every day
# ============================================
0 2 * * * cd /path/to/project && /usr/bin/npm run backup:full >> /path/to/project/backups/cron.log 2>&1
# ============================================
# Incremental Content Backup - Every 6 hours
# ============================================
0 */6 * * * cd /path/to/project && /usr/bin/npm run backup:content >> /path/to/project/backups/cron.log 2>&1
# ============================================
# Cleanup Old Backups - Sunday at 3:00 AM
# ============================================
0 3 * * 0 cd /path/to/project && /usr/bin/npm run backup:cleanup >> /path/to/project/backups/cron.log 2>&1
# ============================================
# Verify Backup Health - Daily at 9:00 AM
# ============================================
0 9 * * * cd /path/to/project && /usr/bin/npm run backup:verify >> /path/to/project/backups/verify.log 2>&1
# ============================================
# Optional: Monthly backup verification drill
# First day of each month at 10:00 AM
# ============================================
# 0 10 1 * * cd /path/to/project && /path/to/project/scripts/backup/test-restore.sh >> /path/to/project/backups/drill.log 2>&1
# ============================================
# Cron Syntax Reference
# ============================================
# * * * * * command
# │ │ │ │ │
# │ │ │ │ └─── Day of week (0-7, Sunday = 0 or 7)
# │ │ │ └───── Month (1-12)
# │ │ └─────── Day of month (1-31)
# │ └───────── Hour (0-23)
# └─────────── Minute (0-59)
#
# Examples:
# 0 2 * * * - Daily at 2:00 AM
# */15 * * * * - Every 15 minutes
# 0 */6 * * * - Every 6 hours
# 0 3 * * 0 - Sunday at 3:00 AM
# 0 0 1 * * - First day of month at midnight
+161
View File
@@ -0,0 +1,161 @@
#!/bin/bash
# Restore Script for WorkRoot Website
# Restores from backup with safety checks
set -e
# Configuration
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
LOG_FILE="$PROJECT_ROOT/backups/restore.log"
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
log() {
echo "[$(date +"%Y-%m-%d %H:%M:%S")] $1" | tee -a "$LOG_FILE"
}
# Function to list available backups
list_backups() {
echo -e "${BLUE}Available Backups:${NC}\n"
echo -e "${YELLOW}Full Backups (Daily):${NC}"
ls -lht "$PROJECT_ROOT/backups/daily/"*.tar.gz 2>/dev/null | head -n 10 || echo " No daily backups found"
echo -e "\n${YELLOW}Weekly Backups:${NC}"
ls -lht "$PROJECT_ROOT/backups/weekly/"*.tar.gz 2>/dev/null | head -n 5 || echo " No weekly backups found"
echo -e "\n${YELLOW}Monthly Backups:${NC}"
ls -lht "$PROJECT_ROOT/backups/monthly/"*.tar.gz 2>/dev/null | head -n 3 || echo " No monthly backups found"
echo -e "\n${YELLOW}Config Backups (Pre-deploy):${NC}"
ls -lht "$PROJECT_ROOT/backups/pre-deploy/"*.tar.gz 2>/dev/null | head -n 5 || echo " No config backups found"
}
# Function to verify backup integrity
verify_backup() {
local backup_file="$1"
if [ ! -f "$backup_file" ]; then
echo -e "${RED}ERROR: Backup file not found: $backup_file${NC}"
return 1
fi
echo -e "${YELLOW}Verifying backup integrity...${NC}"
if tar -tzf "$backup_file" > /dev/null 2>&1; then
echo -e "${GREEN}✓ Backup integrity verified${NC}"
return 0
else
echo -e "${RED}✗ Backup is corrupted${NC}"
return 1
fi
}
# Function to create safety backup before restore
safety_backup() {
echo -e "${YELLOW}Creating safety backup of current state...${NC}"
SAFETY_DIR="$PROJECT_ROOT/backups/safety"
mkdir -p "$SAFETY_DIR"
SAFETY_FILE="$SAFETY_DIR/pre-restore-$(date +%Y-%m-%d_%H-%M-%S).tar.gz"
tar -czf "$SAFETY_FILE" \
--exclude=node_modules \
--exclude=dist \
--exclude=.astro \
--exclude=backups \
src/ public/ *.config.* package.json .env 2>/dev/null || true
echo -e "${GREEN}✓ Safety backup created: $SAFETY_FILE${NC}"
}
# Main restore function
restore_backup() {
local backup_file="$1"
local restore_path="${2:-$PROJECT_ROOT}"
log "${BLUE}Starting restore process...${NC}"
log "Backup file: $backup_file"
log "Restore path: $restore_path"
# Verify backup
verify_backup "$backup_file" || exit 1
# Show backup contents
echo -e "\n${YELLOW}Backup contains:${NC}"
tar -tzf "$backup_file" | head -n 20
echo "..."
# Confirm restore
echo -e "\n${RED}WARNING: This will overwrite current files!${NC}"
read -p "Continue with restore? (yes/no): " confirm
if [ "$confirm" != "yes" ]; then
echo "Restore cancelled"
exit 0
fi
# Create safety backup
safety_backup
# Extract backup
echo -e "\n${YELLOW}Extracting backup...${NC}"
cd "$restore_path"
tar -xzf "$backup_file" || {
echo -e "${RED}ERROR: Restore failed${NC}"
exit 1
}
echo -e "${GREEN}✓ Files extracted successfully${NC}"
# Verify critical files
echo -e "\n${YELLOW}Verifying restored files...${NC}"
CRITICAL_FILES=("src/" "package.json" "astro.config.mjs")
for file in "${CRITICAL_FILES[@]}"; do
if [ -e "$file" ]; then
echo -e " ${GREEN}${NC} $file"
else
echo -e " ${RED}${NC} $file (missing)"
fi
done
# Post-restore instructions
echo -e "\n${GREEN}=== Restore Completed ===${NC}"
echo -e "\n${YELLOW}Next steps:${NC}"
echo "1. Verify .env file and update secrets if needed"
echo "2. Run: npm install"
echo "3. Run: npm run build"
echo "4. Run: npm run test"
echo "5. Check logs for any issues"
log "${GREEN}Restore completed successfully${NC}"
}
# Main script logic
case "${1:-}" in
list|--list|-l)
list_backups
;;
verify|--verify|-v)
if [ -z "$2" ]; then
echo "Usage: $0 verify <backup-file>"
exit 1
fi
verify_backup "$2"
;;
*)
if [ -z "$1" ]; then
echo -e "${YELLOW}Usage:${NC}"
echo " $0 list - List available backups"
echo " $0 verify <backup-file> - Verify backup integrity"
echo " $0 <backup-file> - Restore from backup"
echo ""
echo -e "${YELLOW}Quick restore from latest:${NC}"
echo " $0 backups/daily/latest-full.tar.gz"
exit 1
fi
restore_backup "$1" "$2"
;;
esac
+72
View File
@@ -0,0 +1,72 @@
#!/bin/bash
# Backup System Setup Script
# One-time setup for the automated backup system
set -e
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
# Colors
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
echo -e "${BLUE}=== WorkRoot Backup System Setup ===${NC}\n"
# Step 1: Create directory structure
echo -e "${YELLOW}Step 1: Creating backup directories...${NC}"
mkdir -p "$PROJECT_ROOT/backups"/{daily,weekly,monthly,pre-deploy,incremental,safety}
echo -e "${GREEN}✓ Directories created${NC}\n"
# Step 2: Make scripts executable
echo -e "${YELLOW}Step 2: Making scripts executable...${NC}"
chmod +x "$PROJECT_ROOT/scripts/backup"/*.sh
echo -e "${GREEN}✓ Scripts are now executable${NC}\n"
# Step 3: Test backup
echo -e "${YELLOW}Step 3: Running test backup...${NC}"
cd "$PROJECT_ROOT"
bash scripts/backup/backup-config.sh
echo -e "${GREEN}✓ Test backup completed${NC}\n"
# Step 4: Verify backup
echo -e "${YELLOW}Step 4: Verifying backup system...${NC}"
bash scripts/backup/verify.sh
echo ""
# Step 5: Instructions
echo -e "${BLUE}=== Setup Complete! ===${NC}\n"
echo -e "${GREEN}Next Steps:${NC}"
echo "1. Test full backup:"
echo -e " ${YELLOW}npm run backup:full${NC}\n"
echo "2. Set up automation (choose one):"
echo -e " ${YELLOW}Linux/macOS:${NC} Edit cron jobs"
echo " crontab -e"
echo " (See scripts/backup/cron.example for template)"
echo ""
echo -e " ${YELLOW}Windows:${NC} Run PowerShell as Administrator"
echo " .\\scripts\\backup\\windows-tasks.ps1"
echo ""
echo "3. Verify automated backups work:"
echo -e " ${YELLOW}npm run backup:verify${NC}\n"
echo -e "${GREEN}Available Commands:${NC}"
echo " npm run backup:full - Full backup"
echo " npm run backup:content - Content only"
echo " npm run backup:config - Config files only"
echo " npm run backup:verify - Check health"
echo " npm run backup:list - List backups"
echo " npm run backup:restore - Restore from backup"
echo " npm run backup:cleanup - Remove old backups"
echo ""
echo -e "${BLUE}Documentation:${NC}"
echo " scripts/backup/README.md"
echo " .agents/devops-engineer/BACKUP_STRATEGY.md"
echo ""
echo -e "${GREEN}Setup completed successfully!${NC}"
+177
View File
@@ -0,0 +1,177 @@
#!/bin/bash
# Backup Verification Script
# Checks backup health, integrity, and provides status report
set -e
# Configuration
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
BACKUP_ROOT="$PROJECT_ROOT/backups"
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
# Counters
TOTAL_BACKUPS=0
VALID_BACKUPS=0
CORRUPTED_BACKUPS=0
WARNINGS=0
echo -e "${BLUE}=== Backup Verification Report ===${NC}\n"
echo "Generated: $(date)"
echo "Backup location: $BACKUP_ROOT"
echo ""
# Function to verify a single backup
verify_single_backup() {
local backup_file="$1"
TOTAL_BACKUPS=$((TOTAL_BACKUPS + 1))
if tar -tzf "$backup_file" > /dev/null 2>&1; then
VALID_BACKUPS=$((VALID_BACKUPS + 1))
return 0
else
CORRUPTED_BACKUPS=$((CORRUPTED_BACKUPS + 1))
echo -e " ${RED}✗ CORRUPTED: $backup_file${NC}"
return 1
fi
}
# Check daily backups
echo -e "${YELLOW}Daily Backups:${NC}"
if [ -d "$BACKUP_ROOT/daily" ]; then
DAILY_COUNT=$(ls "$BACKUP_ROOT/daily"/*.tar.gz 2>/dev/null | wc -l)
echo " Found: $DAILY_COUNT backups"
if [ "$DAILY_COUNT" -eq 0 ]; then
echo -e " ${RED}⚠ WARNING: No daily backups found${NC}"
WARNINGS=$((WARNINGS + 1))
else
# Check latest backup age
LATEST=$(ls -t "$BACKUP_ROOT/daily"/*.tar.gz 2>/dev/null | head -n 1)
AGE_HOURS=$(( ($(date +%s) - $(stat -c %Y "$LATEST" 2>/dev/null || stat -f %m "$LATEST")) / 3600 ))
echo " Latest backup: $(basename "$LATEST")"
echo " Age: ${AGE_HOURS} hours ago"
if [ "$AGE_HOURS" -gt 24 ]; then
echo -e " ${RED}⚠ WARNING: Latest backup is >24 hours old${NC}"
WARNINGS=$((WARNINGS + 1))
fi
# Verify integrity
for backup in "$BACKUP_ROOT/daily"/*.tar.gz; do
verify_single_backup "$backup" > /dev/null
done
echo -e " ${GREEN}✓ All daily backups verified${NC}"
fi
else
echo -e " ${RED}✗ Daily backup directory not found${NC}"
WARNINGS=$((WARNINGS + 1))
fi
echo ""
# Check weekly backups
echo -e "${YELLOW}Weekly Backups:${NC}"
if [ -d "$BACKUP_ROOT/weekly" ]; then
WEEKLY_COUNT=$(ls "$BACKUP_ROOT/weekly"/*.tar.gz 2>/dev/null | wc -l)
echo " Found: $WEEKLY_COUNT backups"
if ls "$BACKUP_ROOT/weekly"/*.tar.gz 1> /dev/null 2>&1; then
for backup in "$BACKUP_ROOT/weekly"/*.tar.gz; do
verify_single_backup "$backup" > /dev/null
done
fi
if [ "$WEEKLY_COUNT" -gt 0 ]; then
echo -e " ${GREEN}✓ All weekly backups verified${NC}"
fi
else
echo " No weekly backups directory"
fi
echo ""
# Check monthly backups
echo -e "${YELLOW}Monthly Backups:${NC}"
if [ -d "$BACKUP_ROOT/monthly" ]; then
MONTHLY_COUNT=$(ls "$BACKUP_ROOT/monthly"/*.tar.gz 2>/dev/null | wc -l)
echo " Found: $MONTHLY_COUNT backups"
if ls "$BACKUP_ROOT/monthly"/*.tar.gz 1> /dev/null 2>&1; then
for backup in "$BACKUP_ROOT/monthly"/*.tar.gz; do
verify_single_backup "$backup" > /dev/null
done
fi
if [ "$MONTHLY_COUNT" -gt 0 ]; then
echo -e " ${GREEN}✓ All monthly backups verified${NC}"
fi
else
echo " No monthly backups directory"
fi
echo ""
# Storage usage
echo -e "${YELLOW}Storage Usage:${NC}"
if [ -d "$BACKUP_ROOT" ]; then
TOTAL_SIZE=$(du -sh "$BACKUP_ROOT" 2>/dev/null | cut -f1)
echo " Total backup size: $TOTAL_SIZE"
# Check if approaching limits (>5GB)
SIZE_MB=$(du -sm "$BACKUP_ROOT" 2>/dev/null | cut -f1)
if [ "$SIZE_MB" -gt 5120 ]; then
echo -e " ${YELLOW}⚠ WARNING: Backup storage >5GB, consider cleanup${NC}"
WARNINGS=$((WARNINGS + 1))
fi
fi
echo ""
# Check disk space
echo -e "${YELLOW}Disk Space:${NC}"
DISK_USAGE=$(df -h "$BACKUP_ROOT" | tail -1)
DISK_PERCENT=$(echo "$DISK_USAGE" | awk '{print $5}' | sed 's/%//')
echo " Disk usage: $DISK_PERCENT%"
if [ "$DISK_PERCENT" -gt 80 ]; then
echo -e " ${RED}⚠ WARNING: Disk usage >80%${NC}"
WARNINGS=$((WARNINGS + 1))
fi
echo ""
# Summary
echo -e "${BLUE}=== Summary ===${NC}"
echo "Total backups checked: $TOTAL_BACKUPS"
echo -e "Valid backups: ${GREEN}$VALID_BACKUPS${NC}"
if [ "$CORRUPTED_BACKUPS" -gt 0 ]; then
echo -e "Corrupted backups: ${RED}$CORRUPTED_BACKUPS${NC}"
fi
if [ "$WARNINGS" -gt 0 ]; then
echo -e "Warnings: ${YELLOW}$WARNINGS${NC}"
fi
echo ""
# Final status
if [ "$CORRUPTED_BACKUPS" -eq 0 ] && [ "$WARNINGS" -eq 0 ] && [ "$VALID_BACKUPS" -gt 0 ]; then
echo -e "${GREEN}✓ Backup system healthy${NC}"
exit 0
elif [ "$CORRUPTED_BACKUPS" -gt 0 ]; then
echo -e "${RED}✗ CRITICAL: Corrupted backups detected${NC}"
exit 2
elif [ "$WARNINGS" -gt 0 ]; then
echo -e "${YELLOW}⚠ Backup system has warnings${NC}"
exit 1
else
echo -e "${YELLOW}⚠ No backups found - run initial backup${NC}"
exit 1
fi
+67
View File
@@ -0,0 +1,67 @@
# WorkRoot Backup Automation - Windows Task Scheduler Setup
#
# Run this PowerShell script as Administrator to set up automated backups on Windows
#
# Usage: .\windows-tasks.ps1
# Get the project root directory
$ProjectRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot)
$LogPath = Join-Path $ProjectRoot "backups"
Write-Host "Setting up Windows Task Scheduler for backups..." -ForegroundColor Cyan
Write-Host "Project root: $ProjectRoot" -ForegroundColor Yellow
# Ensure log directory exists
if (-not (Test-Path $LogPath)) {
New-Item -ItemType Directory -Path $LogPath -Force | Out-Null
}
# Daily Full Backup at 2:00 AM
Write-Host "`nCreating daily backup task..." -ForegroundColor Green
$DailyAction = New-ScheduledTaskAction -Execute "npm" -Argument "run backup:full" -WorkingDirectory $ProjectRoot
$DailyTrigger = New-ScheduledTaskTrigger -Daily -At 2am
$DailySettings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries
Register-ScheduledTask -TaskName "WorkRoot-DailyBackup" -Action $DailyAction -Trigger $DailyTrigger -Settings $DailySettings -Description "WorkRoot daily full backup" -Force | Out-Null
Write-Host "✓ Daily backup scheduled for 2:00 AM" -ForegroundColor Green
# Incremental Backup Every 6 Hours
Write-Host "`nCreating incremental backup task..." -ForegroundColor Green
$IncrementalAction = New-ScheduledTaskAction -Execute "npm" -Argument "run backup:content" -WorkingDirectory $ProjectRoot
$IncrementalTrigger = New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Hours 6) -RepetitionDuration ([TimeSpan]::MaxValue)
Register-ScheduledTask -TaskName "WorkRoot-IncrementalBackup" -Action $IncrementalAction -Trigger $IncrementalTrigger -Settings $DailySettings -Description "WorkRoot incremental content backup" -Force | Out-Null
Write-Host "✓ Incremental backup scheduled every 6 hours" -ForegroundColor Green
# Weekly Cleanup on Sunday at 3:00 AM
Write-Host "`nCreating cleanup task..." -ForegroundColor Green
$CleanupAction = New-ScheduledTaskAction -Execute "npm" -Argument "run backup:cleanup" -WorkingDirectory $ProjectRoot
$CleanupTrigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Sunday -At 3am
Register-ScheduledTask -TaskName "WorkRoot-BackupCleanup" -Action $CleanupAction -Trigger $CleanupTrigger -Settings $DailySettings -Description "WorkRoot backup cleanup" -Force | Out-Null
Write-Host "✓ Cleanup scheduled for Sunday 3:00 AM" -ForegroundColor Green
# Daily Verification at 9:00 AM
Write-Host "`nCreating verification task..." -ForegroundColor Green
$VerifyAction = New-ScheduledTaskAction -Execute "npm" -Argument "run backup:verify" -WorkingDirectory $ProjectRoot
$VerifyTrigger = New-ScheduledTaskTrigger -Daily -At 9am
Register-ScheduledTask -TaskName "WorkRoot-BackupVerify" -Action $VerifyAction -Trigger $VerifyTrigger -Settings $DailySettings -Description "WorkRoot backup verification" -Force | Out-Null
Write-Host "✓ Verification scheduled for 9:00 AM daily" -ForegroundColor Green
Write-Host "`n========================================" -ForegroundColor Cyan
Write-Host "Backup automation setup complete!" -ForegroundColor Green
Write-Host "========================================" -ForegroundColor Cyan
Write-Host "`nScheduled Tasks Created:" -ForegroundColor Yellow
Write-Host " • Daily Full Backup - Every day at 2:00 AM"
Write-Host " • Incremental Backup - Every 6 hours"
Write-Host " • Weekly Cleanup - Sunday at 3:00 AM"
Write-Host " • Daily Verification - Every day at 9:00 AM"
Write-Host "`nTo view scheduled tasks:" -ForegroundColor Yellow
Write-Host " Get-ScheduledTask | Where-Object {`$_.TaskName -like 'WorkRoot-*'}"
Write-Host "`nTo remove all tasks:" -ForegroundColor Yellow
Write-Host " Get-ScheduledTask | Where-Object {`$_.TaskName -like 'WorkRoot-*'} | Unregister-ScheduledTask -Confirm:`$false"
Write-Host "`nTo run a backup now (test):" -ForegroundColor Yellow
Write-Host " npm run backup:full"
Write-Host "`n" -ForegroundColor Green