mgmt/scripts/utilities/backup/backup-all.sh

233 lines
5.4 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# 全量备份脚本
# 备份所有重要的配置和数据
set -euo pipefail
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 配置
BACKUP_DIR="backups/$(date +%Y%m%d_%H%M%S)"
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../../" && pwd)"
# 日志函数
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# 创建备份目录
create_backup_dir() {
log_info "创建备份目录: $BACKUP_DIR"
mkdir -p "$BACKUP_DIR"
}
# 备份配置文件
backup_configs() {
log_info "备份配置文件..."
local config_dirs=(
"components"
"infrastructure/configs"
"security"
"deployment/ansible"
"deployment/terraform"
)
for dir in "${config_dirs[@]}"; do
if [ -d "$dir" ]; then
log_info "备份 $dir"
cp -r "$dir" "$BACKUP_DIR/"
else
log_warning "目录不存在: $dir"
fi
done
}
# 备份脚本
backup_scripts() {
log_info "备份脚本..."
cp -r scripts "$BACKUP_DIR/"
}
# 备份环境文件
backup_env_files() {
log_info "备份环境文件..."
local env_files=(
".env"
"mcp_shared_config.json"
"hosts_inventory"
"Makefile"
)
for file in "${env_files[@]}"; do
if [ -f "$file" ]; then
log_info "备份 $file"
cp "$file" "$BACKUP_DIR/"
else
log_warning "文件不存在: $file"
fi
done
}
# 备份 Vault 数据(如果运行中)
backup_vault() {
log_info "检查 Vault 状态..."
if command -v vault &> /dev/null && vault status &> /dev/null; then
log_info "备份 Vault 数据..."
mkdir -p "$BACKUP_DIR/vault"
# 备份 Vault 策略
vault policy list > "$BACKUP_DIR/vault/policies.txt" 2>/dev/null || true
# 备份 Vault 秘密引擎
vault secrets list -format=json > "$BACKUP_DIR/vault/secrets_engines.json" 2>/dev/null || true
log_success "Vault 数据备份完成"
else
log_warning "Vault 未运行或不可访问,跳过 Vault 备份"
fi
}
# 备份 Consul 数据(如果运行中)
backup_consul() {
log_info "检查 Consul 状态..."
if command -v consul &> /dev/null && consul members &> /dev/null; then
log_info "备份 Consul 数据..."
mkdir -p "$BACKUP_DIR/consul"
# 备份 Consul KV 存储
consul kv export > "$BACKUP_DIR/consul/kv_export.json" 2>/dev/null || true
# 备份 Consul 服务
consul catalog services -format=json > "$BACKUP_DIR/consul/services.json" 2>/dev/null || true
log_success "Consul 数据备份完成"
else
log_warning "Consul 未运行或不可访问,跳过 Consul 备份"
fi
}
# 创建备份清单
create_manifest() {
log_info "创建备份清单..."
cat > "$BACKUP_DIR/MANIFEST.md" << EOF
# 备份清单
**备份时间**: $(date)
**备份目录**: $BACKUP_DIR
**项目根目录**: $PROJECT_ROOT
## 备份内容
### 配置文件
- components/ - 组件配置
- infrastructure/configs/ - 基础设施配置
- security/ - 安全配置
- deployment/ - 部署配置
### 脚本文件
- scripts/ - 所有项目脚本
### 环境文件
- .env - 环境变量
- mcp_shared_config.json - MCP 配置
- hosts_inventory - 主机清单
- Makefile - 构建配置
### 服务数据
- vault/ - Vault 数据(如果可用)
- consul/ - Consul 数据(如果可用)
## 恢复说明
1. 解压备份文件到项目目录
2. 恢复环境变量: \`source .env\`
3. 重新设置脚本权限: \`find scripts/ -name "*.sh" -exec chmod +x {} \\;\`
4. 根据需要恢复服务数据
## 备份统计
**总文件数**: $(find "$BACKUP_DIR" -type f | wc -l)
**总大小**: $(du -sh "$BACKUP_DIR" | cut -f1)
EOF
log_success "备份清单创建完成"
}
# 压缩备份
compress_backup() {
log_info "压缩备份..."
local archive_name="backup_$(basename "$BACKUP_DIR").tar.gz"
tar -czf "$archive_name" -C "$(dirname "$BACKUP_DIR")" "$(basename "$BACKUP_DIR")"
log_success "备份已压缩: $archive_name"
log_info "备份大小: $(du -sh "$archive_name" | cut -f1)"
# 可选:删除未压缩的备份目录
read -p "是否删除未压缩的备份目录? (y/N): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
rm -rf "$BACKUP_DIR"
log_info "未压缩的备份目录已删除"
fi
}
# 清理旧备份
cleanup_old_backups() {
log_info "清理旧备份..."
# 保留最近的5个备份
local backup_count=$(ls -1 backup_*.tar.gz 2>/dev/null | wc -l)
if [ "$backup_count" -gt 5 ]; then
log_info "发现 $backup_count 个备份保留最新的5个"
ls -1t backup_*.tar.gz | tail -n +6 | xargs rm -f
log_success "旧备份清理完成"
else
log_info "备份数量未超过限制,无需清理"
fi
}
# 主函数
main() {
log_info "开始全量备份..."
cd "$PROJECT_ROOT"
create_backup_dir
backup_configs
backup_scripts
backup_env_files
backup_vault
backup_consul
create_manifest
compress_backup
cleanup_old_backups
log_success "全量备份完成!"
}
# 执行主函数
main "$@"