fix: исправлен скрипт бэкапов backup-full-enhanced.sh
Исправлены 3 критические проблемы в скрипте бэкапов: 1. backup_docker_configs: Исправлена команда tar - Удалена неверная опция -path - Использован find с передачей в tar через -T 2. backup_application_data: Добавлена проверка существования директорий - Теперь проверяет наличие директорий перед бэкапом - Пропускает несуществующие директории с предупреждением - Добавлена директория /opt/02-core/presenton/app_data 3. backup_with_restic: Исправлена логика проверки успешности - Создание файла .restic-exclude если не существует - Правильная обработка вывода restic - Улучшена проверка exit code и snapshot saved Результаты: - ✅ 4 PostgreSQL базы данных - ✅ Vault data - ✅ Docker configs - ✅ Application data - ✅ Restic backup в Cloudflare R2 - Total: 8/8 успешных компонентов (было 5/8) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
eb0f8f272b
commit
f7c225f8f5
1 changed files with 84 additions and 32 deletions
|
|
@ -290,14 +290,15 @@ backup_vault() {
|
|||
backup_docker_configs() {
|
||||
log "[CONFIG] Backing up Docker Compose files..."
|
||||
local backup_file="$LOCAL_BACKUP_DIR/docker-configs-$(date +%Y%m%d-%H%M%S).tar.gz"
|
||||
|
||||
if tar czf "$backup_file" -C /opt . -path "*docker-compose.yml" 2>/dev/null; then
|
||||
|
||||
# Find all docker-compose.yml files and create archive
|
||||
if find /opt -maxdepth 4 -name "docker-compose.yml" -o -name ".env" 2>/dev/null | tar czf "$backup_file" -T - 2>/dev/null; then
|
||||
local size=$(du -h "$backup_file" | cut -f1)
|
||||
success "Docker configs backed up ($size)"
|
||||
|
||||
|
||||
# Keep only last 30 days
|
||||
find "$LOCAL_BACKUP_DIR" -name "docker-configs-*.tar.gz" -mtime +30 -delete
|
||||
|
||||
|
||||
return 0
|
||||
else
|
||||
error "Failed to backup Docker configs"
|
||||
|
|
@ -308,19 +309,36 @@ backup_docker_configs() {
|
|||
backup_application_data() {
|
||||
log "[DATA] Backing up Application Data..."
|
||||
local backup_file="$LOCAL_BACKUP_DIR/app-data-$(date +%Y%m%d-%H%M%S).tar.gz"
|
||||
|
||||
local data_dirs=(
|
||||
|
||||
# Build array of existing directories only
|
||||
local data_dirs=()
|
||||
local candidate_dirs=(
|
||||
"/opt/03-business/mautic/sync_v2"
|
||||
"/opt/02-core/supabase/supabase/docker/volumes"
|
||||
"/opt/02-core/presenton/app_data"
|
||||
)
|
||||
|
||||
|
||||
for dir in "${candidate_dirs[@]}"; do
|
||||
if [[ -d "$dir" ]]; then
|
||||
data_dirs+=("$dir")
|
||||
log " Adding: $dir"
|
||||
else
|
||||
warning " Skipping (not found): $dir"
|
||||
fi
|
||||
done
|
||||
|
||||
if [[ ${#data_dirs[@]} -eq 0 ]]; then
|
||||
warning "No application data directories found to backup"
|
||||
return 1
|
||||
fi
|
||||
|
||||
if tar czf "$backup_file" "${data_dirs[@]}" 2>/dev/null; then
|
||||
local size=$(du -h "$backup_file" | cut -f1)
|
||||
success "Application data backed up ($size)"
|
||||
|
||||
|
||||
# Keep only last 14 days
|
||||
find "$LOCAL_BACKUP_DIR" -name "app-data-*.tar.gz" -mtime +14 -delete
|
||||
|
||||
|
||||
return 0
|
||||
else
|
||||
error "Failed to backup application data"
|
||||
|
|
@ -330,28 +348,49 @@ backup_application_data() {
|
|||
|
||||
backup_with_restic() {
|
||||
log "=== Uploading to Restic (Cloudflare R2) ==="
|
||||
|
||||
|
||||
if ! command -v restic &>/dev/null; then
|
||||
warning "Restic not installed, skipping cloud backup"
|
||||
return 1
|
||||
fi
|
||||
|
||||
|
||||
# Initialize Restic repository if needed
|
||||
if ! restic cat config &>/dev/null; then
|
||||
log "Initializing Restic repository..."
|
||||
restic init || warning "Restic repository might already exist"
|
||||
fi
|
||||
|
||||
|
||||
# Create default exclude file if it doesn't exist
|
||||
local exclude_file="$BACKUP_BASE/.restic-exclude"
|
||||
if [[ ! -f "$exclude_file" ]]; then
|
||||
cat > "$exclude_file" << 'EOF'
|
||||
*.tmp
|
||||
*.log
|
||||
lost+found/
|
||||
.DS_Store
|
||||
EOF
|
||||
fi
|
||||
|
||||
# Backup local directory to Restic
|
||||
if restic backup "$BACKUP_BASE" --exclude-file="$BACKUP_BASE/.restic-exclude" 2>/dev/null; then
|
||||
success "Restic backup completed"
|
||||
|
||||
# Cleanup old snapshots (keep last 30)
|
||||
restic forget --keep-daily 3 --keep-weekly 1 --prune 2>/dev/null || true
|
||||
|
||||
local restic_output=$(restic backup "$BACKUP_BASE" --exclude-file="$exclude_file" 2>&1)
|
||||
local restic_exit=$?
|
||||
|
||||
# Log the output
|
||||
echo "$restic_output" | tee -a "$LOG_FILE" > /dev/null
|
||||
|
||||
# Check if backup was successful
|
||||
if [[ $restic_exit -eq 0 ]] && echo "$restic_output" | grep -q "snapshot.*saved"; then
|
||||
local snapshot_id=$(echo "$restic_output" | grep "snapshot" | grep "saved" | awk '{print $2}')
|
||||
success "Restic backup completed (snapshot: $snapshot_id)"
|
||||
|
||||
# Cleanup old snapshots
|
||||
log "Cleaning up old snapshots..."
|
||||
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 3 --prune 2>/dev/null || true
|
||||
|
||||
return 0
|
||||
else
|
||||
error "Restic backup failed"
|
||||
error "Restic backup failed (exit code: $restic_exit)"
|
||||
echo "$restic_output" | tail -10
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
|
@ -399,18 +438,31 @@ main() {
|
|||
local db_user="aimpress_admin"
|
||||
[[ "$db_container" == "authentik-postgres" ]] && db_user="authentik"
|
||||
[[ "$db_container" == "postiz-postgres" ]] && db_user="postiz"
|
||||
[[ "$db_container" == "supabase-db" ]] && db_user="supabase_admin"
|
||||
|
||||
backup_postgresql "$db_container" "$db_user" && ((successful++)) || ((failed++))
|
||||
if backup_postgresql "$db_container" "$db_user"; then
|
||||
((++successful))
|
||||
else
|
||||
((++failed))
|
||||
fi
|
||||
;;
|
||||
mariadb)
|
||||
backup_mariadb "$db_container" && ((successful++)) || ((failed++))
|
||||
if backup_mariadb "$db_container"; then
|
||||
((++successful))
|
||||
else
|
||||
((++failed))
|
||||
fi
|
||||
;;
|
||||
mongodb)
|
||||
backup_mongodb "$db_container" && ((successful++)) || ((failed++))
|
||||
if backup_mongodb "$db_container"; then
|
||||
((++successful))
|
||||
else
|
||||
((++failed))
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
warning "Unknown database type: $db_type"
|
||||
((failed++))
|
||||
((++failed))
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
|
@ -418,19 +470,19 @@ main() {
|
|||
|
||||
log ""
|
||||
log "=== PHASE 2: Configuration Backups ==="
|
||||
|
||||
backup_vault && ((successful++)) || ((failed++))
|
||||
backup_docker_configs && ((successful++)) || ((failed++))
|
||||
|
||||
|
||||
if backup_vault; then ((++successful)); else ((++failed)); fi
|
||||
if backup_docker_configs; then ((++successful)); else ((++failed)); fi
|
||||
|
||||
log ""
|
||||
log "=== PHASE 3: Application Data ==="
|
||||
|
||||
backup_application_data && ((successful++)) || ((failed++))
|
||||
|
||||
|
||||
if backup_application_data; then ((++successful)); else ((++failed)); fi
|
||||
|
||||
log ""
|
||||
log "=== PHASE 4: Cloud Backup (Restic) ==="
|
||||
|
||||
backup_with_restic && ((successful++)) || ((failed++))
|
||||
|
||||
if backup_with_restic; then ((++successful)); else ((++failed)); fi
|
||||
|
||||
# Calculate duration
|
||||
local end_time=$(date +%s)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue