233 lines
5.4 KiB
Bash
Executable File
233 lines
5.4 KiB
Bash
Executable File
#!/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 "$@" |