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
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:
@@ -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.
|
||||
@@ -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"
|
||||
@@ -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"
|
||||
@@ -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"
|
||||
@@ -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)"
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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}"
|
||||
@@ -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
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user