commit 4d00283654a49e27a243041bbd4d29de4c15cccb Author: Wang Defa <2-wangdefa@users.noreply.gitlab.bcde.io> Date: Thu Dec 25 15:02:07 2025 +0800 feat: 实现 Docker 备份系统,支持远程一键安装 实现功能: - 文件夹和 MySQL 容器数据库备份 - tar.gz 压缩和自动清理旧备份 - systemd 定时任务集成 - 远程一键安装脚本(通过 Gitea 仓库) - 完整的 llmdoc 文档系统 安装方式: bash <(curl -sL https://gitea.bcde.io/wangdefa/docker-backup/raw/branch/main/install.sh) 配置文件位置:/etc/docker-backup/config.yml 命令:docker-backup, docker-backup-cleanup diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..31df2f7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,41 @@ +# 编辑器和 IDE +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# 配置文件(不提交实际的配置,只提交示例) +config/backup.yml + +# 日志文件 +*.log + +# 备份文件 +*.tar.gz +*.sql.gz + +# 临时文件 +tmp/ +temp/ +*.tmp + +# macOS +.DS_Store + +# Claude Code +.mcp.json +.claude/ + +# 容器和云相关 +*.env +docker-compose.override.yml + +# 依赖和构建 +node_modules/ +dist/ +build/ + +# 安全和秘钥 +*.key +*.pem \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..92a2b30 --- /dev/null +++ b/README.md @@ -0,0 +1,330 @@ +# Docker Backup + +一个功能强大、易于使用的 Docker 数据备份工具,支持文件夹备份、MySQL 容器数据库备份、定时任务和自动清理旧备份。 + +## 功能特性 + +- ✅ **文件夹备份**: 打包指定文件夹为 tar.gz 压缩文件 +- ✅ **排除目录**: 支持配置需要排除的文件夹和文件模式 +- ✅ **MySQL 备份**: 备份 MySQL 容器数据库为 sql.gz 压缩文件 +- ✅ **合并打包**: 将文件夹和数据库备份合并为单个压缩文件 +- ✅ **定时备份**: 使用 systemd timer 实现定时自动备份 +- ✅ **自动清理**: 按天数或数量自动清理旧备份文件 +- ✅ **灵活配置**: 使用 YAML 配置文件,易于管理 +- ✅ **日志记录**: 完整的操作日志,方便问题排查 +- ✅ **一键安装**: 提供自动化安装脚本 + +## 系统要求 + +- **操作系统**: Linux (支持 systemd) +- **依赖工具**: bash, tar, gzip, docker, yq +- **权限**: root 或 sudo 权限 + +## 快速开始 + +### 1. 一键安装 + +使用以下命令直接从远程安装: + +```bash +bash <(curl -sL https://gitea.bcde.io/wangdefa/docker-backup/raw/branch/main/install.sh) +``` + +安装脚本会自动完成以下操作: +- 检测操作系统 +- 安装依赖工具(yq 等) +- 从远程仓库下载脚本文件 +- 安装到系统目录(`/usr/local/bin`、`/etc/docker-backup`) +- 创建配置文件 +- 配置 systemd 服务和定时器 +- 启动定时任务 + +### 2. 编辑配置文件 + +```bash +sudo vi /etc/docker-backup/config.yml +``` + +根据您的实际环境修改配置,主要包括: +- 备份输出目录 +- 需要备份的文件夹 +- 需要排除的目录 +- MySQL 容器信息 +- 保留策略 + +### 3. 测试备份 + +```bash +# 手动执行一次备份 +docker-backup + +# 查看备份文件 +docker-backup-cleanup --list +``` + +## 配置说明 + +### 配置文件示例 + +配置文件位于 `/etc/docker-backup/config.yml`,主要配置项说明: + +```yaml +# 备份基础配置 +backup: + output_dir: "/var/backups/docker-backup" # 备份文件存放目录 + prefix: "backup" # 备份文件名前缀 + retention: + enabled: true # 是否启用自动清理 + keep_days: 7 # 保留最近 N 天的备份 + +# 文件夹备份配置 +folders: + enabled: true # 是否启用文件夹备份 + sources: # 需要备份的文件夹列表 + - "/var/lib/docker/volumes" + - "/opt/app/data" + excludes: # 需要排除的目录模式 + - "*/logs" + - "*/temp" + - "*/cache" + +# MySQL 数据库备份配置 +mysql: + enabled: true # 是否启用 MySQL 备份 + container_name: "mysql" # MySQL 容器名称 + username: "root" # 数据库用户名 + password: "your_password_here" # 数据库密码 + databases: # 要备份的数据库列表 + - "database1" + - "database2" + # 或者备份所有数据库: databases: "all" + +# 日志配置 +logging: + enabled: true + log_file: "/var/log/docker-backup.log" + level: "INFO" +``` + +## 使用指南 + +### 定时任务管理 + +```bash +# 查看定时任务状态 +systemctl status docker-backup.timer + +# 查看下次执行时间 +systemctl list-timers docker-backup.timer + +# 停止定时任务 +sudo systemctl stop docker-backup.timer + +# 启动定时任务 +sudo systemctl start docker-backup.timer + +# 禁用定时任务(开机不自动启动) +sudo systemctl disable docker-backup.timer + +# 启用定时任务(开机自动启动) +sudo systemctl enable docker-backup.timer +``` + +### 手动执行备份 + +```bash +# 执行备份 +docker-backup + +# 查看备份日志 +sudo journalctl -u docker-backup.service -f +``` + +### 备份文件管理 + +```bash +# 列出所有备份文件 +docker-backup-cleanup --list + +# 删除 7 天前的备份 +docker-backup-cleanup --days 7 + +# 只保留最近 10 个备份 +docker-backup-cleanup --count 10 + +# 使用配置文件中的清理策略 +docker-backup-cleanup --auto +``` + +## 高级配置 + +### 自定义服务名称 + +```bash +SERVICE_NAME=mybackup bash <(curl -sL https://gitea.bcde.io/wangdefa/docker-backup/raw/branch/main/install.sh) +``` + +### 自定义定时计划 + +```bash +# 每天早上 6 点执行 +SCHEDULE="*-*-* 06:00:00" bash <(curl -sL https://gitea.bcde.io/wangdefa/docker-backup/raw/branch/main/install.sh) + +# 每周一凌晨 2 点执行 +SCHEDULE="Mon *-*-* 02:00:00" bash <(curl -sL https://gitea.bcde.io/wangdefa/docker-backup/raw/branch/main/install.sh) + +# 每小时执行 +SCHEDULE="hourly" bash <(curl -sL https://gitea.bcde.io/wangdefa/docker-backup/raw/branch/main/install.sh) +``` + +### 修改已安装的定时计划 + +编辑 timer 文件: + +```bash +sudo vi /etc/systemd/system/docker-backup.timer +``` + +修改 `OnCalendar` 行,然后重新加载配置: + +```bash +sudo systemctl daemon-reload +sudo systemctl restart docker-backup.timer +``` + +## 备份文件格式 + +备份文件采用时间戳命名格式: + +``` +backup-20250125-143022.tar.gz +``` + +文件内部结构: + +``` +backup-20250125-143022.tar.gz +├── folders.tar.gz # 文件夹备份 +└── mysql.sql.gz # MySQL 数据库备份 +``` + +## 故障排查 + +### 查看服务日志 + +```bash +# 查看最近的日志 +sudo journalctl -u docker-backup.service -n 50 + +# 实时跟踪日志 +sudo journalctl -u docker-backup.service -f + +# 查看特定时间的日志 +sudo journalctl -u docker-backup.service --since "2025-01-25 14:00:00" +``` + +### 常见问题 + +#### 1. 权限不足 + +确保脚本有执行权限: + +```bash +sudo chmod +x /usr/local/bin/docker-backup +sudo chmod +x /usr/local/bin/docker-backup-cleanup +``` + +#### 2. MySQL 连接失败 + +检查: +- MySQL 容器是否运行:`docker ps | grep mysql` +- 用户名和密码是否正确 +- 容器名称是否匹配 + +#### 3. 磁盘空间不足 + +查看磁盘使用情况: + +```bash +df -h + +# 手动清理旧备份 +docker-backup-cleanup --days 3 +``` + +#### 4. yq 命令找不到 + +重新运行安装脚本安装 yq: + +```bash +bash <(curl -sL https://gitea.bcde.io/wangdefa/docker-backup/raw/branch/main/install.sh) +``` + +## 卸载 + +```bash +bash <(curl -sL https://gitea.bcde.io/wangdefa/docker-backup/raw/branch/main/install.sh) --uninstall +``` + +卸载脚本会: +- 停止并禁用 systemd 服务 +- 删除 systemd 服务文件 +- 删除脚本文件 +- 可选删除配置目录(会提示确认) + +## 项目结构 + +``` +docker-backup/ +├── bin/ +│ ├── backup.sh # 主备份脚本 +│ └── cleanup.sh # 清理脚本 +├── config/ +│ └── backup.yml.example # 配置文件示例 +├── systemd/ +│ ├── docker-backup.service.template # systemd service 模板 +│ └── docker-backup.timer.template # systemd timer 模板 +├── install.sh # 安装脚本 +└── README.md # 项目文档 +``` + +## 安全建议 + +1. **保护配置文件**: 配置文件包含数据库密码,请设置适当的权限: + + ```bash + sudo chmod 600 /etc/docker-backup/config.yml + ``` + +2. **备份文件权限**: 确保备份文件只能被授权用户访问: + + ```bash + sudo chmod 700 /var/backups/docker-backup + ``` + +3. **定期测试恢复**: 定期测试备份文件的恢复过程,确保备份有效。 + +4. **异地备份**: 建议将备份文件同步到远程服务器或云存储。 + +## 贡献 + +欢迎提交 Issue 和 Pull Request! + +## 许可证 + +MIT License + +## 作者 + +Your Name + +## 更新日志 + +### v1.0.0 (2025-01-25) + +- 初始版本发布 +- 支持文件夹备份 +- 支持 MySQL 容器备份 +- 支持定时任务 +- 支持自动清理旧备份 +- 提供一键安装脚本 diff --git a/bin/backup.sh b/bin/backup.sh new file mode 100755 index 0000000..8e2b544 --- /dev/null +++ b/bin/backup.sh @@ -0,0 +1,400 @@ +#!/bin/bash + +############################################################################### +# Docker Backup Script +# 功能:备份指定文件夹和 MySQL 容器数据库 +############################################################################### + +set -e # 遇到错误立即退出 +set -o pipefail # 管道命令任何一个失败都返回失败 + +# 脚本所在目录 +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +# 配置文件路径(系统级配置) +CONFIG_FILE="${CONFIG_FILE:-/etc/docker-backup/config.yml}" + +# 临时目录 +TEMP_DIR="" + +# 颜色输出 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +############################################################################### +# 日志函数 +############################################################################### + +log() { + local level=$1 + shift + local message="$@" + local timestamp=$(date '+%Y-%m-%d %H:%M:%S') + + echo -e "[${timestamp}] [${level}] ${message}" + + # 如果配置了日志文件,同时写入文件 + if [[ -n "${LOG_FILE}" ]] && [[ "${LOGGING_ENABLED}" == "true" ]]; then + echo "[${timestamp}] [${level}] ${message}" >> "${LOG_FILE}" + fi +} + +log_info() { + log "INFO" "${GREEN}$@${NC}" +} + +log_warn() { + log "WARN" "${YELLOW}$@${NC}" +} + +log_error() { + log "ERROR" "${RED}$@${NC}" +} + +############################################################################### +# 清理函数 +############################################################################### + +cleanup() { + if [[ -n "${TEMP_DIR}" ]] && [[ -d "${TEMP_DIR}" ]]; then + log_info "清理临时目录: ${TEMP_DIR}" + rm -rf "${TEMP_DIR}" + fi +} + +# 注册清理函数 +trap cleanup EXIT INT TERM + +############################################################################### +# 检查依赖 +############################################################################### + +check_dependencies() { + log_info "检查依赖工具..." + + local missing_deps=() + + # 检查 yq + if ! command -v yq &> /dev/null; then + missing_deps+=("yq") + fi + + # 检查 tar + if ! command -v tar &> /dev/null; then + missing_deps+=("tar") + fi + + # 检查 gzip + if ! command -v gzip &> /dev/null; then + missing_deps+=("gzip") + fi + + # 检查 docker + if ! command -v docker &> /dev/null; then + missing_deps+=("docker") + fi + + if [[ ${#missing_deps[@]} -gt 0 ]]; then + log_error "缺少以下依赖工具: ${missing_deps[*]}" + log_error "请运行 install.sh 安装依赖" + exit 1 + fi + + log_info "依赖检查完成" +} + +############################################################################### +# 加载配置 +############################################################################### + +load_config() { + log_info "加载配置文件: ${CONFIG_FILE}" + + if [[ ! -f "${CONFIG_FILE}" ]]; then + log_error "配置文件不存在: ${CONFIG_FILE}" + exit 1 + fi + + # 读取备份基础配置 + OUTPUT_DIR=$(yq eval '.backup.output_dir' "${CONFIG_FILE}") + BACKUP_PREFIX=$(yq eval '.backup.prefix' "${CONFIG_FILE}") + + # 读取清理策略 + RETENTION_ENABLED=$(yq eval '.backup.retention.enabled' "${CONFIG_FILE}") + KEEP_DAYS=$(yq eval '.backup.retention.keep_days' "${CONFIG_FILE}") + + # 读取文件夹备份配置 + FOLDERS_ENABLED=$(yq eval '.folders.enabled' "${CONFIG_FILE}") + + # 读取 MySQL 配置 + MYSQL_ENABLED=$(yq eval '.mysql.enabled' "${CONFIG_FILE}") + MYSQL_CONTAINER=$(yq eval '.mysql.container_name' "${CONFIG_FILE}") + MYSQL_USERNAME=$(yq eval '.mysql.username' "${CONFIG_FILE}") + MYSQL_PASSWORD=$(yq eval '.mysql.password' "${CONFIG_FILE}") + + # 读取日志配置 + LOGGING_ENABLED=$(yq eval '.logging.enabled' "${CONFIG_FILE}") + LOG_FILE=$(yq eval '.logging.log_file' "${CONFIG_FILE}") + + # 创建输出目录 + mkdir -p "${OUTPUT_DIR}" + + # 创建日志目录 + if [[ "${LOGGING_ENABLED}" == "true" ]] && [[ -n "${LOG_FILE}" ]]; then + mkdir -p "$(dirname "${LOG_FILE}")" + fi + + log_info "配置加载完成" +} + +############################################################################### +# 备份文件夹 +############################################################################### + +backup_folders() { + if [[ "${FOLDERS_ENABLED}" != "true" ]]; then + log_info "文件夹备份未启用,跳过" + return 0 + fi + + log_info "开始备份文件夹..." + + # 创建临时目录 + local temp_backup_dir="${TEMP_DIR}/folders" + mkdir -p "${temp_backup_dir}" + + # 获取要备份的文件夹数量 + local source_count=$(yq eval '.folders.sources | length' "${CONFIG_FILE}") + + if [[ "${source_count}" == "0" ]] || [[ "${source_count}" == "null" ]]; then + log_warn "未配置要备份的文件夹" + return 0 + fi + + # 构建排除参数 + local exclude_args="" + local exclude_count=$(yq eval '.folders.excludes | length' "${CONFIG_FILE}") + + if [[ "${exclude_count}" != "0" ]] && [[ "${exclude_count}" != "null" ]]; then + for i in $(seq 0 $((exclude_count - 1))); do + local exclude_pattern=$(yq eval ".folders.excludes[$i]" "${CONFIG_FILE}") + exclude_args+=" --exclude='${exclude_pattern}'" + done + fi + + # 备份每个文件夹 + local folders_tar="${temp_backup_dir}/folders.tar.gz" + local tar_sources="" + + for i in $(seq 0 $((source_count - 1))); do + local source_dir=$(yq eval ".folders.sources[$i]" "${CONFIG_FILE}") + + if [[ ! -d "${source_dir}" ]]; then + log_warn "源目录不存在,跳过: ${source_dir}" + continue + fi + + tar_sources+=" ${source_dir}" + log_info "添加备份源: ${source_dir}" + done + + if [[ -z "${tar_sources}" ]]; then + log_warn "没有有效的备份源目录" + return 0 + fi + + # 执行打包 + log_info "开始打包文件夹..." + eval "tar -czf '${folders_tar}' ${exclude_args} ${tar_sources}" 2>&1 | while read line; do + log_info "$line" + done + + if [[ -f "${folders_tar}" ]]; then + log_info "文件夹备份完成: ${folders_tar}" + echo "${folders_tar}" + else + log_error "文件夹备份失败" + return 1 + fi +} + +############################################################################### +# 备份 MySQL 数据库 +############################################################################### + +backup_mysql() { + if [[ "${MYSQL_ENABLED}" != "true" ]]; then + log_info "MySQL 备份未启用,跳过" + return 0 + fi + + log_info "开始备份 MySQL 数据库..." + + # 检查容器是否存在且运行中 + if ! docker ps --format '{{.Names}}' | grep -q "^${MYSQL_CONTAINER}$"; then + log_error "MySQL 容器不存在或未运行: ${MYSQL_CONTAINER}" + return 1 + fi + + # 创建临时目录 + local temp_mysql_dir="${TEMP_DIR}/mysql" + mkdir -p "${temp_mysql_dir}" + + # 获取要备份的数据库列表 + local databases=$(yq eval '.mysql.databases' "${CONFIG_FILE}") + + local mysql_dump="${temp_mysql_dir}/mysql.sql.gz" + + if [[ "${databases}" == "all" ]] || [[ "${databases}" == "null" ]]; then + # 备份所有数据库 + log_info "备份所有数据库..." + docker exec "${MYSQL_CONTAINER}" mysqldump \ + --single-transaction \ + --quick \ + --skip-lock-tables \ + -u"${MYSQL_USERNAME}" \ + -p"${MYSQL_PASSWORD}" \ + --all-databases \ + | gzip > "${mysql_dump}" + else + # 备份指定数据库 + local db_count=$(yq eval '.mysql.databases | length' "${CONFIG_FILE}") + local db_list="" + + for i in $(seq 0 $((db_count - 1))); do + local db_name=$(yq eval ".mysql.databases[$i]" "${CONFIG_FILE}") + db_list+=" ${db_name}" + log_info "添加数据库: ${db_name}" + done + + log_info "备份数据库: ${db_list}" + docker exec "${MYSQL_CONTAINER}" mysqldump \ + --single-transaction \ + --quick \ + --skip-lock-tables \ + -u"${MYSQL_USERNAME}" \ + -p"${MYSQL_PASSWORD}" \ + --databases ${db_list} \ + | gzip > "${mysql_dump}" + fi + + if [[ -f "${mysql_dump}" ]]; then + log_info "MySQL 备份完成: ${mysql_dump}" + echo "${mysql_dump}" + else + log_error "MySQL 备份失败" + return 1 + fi +} + +############################################################################### +# 合并备份文件 +############################################################################### + +merge_backups() { + local folders_tar=$1 + local mysql_dump=$2 + + log_info "开始合并备份文件..." + + # 生成时间戳 + local timestamp=$(date '+%Y%m%d-%H%M%S') + local final_backup="${OUTPUT_DIR}/${BACKUP_PREFIX}-${timestamp}.tar.gz" + + # 要打包的文件列表 + local files_to_pack="" + + if [[ -n "${folders_tar}" ]] && [[ -f "${folders_tar}" ]]; then + files_to_pack+=" ${folders_tar}" + fi + + if [[ -n "${mysql_dump}" ]] && [[ -f "${mysql_dump}" ]]; then + files_to_pack+=" ${mysql_dump}" + fi + + if [[ -z "${files_to_pack}" ]]; then + log_error "没有需要打包的文件" + return 1 + fi + + # 合并打包 + tar -czf "${final_backup}" -C "${TEMP_DIR}" \ + $(basename "${folders_tar}" 2>/dev/null || true) \ + $(basename "${mysql_dump}" 2>/dev/null || true) + + if [[ -f "${final_backup}" ]]; then + local file_size=$(du -h "${final_backup}" | cut -f1) + log_info "备份完成: ${final_backup} (大小: ${file_size})" + echo "${final_backup}" + else + log_error "合并备份失败" + return 1 + fi +} + +############################################################################### +# 清理旧备份 +############################################################################### + +cleanup_old_backups() { + if [[ "${RETENTION_ENABLED}" != "true" ]]; then + log_info "自动清理未启用,跳过" + return 0 + fi + + log_info "开始清理旧备份..." + + if [[ "${KEEP_DAYS}" != "null" ]] && [[ "${KEEP_DAYS}" =~ ^[0-9]+$ ]]; then + log_info "删除 ${KEEP_DAYS} 天前的备份文件..." + + # 查找并删除旧文件 + find "${OUTPUT_DIR}" -name "${BACKUP_PREFIX}-*.tar.gz" -type f -mtime +${KEEP_DAYS} -print | while read old_file; do + log_info "删除旧备份: ${old_file}" + rm -f "${old_file}" + done + fi + + log_info "清理完成" +} + +############################################################################### +# 主函数 +############################################################################### + +main() { + log_info "==========================================" + log_info "Docker Backup 开始执行" + log_info "==========================================" + + # 检查依赖 + check_dependencies + + # 加载配置 + load_config + + # 创建临时目录 + TEMP_DIR=$(mktemp -d -t docker-backup.XXXXXX) + log_info "临时目录: ${TEMP_DIR}" + + # 备份文件夹 + local folders_tar=$(backup_folders) + + # 备份 MySQL + local mysql_dump=$(backup_mysql) + + # 合并备份 + local final_backup=$(merge_backups "${folders_tar}" "${mysql_dump}") + + # 清理旧备份 + cleanup_old_backups + + log_info "==========================================" + log_info "Docker Backup 执行完成" + log_info "备份文件: ${final_backup}" + log_info "==========================================" +} + +# 执行主函数 +main "$@" diff --git a/bin/cleanup.sh b/bin/cleanup.sh new file mode 100755 index 0000000..e6c0c3a --- /dev/null +++ b/bin/cleanup.sh @@ -0,0 +1,249 @@ +#!/bin/bash + +############################################################################### +# Docker Backup Cleanup Script +# 功能:清理旧的备份文件 +############################################################################### + +set -e +set -o pipefail + +# 脚本所在目录 +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +# 配置文件路径(系统级配置) +CONFIG_FILE="${CONFIG_FILE:-/etc/docker-backup/config.yml}" + +# 颜色输出 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' + +############################################################################### +# 日志函数 +############################################################################### + +log_info() { + echo -e "${GREEN}[INFO]${NC} $@" +} + +log_warn() { + echo -e "${YELLOW}[WARN]${NC} $@" +} + +log_error() { + echo -e "${RED}[ERROR]${NC} $@" +} + +############################################################################### +# 检查依赖 +############################################################################### + +check_dependencies() { + if ! command -v yq &> /dev/null; then + log_error "缺少依赖工具: yq" + log_error "请运行 install.sh 安装依赖" + exit 1 + fi +} + +############################################################################### +# 加载配置 +############################################################################### + +load_config() { + log_info "加载配置文件: ${CONFIG_FILE}" + + if [[ ! -f "${CONFIG_FILE}" ]]; then + log_error "配置文件不存在: ${CONFIG_FILE}" + exit 1 + fi + + OUTPUT_DIR=$(yq eval '.backup.output_dir' "${CONFIG_FILE}") + BACKUP_PREFIX=$(yq eval '.backup.prefix' "${CONFIG_FILE}") + RETENTION_ENABLED=$(yq eval '.backup.retention.enabled' "${CONFIG_FILE}") + KEEP_DAYS=$(yq eval '.backup.retention.keep_days' "${CONFIG_FILE}") + KEEP_COUNT=$(yq eval '.backup.retention.keep_count' "${CONFIG_FILE}") +} + +############################################################################### +# 清理旧备份(按天数) +############################################################################### + +cleanup_by_days() { + local keep_days=$1 + + log_info "删除 ${keep_days} 天前的备份文件..." + + local deleted_count=0 + + while IFS= read -r old_file; do + log_info "删除: ${old_file}" + rm -f "${old_file}" + ((deleted_count++)) + done < <(find "${OUTPUT_DIR}" -name "${BACKUP_PREFIX}-*.tar.gz" -type f -mtime +${keep_days}) + + log_info "共删除 ${deleted_count} 个旧备份文件" +} + +############################################################################### +# 清理旧备份(按数量) +############################################################################### + +cleanup_by_count() { + local keep_count=$1 + + log_info "保留最近 ${keep_count} 个备份文件..." + + # 获取所有备份文件,按时间排序 + local all_backups=($(find "${OUTPUT_DIR}" -name "${BACKUP_PREFIX}-*.tar.gz" -type f -printf '%T@ %p\n' | sort -rn | awk '{print $2}')) + + local total_count=${#all_backups[@]} + local deleted_count=0 + + if [[ ${total_count} -le ${keep_count} ]]; then + log_info "当前备份数量 ${total_count} 不超过保留数量 ${keep_count},无需清理" + return 0 + fi + + # 删除超出数量的备份 + for ((i=${keep_count}; i<${total_count}; i++)); do + local old_file="${all_backups[$i]}" + log_info "删除: ${old_file}" + rm -f "${old_file}" + ((deleted_count++)) + done + + log_info "共删除 ${deleted_count} 个旧备份文件" +} + +############################################################################### +# 列出所有备份 +############################################################################### + +list_backups() { + log_info "==========================================" + log_info "备份文件列表" + log_info "==========================================" + + if [[ ! -d "${OUTPUT_DIR}" ]]; then + log_warn "备份目录不存在: ${OUTPUT_DIR}" + return 0 + fi + + local backup_files=($(find "${OUTPUT_DIR}" -name "${BACKUP_PREFIX}-*.tar.gz" -type f -printf '%T@ %p %s\n' | sort -rn)) + + if [[ ${#backup_files[@]} -eq 0 ]]; then + log_info "没有找到备份文件" + return 0 + fi + + local count=0 + while IFS=' ' read -r timestamp filepath size; do + local file_date=$(date -d "@${timestamp}" '+%Y-%m-%d %H:%M:%S' 2>/dev/null || date -r "${timestamp}" '+%Y-%m-%d %H:%M:%S') + local file_size=$(numfmt --to=iec-i --suffix=B "${size}" 2>/dev/null || echo "${size} bytes") + ((count++)) + printf "%3d. %s %s %s\n" "${count}" "${file_date}" "${file_size}" "$(basename "${filepath}")" + done < <(find "${OUTPUT_DIR}" -name "${BACKUP_PREFIX}-*.tar.gz" -type f -printf '%T@ %p %s\n' | sort -rn) + + log_info "==========================================" + log_info "总计: ${count} 个备份文件" +} + +############################################################################### +# 显示使用帮助 +############################################################################### + +show_usage() { + cat << EOF +Docker Backup 清理工具 + +用法: $0 [选项] + +选项: + -h, --help 显示此帮助信息 + -l, --list 列出所有备份文件 + -d, --days DAYS 删除 N 天前的备份文件 + -c, --count COUNT 只保留最近 N 个备份文件 + -a, --auto 使用配置文件中的清理策略自动清理 + +示例: + $0 --list # 列出所有备份 + $0 --days 7 # 删除 7 天前的备份 + $0 --count 10 # 只保留最近 10 个备份 + $0 --auto # 使用配置文件的策略清理 + +EOF +} + +############################################################################### +# 主函数 +############################################################################### + +main() { + # 检查依赖 + check_dependencies + + # 加载配置 + load_config + + # 解析参数 + if [[ $# -eq 0 ]]; then + show_usage + exit 0 + fi + + while [[ $# -gt 0 ]]; do + case $1 in + -h|--help) + show_usage + exit 0 + ;; + -l|--list) + list_backups + exit 0 + ;; + -d|--days) + if [[ -z "$2" ]] || [[ ! "$2" =~ ^[0-9]+$ ]]; then + log_error "无效的天数参数: $2" + exit 1 + fi + cleanup_by_days "$2" + exit 0 + ;; + -c|--count) + if [[ -z "$2" ]] || [[ ! "$2" =~ ^[0-9]+$ ]]; then + log_error "无效的数量参数: $2" + exit 1 + fi + cleanup_by_count "$2" + exit 0 + ;; + -a|--auto) + if [[ "${RETENTION_ENABLED}" != "true" ]]; then + log_warn "配置文件中未启用自动清理" + exit 0 + fi + + if [[ "${KEEP_DAYS}" != "null" ]] && [[ "${KEEP_DAYS}" =~ ^[0-9]+$ ]]; then + cleanup_by_days "${KEEP_DAYS}" + elif [[ "${KEEP_COUNT}" != "null" ]] && [[ "${KEEP_COUNT}" =~ ^[0-9]+$ ]]; then + cleanup_by_count "${KEEP_COUNT}" + else + log_error "配置文件中未设置有效的清理策略" + exit 1 + fi + exit 0 + ;; + *) + log_error "未知选项: $1" + show_usage + exit 1 + ;; + esac + done +} + +# 执行主函数 +main "$@" diff --git a/config/backup.yml.example b/config/backup.yml.example new file mode 100644 index 0000000..96d6672 --- /dev/null +++ b/config/backup.yml.example @@ -0,0 +1,76 @@ +# Docker Backup 配置文件示例 +# 使用前请复制此文件为 backup.yml 并根据实际情况修改配置 + +# 备份基础配置 +backup: + # 备份文件存放目录(绝对路径) + output_dir: "/var/backups/docker-backup" + + # 备份文件名前缀 + prefix: "backup" + + # 旧备份清理策略 + retention: + # 是否启用自动清理 + enabled: true + # 保留最近 N 天的备份 + keep_days: 7 + # 或者保留最近 N 个备份文件(如果设置了 keep_days,此项将被忽略) + # keep_count: 10 + +# 文件夹备份配置 +folders: + # 是否启用文件夹备份 + enabled: true + + # 需要备份的文件夹列表(支持多个) + sources: + - "/var/lib/docker/volumes" + - "/opt/app/data" + + # 需要排除的文件夹/文件模式(相对于 sources 的路径) + excludes: + - "*/logs" + - "*/temp" + - "*/cache" + - "*/.git" + - "*/node_modules" + +# MySQL 数据库备份配置 +mysql: + # 是否启用 MySQL 备份 + enabled: true + + # MySQL 容器名称 + container_name: "mysql" + + # 数据库连接配置 + username: "root" + password: "your_password_here" + + # 要备份的数据库列表(留空表示备份所有数据库) + databases: + - "database1" + - "database2" + # 或者设置为 "all" 备份所有数据库 + # databases: "all" + +# 日志配置 +logging: + # 是否启用日志 + enabled: true + # 日志文件路径 + log_file: "/var/log/docker-backup.log" + # 日志级别:DEBUG, INFO, WARN, ERROR + level: "INFO" + +# 通知配置(可选) +notification: + # 是否启用通知 + enabled: false + # 通知方式:email, webhook + method: "webhook" + # Webhook URL(用于发送备份状态) + webhook_url: "https://example.com/webhook" + # 仅在备份失败时通知 + on_failure_only: true diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..549e5c7 --- /dev/null +++ b/install.sh @@ -0,0 +1,554 @@ +#!/bin/bash + +############################################################################### +# Docker Backup 远程安装脚本 +# 功能:安装依赖、下载文件、配置 systemd 服务 +# 使用:bash <(curl -sL https://gitea.bcde.io/wangdefa/docker-backup/raw/branch/main/install.sh) +############################################################################### + +set -e +set -o pipefail + +# 颜色输出 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' + +# Gitea 仓库地址 +REPO_URL="https://gitea.bcde.io/wangdefa/docker-backup/raw/branch/main" + +# 安装路径 +BIN_DIR="/usr/local/bin" +CONFIG_DIR="/etc/docker-backup" +SYSTEMD_DIR="/etc/systemd/system" + +# 默认服务名称 +DEFAULT_SERVICE_NAME="docker-backup" +SERVICE_NAME="${SERVICE_NAME:-$DEFAULT_SERVICE_NAME}" + +# 默认定时计划 +DEFAULT_SCHEDULE="*-*-* 02:00:00" # 每天凌晨 2 点 +SCHEDULE="${SCHEDULE:-$DEFAULT_SCHEDULE}" + +############################################################################### +# 日志函数 +############################################################################### + +log_info() { + echo -e "${GREEN}[INFO]${NC} $@" +} + +log_warn() { + echo -e "${YELLOW}[WARN]${NC} $@" +} + +log_error() { + echo -e "${RED}[ERROR]${NC} $@" +} + +log_step() { + echo -e "\n${BLUE}==>${NC} $@" +} + +############################################################################### +# 检查是否以 root 权限运行 +############################################################################### + +check_root() { + if [[ $EUID -ne 0 ]]; then + log_error "此脚本需要 root 权限运行" + log_info "请使用: sudo bash <(curl -sL ...)" + exit 1 + fi +} + +############################################################################### +# 检测操作系统 +############################################################################### + +detect_os() { + if [[ -f /etc/os-release ]]; then + . /etc/os-release + OS=$ID + OS_VERSION=$VERSION_ID + else + log_error "无法检测操作系统类型" + exit 1 + fi + + log_info "检测到操作系统: $OS $OS_VERSION" +} + +############################################################################### +# 安装 yq +############################################################################### + +install_yq() { + log_step "检查 yq 是否已安装..." + + if command -v yq &> /dev/null; then + log_info "yq 已安装: $(yq --version)" + return 0 + fi + + log_info "yq 未安装,正在安装..." + + # 检测系统架构 + local arch=$(uname -m) + case $arch in + x86_64) + arch="amd64" + ;; + aarch64|arm64) + arch="arm64" + ;; + armv7l) + arch="arm" + ;; + *) + log_error "不支持的系统架构: $arch" + exit 1 + ;; + esac + + # 下载并安装 yq + local yq_version="v4.40.5" + local yq_url="https://github.com/mikefarah/yq/releases/download/${yq_version}/yq_linux_${arch}" + + log_info "下载 yq ${yq_version} for ${arch}..." + + if command -v wget &> /dev/null; then + wget -q "${yq_url}" -O /usr/local/bin/yq + elif command -v curl &> /dev/null; then + curl -sL "${yq_url}" -o /usr/local/bin/yq + else + log_error "需要 wget 或 curl 来下载 yq" + exit 1 + fi + + chmod +x /usr/local/bin/yq + + if command -v yq &> /dev/null; then + log_info "yq 安装成功: $(yq --version)" + else + log_error "yq 安装失败" + exit 1 + fi +} + +############################################################################### +# 安装其他依赖 +############################################################################### + +install_dependencies() { + log_step "检查并安装依赖工具..." + + local deps=("tar" "gzip" "docker" "find") + local missing_deps=() + + for dep in "${deps[@]}"; do + if ! command -v "$dep" &> /dev/null; then + missing_deps+=("$dep") + fi + done + + if [[ ${#missing_deps[@]} -eq 0 ]]; then + log_info "所有依赖工具已安装" + return 0 + fi + + log_warn "缺少以下工具: ${missing_deps[*]}" + + case $OS in + ubuntu|debian) + log_info "使用 apt 安装依赖..." + apt-get update -qq + apt-get install -y -qq "${missing_deps[@]}" docker.io + ;; + centos|rhel|fedora) + log_info "使用 yum/dnf 安装依赖..." + if command -v dnf &> /dev/null; then + dnf install -y -q "${missing_deps[@]}" docker + else + yum install -y -q "${missing_deps[@]}" docker + fi + ;; + *) + log_error "不支持的操作系统,请手动安装: ${missing_deps[*]}" + exit 1 + ;; + esac + + log_info "依赖安装完成" +} + +############################################################################### +# 下载并部署文件 +############################################################################### + +deploy_files() { + log_step "从远程仓库下载文件..." + + # 创建必要的目录 + mkdir -p "${BIN_DIR}" + mkdir -p "${CONFIG_DIR}" + mkdir -p "${SYSTEMD_DIR}" + + # 下载备份脚本 + log_info "下载 backup.sh..." + if command -v wget &> /dev/null; then + wget -q "${REPO_URL}/bin/backup.sh" -O "${BIN_DIR}/docker-backup" + else + curl -sL "${REPO_URL}/bin/backup.sh" -o "${BIN_DIR}/docker-backup" + fi + chmod +x "${BIN_DIR}/docker-backup" + + # 下载清理脚本 + log_info "下载 cleanup.sh..." + if command -v wget &> /dev/null; then + wget -q "${REPO_URL}/bin/cleanup.sh" -O "${BIN_DIR}/docker-backup-cleanup" + else + curl -sL "${REPO_URL}/bin/cleanup.sh" -o "${BIN_DIR}/docker-backup-cleanup" + fi + chmod +x "${BIN_DIR}/docker-backup-cleanup" + + # 下载配置文件示例 + if [[ ! -f "${CONFIG_DIR}/config.yml" ]]; then + log_info "下载配置文件示例..." + if command -v wget &> /dev/null; then + wget -q "${REPO_URL}/config/backup.yml.example" -O "${CONFIG_DIR}/config.yml" + else + curl -sL "${REPO_URL}/config/backup.yml.example" -o "${CONFIG_DIR}/config.yml" + fi + log_warn "请编辑配置文件: ${CONFIG_DIR}/config.yml" + else + log_info "配置文件已存在,跳过" + fi + + log_info "文件部署完成" +} + +############################################################################### +# 配置 systemd 服务 +############################################################################### + +setup_systemd() { + log_step "配置 systemd 服务..." + + # 生成 service 文件 + log_info "生成 ${SERVICE_NAME}.service..." + cat > "${SYSTEMD_DIR}/${SERVICE_NAME}.service" << EOF +[Unit] +Description=Docker Backup Service +Documentation=https://gitea.bcde.io/wangdefa/docker-backup +After=network.target docker.service +Requires=docker.service + +[Service] +Type=oneshot +User=root +Group=root + +# 执行备份脚本 +ExecStart=${BIN_DIR}/docker-backup + +# 标准输出和错误输出 +StandardOutput=journal +StandardError=journal + +# 超时设置(30分钟) +TimeoutStartSec=1800 + +# 资源限制 +Nice=19 +IOSchedulingClass=idle + +[Install] +WantedBy=multi-user.target +EOF + + # 生成 timer 文件 + log_info "生成 ${SERVICE_NAME}.timer..." + cat > "${SYSTEMD_DIR}/${SERVICE_NAME}.timer" << EOF +[Unit] +Description=Docker Backup Timer +Documentation=https://gitea.bcde.io/wangdefa/docker-backup +Requires=${SERVICE_NAME}.service + +[Timer] +# 定时执行时间 +OnCalendar=${SCHEDULE} + +# 如果错过了执行时间,启动时立即执行一次 +Persistent=true + +# 随机延迟(0-10分钟),避免多个任务同时执行 +RandomizedDelaySec=10min + +[Install] +WantedBy=timers.target +EOF + + # 重新加载 systemd + log_info "重新加载 systemd..." + systemctl daemon-reload + + log_info "systemd 服务配置完成" +} + +############################################################################### +# 启用并启动服务 +############################################################################### + +enable_service() { + log_step "启用 systemd 服务..." + + # 启用 timer + log_info "启用 ${SERVICE_NAME}.timer..." + systemctl enable "${SERVICE_NAME}.timer" + + # 启动 timer + log_info "启动 ${SERVICE_NAME}.timer..." + systemctl start "${SERVICE_NAME}.timer" + + # 检查状态 + log_info "服务状态:" + systemctl status "${SERVICE_NAME}.timer" --no-pager || true + + log_info "定时任务已启用" +} + +############################################################################### +# 测试备份 +############################################################################### + +test_backup() { + log_step "测试备份功能..." + + read -p "是否立即执行一次备份测试? (y/n) " -n 1 -r + echo + + if [[ $REPLY =~ ^[Yy]$ ]]; then + log_info "执行备份测试..." + "${BIN_DIR}/docker-backup" || log_error "备份测试失败,请检查配置和日志" + else + log_info "跳过备份测试" + fi +} + +############################################################################### +# 显示安装信息 +############################################################################### + +show_info() { + cat << EOF + +${GREEN}╔═══════════════════════════════════════════════════════════════╗ +║ Docker Backup 安装完成! ║ +╚═══════════════════════════════════════════════════════════════╝${NC} + +${BLUE}安装信息:${NC} + - 备份脚本: ${BIN_DIR}/docker-backup + - 清理脚本: ${BIN_DIR}/docker-backup-cleanup + - 配置文件: ${CONFIG_DIR}/config.yml + - 服务名称: ${SERVICE_NAME} + +${BLUE}常用命令:${NC} + # 查看定时任务状态 + systemctl status ${SERVICE_NAME}.timer + + # 查看定时计划 + systemctl list-timers ${SERVICE_NAME}.timer + + # 手动执行备份 + docker-backup + + # 列出所有备份 + docker-backup-cleanup --list + + # 清理旧备份 + docker-backup-cleanup --auto + + # 停止定时任务 + systemctl stop ${SERVICE_NAME}.timer + + # 禁用定时任务 + systemctl disable ${SERVICE_NAME}.timer + +${YELLOW}重要提示:${NC} + 1. 请编辑配置文件以适应您的环境: + vi ${CONFIG_DIR}/config.yml + + 2. 修改配置后无需重启服务,下次执行时自动生效 + + 3. 查看下次执行时间: + systemctl list-timers | grep ${SERVICE_NAME} + + 4. 查看备份日志: + journalctl -u ${SERVICE_NAME}.service -f + +EOF +} + +############################################################################### +# 卸载函数 +############################################################################### + +uninstall() { + log_step "卸载 Docker Backup..." + + # 停止并禁用服务 + if systemctl is-active --quiet "${SERVICE_NAME}.timer"; then + log_info "停止 ${SERVICE_NAME}.timer..." + systemctl stop "${SERVICE_NAME}.timer" + fi + + if systemctl is-enabled --quiet "${SERVICE_NAME}.timer"; then + log_info "禁用 ${SERVICE_NAME}.timer..." + systemctl disable "${SERVICE_NAME}.timer" + fi + + # 删除 systemd 文件 + log_info "删除 systemd 文件..." + rm -f "${SYSTEMD_DIR}/${SERVICE_NAME}.service" + rm -f "${SYSTEMD_DIR}/${SERVICE_NAME}.timer" + + # 重新加载 systemd + systemctl daemon-reload + + # 删除脚本文件 + log_info "删除脚本文件..." + rm -f "${BIN_DIR}/docker-backup" + rm -f "${BIN_DIR}/docker-backup-cleanup" + + # 删除配置文件 + read -p "是否删除配置目录 ${CONFIG_DIR}? (y/n) " -n 1 -r + echo + if [[ $REPLY =~ ^[Yy]$ ]]; then + log_info "删除配置目录..." + rm -rf "${CONFIG_DIR}" + else + log_info "保留配置目录" + fi + + log_info "卸载完成" + exit 0 +} + +############################################################################### +# 显示使用帮助 +############################################################################### + +show_usage() { + cat << EOF +Docker Backup 远程安装脚本 + +用法: bash <(curl -sL https://gitea.bcde.io/wangdefa/docker-backup/raw/branch/main/install.sh) [选项] + +选项: + -h, --help 显示此帮助信息 + -n, --name NAME 指定服务名称 (默认: ${DEFAULT_SERVICE_NAME}) + -s, --schedule SCHEDULE 指定定时计划 (默认: ${DEFAULT_SCHEDULE}) + -u, --uninstall 卸载 Docker Backup + +定时计划示例: + "daily" 每天执行 + "*-*-* 02:00:00" 每天凌晨 2 点 + "Mon *-*-* 02:00:00" 每周一凌晨 2 点 + "*-*-01 02:00:00" 每月 1 号凌晨 2 点 + "hourly" 每小时执行 + +示例: + # 默认安装 + bash <(curl -sL https://gitea.bcde.io/wangdefa/docker-backup/raw/branch/main/install.sh) + + # 自定义服务名称 + bash <(curl -sL https://gitea.bcde.io/wangdefa/docker-backup/raw/branch/main/install.sh) --name mybackup + + # 自定义定时计划(每天早上 6 点) + bash <(curl -sL https://gitea.bcde.io/wangdefa/docker-backup/raw/branch/main/install.sh) --schedule "*-*-* 06:00:00" + + # 卸载 + bash <(curl -sL https://gitea.bcde.io/wangdefa/docker-backup/raw/branch/main/install.sh) --uninstall + +EOF +} + +############################################################################### +# 主函数 +############################################################################### + +main() { + # 解析参数 + while [[ $# -gt 0 ]]; do + case $1 in + -h|--help) + show_usage + exit 0 + ;; + -n|--name) + SERVICE_NAME="$2" + shift 2 + ;; + -s|--schedule) + SCHEDULE="$2" + shift 2 + ;; + -u|--uninstall) + check_root + uninstall + ;; + *) + log_error "未知选项: $1" + show_usage + exit 1 + ;; + esac + done + + # 显示欢迎信息 + cat << EOF +${GREEN}╔═══════════════════════════════════════════════════════════════╗ +║ 欢迎使用 Docker Backup 安装程序 ║ +╚═══════════════════════════════════════════════════════════════╝${NC} + +安装配置: + - 服务名称: ${SERVICE_NAME} + - 定时计划: ${SCHEDULE} + - 配置目录: ${CONFIG_DIR} + - 脚本目录: ${BIN_DIR} + +EOF + + # 检查 root 权限 + check_root + + # 检测操作系统 + detect_os + + # 安装 yq + install_yq + + # 安装其他依赖 + install_dependencies + + # 部署文件 + deploy_files + + # 配置 systemd + setup_systemd + + # 启用服务 + enable_service + + # 测试备份 + test_backup + + # 显示安装信息 + show_info +} + +# 执行主函数 +main "$@" diff --git a/llmdoc/architecture/backup-engine-architecture.md b/llmdoc/architecture/backup-engine-architecture.md new file mode 100644 index 0000000..15cdf63 --- /dev/null +++ b/llmdoc/architecture/backup-engine-architecture.md @@ -0,0 +1,67 @@ +# 备份执行引擎架构 + +## 1. 身份识别 + +- **目的**:一个高度可配置的 Docker 备份解决方案,支持文件夹和 MySQL 数据库的备份 +- **核心功能**:自动备份、日志记录、临时文件管理和备份保留策略 + +## 2. 核心组件 + +- `bin/backup.sh`(主备份脚本): + - 负责协调整个备份流程 + - 主要功能包括依赖检查、配置加载、文件备份、数据库备份和清理 + +## 3. 执行流程(LLM 检索图) + +备份执行流程遵循以下关键步骤: + +1. **依赖检查**:`check_dependencies()` + - 验证所需工具 (yq, tar, gzip, docker) + - 如缺少依赖,脚本将终止执行 + +2. **配置加载**:`load_config()` + - 读取 `/etc/docker-backup/config.yml` + - 配置备份输出目录、前缀和保留策略 + +3. **临时目录准备** + - 使用 `mktemp` 创建唯一临时目录 + - 注册清理 `trap`,确保资源释放 + +4. **文件夹备份**:`backup_folders()` + - 支持多源目录备份 + - 使用 `tar` 打包 + - 可配置排除规则 + +5. **数据库备份**:`backup_mysql()` + - 通过 `docker exec` 调用 `mysqldump` + - 支持全库或指定库备份 + - 使用 `gzip` 压缩 + +6. **备份合并**:`merge_backups()` + - 合并文件夹和数据库备份 + - 生成时间戳文件名 + - 输出单个 `.tar.gz` 文件 + +7. **备份清理**:`cleanup_old_backups()` + - 按配置的保留天数清理旧备份 + +## 4. 设计原理 + +- **模块化**:每个功能封装为独立函数 +- **可配置性**:通过 YAML 文件灵活配置 +- **错误处理**:严格的错误捕获和日志记录 +- **安全性**:最小权限原则,临时文件自动清理 + +## 5. 关键配置点 + +- 备份源目录 +- 数据库备份范围 +- 输出目录和文件前缀 +- 日志配置 +- 备份保留策略 + +## 6. 局限性和注意事项 + +- 依赖外部工具(yq, docker, tar, gzip) +- 需要正确配置 MySQL 容器访问权限 +- 备份过程中需要足够的临时存储空间 \ No newline at end of file diff --git a/llmdoc/architecture/configuration-system.md b/llmdoc/architecture/configuration-system.md new file mode 100644 index 0000000..098a747 --- /dev/null +++ b/llmdoc/architecture/configuration-system.md @@ -0,0 +1,35 @@ +# 配置系统架构 + +## 1. 身份识别 + +- **定义**:一个灵活、层次清晰的 YAML 配置系统,支持细粒度的备份策略定制 +- **目的**:通过声明式配置,控制 Docker 备份的各个方面 + +## 2. 核心组件 + +- `/etc/docker-backup/config.yml`: 系统配置文件(安装时从 `config/backup.yml.example` 创建) +- `bin/backup.sh`: 读取并解析配置的主脚本 +- `yq`: 用于 YAML 配置解析的关键工具 + +## 3. 执行流程(LLM 检索图) + +1. **配置加载**: + - 读取 `/etc/docker-backup/config.yml` + - 使用 `yq` 解析配置项 + +2. **依赖性验证**: + - 检查必要工具(`yq`, `tar`, `docker`) + - 验证配置文件有效性 + - 校验备份源和容器可用性 + +3. **配置解析**: + - 提取备份基础配置 (`backup`) + - 处理文件夹备份设置 (`folders`) + - 解析 MySQL 备份参数 (`mysql`) + - 配置日志和通知 (`logging`, `notification`) + +## 4. 设计原理 + +- **灵活性**:通过 YAML 配置提供高度可定制的备份策略 +- **最小侵入**:仅依赖常见的 Unix 工具链 +- **安全性**:配置项有严格的验证机制 \ No newline at end of file diff --git a/llmdoc/architecture/installation-architecture.md b/llmdoc/architecture/installation-architecture.md new file mode 100644 index 0000000..2cad861 --- /dev/null +++ b/llmdoc/architecture/installation-architecture.md @@ -0,0 +1,45 @@ +# Docker Backup 安装架构 + +## 1. 身份与目的 + +- **目标**:自动化 Docker 容器和卷的备份部署 +- **关键功能**:依赖检测、文件部署、服务配置、定时任务管理 + +## 2. 核心组件 + +- `install.sh`(主安装脚本):整个安装流程的协调者,支持远程下载和部署 +- 动态生成的 systemd 服务文件(不再使用模板) + +## 3. 执行流程图(LLM检索映射) + +### 3.1 环境准备阶段 +- **权限验证**:`check_root()`,确保以 root 权限运行 +- **操作系统检测**:`detect_os()`,确定系统类型和版本 + +### 3.2 依赖安装阶段 +- **工具检测**:`install_yq()`,安装 YAML 解析工具 +- **依赖检查**:`install_dependencies()` + - 检测并安装:tar, gzip, docker, find + - 根据操作系统使用不同的包管理器 (apt/yum/dnf) + +### 3.3 文件部署阶段 +- **远程下载**:`deploy_files()` + - 从 Gitea 仓库下载 `backup.sh` 和 `cleanup.sh` + - 安装到 `/usr/local/bin/docker-backup` 和 `/usr/local/bin/docker-backup-cleanup` + - 设置可执行权限 + - 下载配置文件模板到 `/etc/docker-backup/config.yml` + +### 3.4 服务配置阶段 +- **Systemd 服务生成**:`setup_systemd()` + - 动态生成 `.service` 文件到 `/etc/systemd/system/` + - 动态生成 `.timer` 文件,定义执行计划 +- **服务启用**:`enable_service()` + - 重新加载 systemd 守护进程 + - 启用并启动 systemd timer + +## 4. 设计原则 + +- **模块化**:每个函数职责单一,便于维护 +- **跨平台兼容**:支持主流 Linux 发行版 +- **安全性**:要求 root 权限,预防权限问题 +- **灵活性**:支持自定义安装目录、服务名称和执行计划 \ No newline at end of file diff --git a/llmdoc/architecture/systemd-integration.md b/llmdoc/architecture/systemd-integration.md new file mode 100644 index 0000000..c5209a5 --- /dev/null +++ b/llmdoc/architecture/systemd-integration.md @@ -0,0 +1,37 @@ +# Systemd 集成架构 + +## 1. 身份与目的 + +- **定义**:Docker 备份项目的 Systemd 集成层 +- **目的**:通过 Systemd 单元提供可配置、高效的自动备份机制 + +## 2. 核心组件 + +- `systemd/docker-backup.service.template`: Service 单元模板 +- `systemd/docker-backup.timer.template`: Timer 单元模板 + +## 3. 执行流程(LLM 检索路径) + +### 定时触发 +1. **Timer 激活**:`docker-backup.timer` 根据配置的 `OnCalendar` 触发 +2. **服务启动**:触发 `docker-backup.service` +3. **备份脚本执行**:运行 `bin/backup.sh` + +### 依赖关系 +``` +docker-backup.timer + └── Requires: docker-backup.service + └── Requires: docker.service +``` + +## 4. 资源管理策略 + +- **CPU 管理**:`Nice=19` - 最低优先级 +- **IO 管理**:`IOSchedulingClass=idle` - 仅在系统空闲时执行 +- **超时控制**:`TimeoutStartSec=1800` - 30分钟超时保护 + +## 5. 设计原理 + +- **模块化**:通过模板实现灵活配置 +- **动态替换**:使用 `__INSTALL_DIR__` 和 `__SCHEDULE__` 变量 +- **日志集成**:通过 systemd 日志系统(journald)收集日志 \ No newline at end of file diff --git a/llmdoc/guides/how-to-configure-backups.md b/llmdoc/guides/how-to-configure-backups.md new file mode 100644 index 0000000..c419489 --- /dev/null +++ b/llmdoc/guides/how-to-configure-backups.md @@ -0,0 +1,81 @@ +# 如何配置备份 + +## 准备工作 + +安装后,配置文件位于 `/etc/docker-backup/config.yml`。 + +1. **编辑配置文件** + ```bash + sudo vi /etc/docker-backup/config.yml + ``` + +2. **基础备份配置** + 编辑 `backup` 区块: + ```yaml + backup: + output_dir: "/path/to/backup/destination" # 指定备份存储位置 + prefix: "mybackup" # 可选,自定义备份文件前缀 + retention: + enabled: true # 启用自动清理 + keep_days: 7 # 保留最近 7 天备份 + ``` + +3. **配置文件夹备份** + ```yaml + folders: + enabled: true + sources: + - "/var/lib/docker/volumes" + - "/opt/important/data" + excludes: + - "*/logs" # 排除日志目录 + - "*/.git" # 排除 Git 仓库 + ``` + +4. **配置 MySQL 备份** + ```yaml + mysql: + enabled: true + container_name: "mysql_container" + username: "root" + password: "your_password" + databases: + - "database1" # 指定具体数据库 + # 或使用 "all" 备份所有数据库 + ``` + +5. **日志和通知** + ```yaml + logging: + enabled: true + log_file: "/var/log/docker-backup.log" + level: "INFO" + + notification: + enabled: true + method: "webhook" + webhook_url: "https://example.com/webhook" + ``` + +## 验证配置 + +运行以下命令测试备份功能: +```bash +docker-backup +``` + +查看配置是否生效: +```bash +# 查看备份日志 +sudo journalctl -u docker-backup.service -f + +# 查看生成的备份文件 +docker-backup-cleanup --list +``` + +## 常见问题 + +- 确保所有路径正确 +- 检查 MySQL 容器名称和凭据 +- 权限问题:确保脚本有足够权限访问备份源 +- 配置文件权限:`sudo chmod 600 /etc/docker-backup/config.yml` \ No newline at end of file diff --git a/llmdoc/guides/how-to-install.md b/llmdoc/guides/how-to-install.md new file mode 100644 index 0000000..10f9a56 --- /dev/null +++ b/llmdoc/guides/how-to-install.md @@ -0,0 +1,101 @@ +# 如何安装 Docker Backup + +## 1. 系统要求 + +- **操作系统**:Linux(推荐 Ubuntu, Debian, CentOS, RHEL, Fedora) +- **权限**:需要 root/sudo 权限 +- **预安装依赖**: + - Docker + - Bash (4.0+) + - 网络工具(wget 或 curl) + +## 2. 一键远程安装 + +### 2.1 执行安装命令 + +使用以下命令直接从远程仓库安装: + +```bash +bash <(curl -sL https://gitea.bcde.io/wangdefa/docker-backup/raw/branch/main/install.sh) +``` + +安装脚本会自动完成: +- 检测操作系统类型 +- 安装依赖工具(yq 等) +- 从远程仓库下载脚本文件 +- 安装到系统目录(`/usr/local/bin`、`/etc/docker-backup`) +- 创建配置文件模板 +- 配置并启动 systemd 服务 +- 启动定时任务 + +### 2.2 配置备份 + +1. 编辑配置文件 +```bash +sudo vi /etc/docker-backup/config.yml +``` + +2. 配置关键参数: + - `output_dir`:备份文件存储位置 + - `folders.sources`:需要备份的文件夹列表 + - `mysql.container_name`:MySQL 容器名称 + - `retention.keep_days`:备份保留天数 + +## 3. 高级安装选项 + +### 3.1 自定义服务名称 + +```bash +# 为服务指定自定义名称 +SERVICE_NAME=my-docker-backup bash <(curl -sL https://gitea.bcde.io/wangdefa/docker-backup/raw/branch/main/install.sh) +``` + +### 3.2 自定义执行计划 + +```bash +# 每天早上 6 点执行备份 +SCHEDULE="*-*-* 06:00:00" bash <(curl -sL https://gitea.bcde.io/wangdefa/docker-backup/raw/branch/main/install.sh) + +# 支持的计划格式: +# "daily" 每天 +# "*-*-* 02:00:00" 每天凌晨 2 点 +# "Mon *-*-* 02:00:00" 每周一凌晨 2 点 +# "*-*-01 02:00:00" 每月 1 号 +# "hourly" 每小时 +``` + +## 4. 验证安装 + +1. 检查服务状态 +```bash +systemctl status docker-backup.timer +``` + +2. 手动测试备份 +```bash +docker-backup +``` + +3. 查看备份文件 +```bash +docker-backup-cleanup --list +``` + +## 5. 卸载 + +```bash +# 卸载 Docker Backup +bash <(curl -sL https://gitea.bcde.io/wangdefa/docker-backup/raw/branch/main/install.sh) --uninstall +``` + +## 6. 常见问题 + +- **权限问题**:确保使用 `sudo` 运行脚本 +- **依赖缺失**:脚本会自动尝试安装依赖 +- **配置错误**:仔细检查 `backup.yml` 配置 + +## 7. 建议 + +- 首次安装后,建议立即测试备份功能 +- 定期检查备份日志:`journalctl -u docker-backup.service` +- 根据实际需求调整备份策略 \ No newline at end of file diff --git a/llmdoc/guides/how-to-manage-systemd-service.md b/llmdoc/guides/how-to-manage-systemd-service.md new file mode 100644 index 0000000..fb41aae --- /dev/null +++ b/llmdoc/guides/how-to-manage-systemd-service.md @@ -0,0 +1,60 @@ +# 如何管理 Docker 备份 Systemd 服务 + +## 1. 服务状态检查 + +1. **查看服务状态** + ```bash + systemctl status docker-backup.service + ``` + +2. **查看 Timer 状态** + ```bash + systemctl status docker-backup.timer + ``` + +## 2. 启动和停止服务 + +1. **启动服务** + ```bash + systemctl start docker-backup.service + systemctl enable docker-backup.timer # 开机自启 + ``` + +2. **停止服务** + ```bash + systemctl stop docker-backup.service + systemctl disable docker-backup.timer # 取消开机自启 + ``` + +## 3. 修改定时计划 + +1. **编辑 Timer 配置** + 使用 `systemctl edit docker-backup.timer` 或直接编辑 `/etc/systemd/system/docker-backup.timer` + +2. **常见调度示例** + - 每天凌晨 2 点:`OnCalendar=*-*-* 02:00:00` + - 每周一凌晨 2 点:`OnCalendar=Mon *-*-* 02:00:00` + - 每月 1 号凌晨 2 点:`OnCalendar=*-*-01 02:00:00` + +3. **重载配置** + ```bash + systemctl daemon-reload + systemctl restart docker-backup.timer + ``` + +## 4. 查看服务日志 + +1. **查看最近日志** + ```bash + journalctl -u docker-backup.service + ``` + +2. **实时监控日志** + ```bash + journalctl -f -u docker-backup.service + ``` + +3. **查看指定时间范围日志** + ```bash + journalctl -u docker-backup.service --since "1 hour ago" + ``` \ No newline at end of file diff --git a/llmdoc/guides/how-to-perform-backup.md b/llmdoc/guides/how-to-perform-backup.md new file mode 100644 index 0000000..2f05c65 --- /dev/null +++ b/llmdoc/guides/how-to-perform-backup.md @@ -0,0 +1,114 @@ +# 如何执行备份 + +## 前提条件 + +1. 已安装必要的工具: + - Docker + - yq + - tar + - gzip + +## 配置备份 + +1. **编辑配置文件**:`/etc/docker-backup/config.yml` + +```yaml +# 备份基本设置 +backup: + output_dir: /path/to/backup # 备份文件输出目录 + prefix: docker-backup # 备份文件名前缀 + retention: + enabled: true # 是否启用自动清理 + keep_days: 30 # 保留最近 30 天的备份 + +# 文件夹备份配置 +folders: + enabled: true # 是否启用文件夹备份 + sources: # 要备份的文件夹列表 + - /path/to/folder1 + - /path/to/folder2 + excludes: # 可选:排除的文件/目录模式 + - '*.log' + - '.git/' + +# MySQL 备份配置 +mysql: + enabled: true # 是否启用 MySQL 备份 + container_name: mysql_container + username: backup_user + password: backup_password + databases: # 要备份的数据库 + - database1 + - database2 + # 或使用 'all' 备份所有数据库 + +# 日志配置 +logging: + enabled: true + log_file: /path/to/backup.log +``` + +## 执行备份 + +1. **手动备份**: +```bash +docker-backup +``` + +2. **自动备份**(使用 systemd timer,安装时已配置): +```bash +# 查看定时任务状态 +systemctl status docker-backup.timer + +# 查看下次执行时间 +systemctl list-timers docker-backup.timer + +# 立即触发一次备份 +systemctl start docker-backup.service +``` + +3. **查看备份结果**: +```bash +# 列出所有备份文件 +docker-backup-cleanup --list + +# 查看备份日志 +sudo journalctl -u docker-backup.service -n 50 +``` + +## 故障排查 + +1. **常见错误**: + - 检查配置文件权限和路径 + - 验证 Docker 容器状态 + - 查看日志文件 `log_file` + +2. **依赖检查**: +```bash +# 脚本会自动检查,但可手动验证 +which yq tar gzip docker +``` + +## 备份恢复 + +1. 解压备份文件 +```bash +tar -xzvf backup-YYYYMMDD-HHMMSS.tar.gz +``` + +2. 恢复文件夹 +```bash +tar -xzvf folders.tar.gz -C /restore/path +``` + +3. 恢复 MySQL 数据库 +```bash +# 假设使用 Docker MySQL 容器 +zcat mysql.sql.gz | docker exec -i mysql_container mysql -u root -p +``` + +## 注意事项 + +- 备份前关闭正在写入的应用 +- 定期测试备份和恢复流程 +- 保护备份文件和配置文件的安全 \ No newline at end of file diff --git a/llmdoc/index.md b/llmdoc/index.md new file mode 100644 index 0000000..2762966 --- /dev/null +++ b/llmdoc/index.md @@ -0,0 +1,62 @@ +# Docker 备份工具文档中心 + +## 项目简介 + +Docker 备份工具是一个功能强大、易于使用的 Docker 数据备份解决方案,专为 Linux 系统设计。提供全面的备份和管理功能,帮助用户轻松备份 Docker 容器中的文件夹和数据库。 + +## 文档组织结构 + +我们的文档分为四个主要类别,旨在帮助用户和开发者快速找到所需信息: + +### 1. 项目概述 (Overview) +- 了解项目背景、目标和核心功能 +- 文档位置:`/llmdoc/overview/` + +### 2. 指南 (Guides) +- 提供具体的操作步骤和实践指南 +- 文档位置:`/llmdoc/guides/` + +### 3. 架构 (Architecture) +- 深入探讨系统设计、组件交互和关键流程 +- 文档位置:`/llmdoc/architecture/` + +### 4. 参考 (Reference) +- 提供详细的技术规格、配置细节和编码约定 +- 文档位置:`/llmdoc/reference/` + +## 文档目录 + +### 项目概述 +- [`project-overview.md`](/llmdoc/overview/project-overview.md): Docker 备份工具的核心目标、功能和技术栈概述 + +### 指南 +1. 安装和配置 + - [`how-to-install.md`](/llmdoc/guides/how-to-install.md): 安装 Docker 备份工具的详细步骤 + - [`how-to-configure-backups.md`](/llmdoc/guides/how-to-configure-backups.md): 配置备份策略和参数 +2. 服务管理 + - [`how-to-manage-systemd-service.md`](/llmdoc/guides/how-to-manage-systemd-service.md): 管理和控制 systemd 服务 + - [`how-to-perform-backup.md`](/llmdoc/guides/how-to-perform-backup.md): 执行手动备份和恢复操作 + +### 架构 +1. 系统架构 + - [`installation-architecture.md`](/llmdoc/architecture/installation-architecture.md): 安装过程和系统集成架构 + - [`configuration-system.md`](/llmdoc/architecture/configuration-system.md): 配置系统的设计和实现 + - [`systemd-integration.md`](/llmdoc/architecture/systemd-integration.md): systemd 服务集成细节 + - [`backup-engine-architecture.md`](/llmdoc/architecture/backup-engine-architecture.md): 备份引擎的技术架构 + +### 参考 +1. 约定和规范 + - [`git-conventions.md`](/llmdoc/reference/git-conventions.md): 项目 Git 提交和协作约定 + - [`coding-conventions.md`](/llmdoc/reference/coding-conventions.md): 代码编写和风格指南 +2. 配置 + - [`configuration-schema.md`](/llmdoc/reference/configuration-schema.md): 配置文件的详细架构和参数说明 + +## 开始使用 + +- 新用户请首先阅读[项目概述](/llmdoc/overview/project-overview.md) +- 安装指南请参考[如何安装](/llmdoc/guides/how-to-install.md) +- 遇到问题?查看具体的指南和架构文档 + +## 许可证 + +本项目采用 MIT License,欢迎在遵守许可条款的前提下自由使用和二次开发。 \ No newline at end of file diff --git a/llmdoc/overview/project-overview.md b/llmdoc/overview/project-overview.md new file mode 100644 index 0000000..02aacd1 --- /dev/null +++ b/llmdoc/overview/project-overview.md @@ -0,0 +1,61 @@ +# Docker 备份工具 - 项目概述 + +## 1. 项目简介 + +Docker 备份工具是一个功能强大、易于使用的 Docker 数据备份解决方案,专为 Linux 系统(支持 systemd)设计。该工具提供全面的备份和管理功能,帮助用户轻松备份 Docker 容器中的文件夹和数据库。 + +## 2. 主要功能 + +- 文件夹备份 + - 打包指定文件夹为压缩文件 + - 支持排除特定目录和文件模式 +- MySQL 数据库备份 + - 备份 Docker 容器中的 MySQL 数据库 + - 支持备份指定或全部数据库 +- 备份文件管理 + - 合并文件夹和数据库备份 + - 自动清理旧备份文件 + - 按天数或数量保留备份 + +## 3. 技术栈 + +- **编程语言**: Bash Shell +- **核心工具**: + - tar: 文件打包 + - gzip: 文件压缩 + - docker: 容器交互 + - yq: YAML 配置解析 +- **系统集成**: systemd (定时任务和服务管理) + +## 4. 项目结构 + +``` +docker-backup/ +├── bin/ +│ ├── backup.sh # 主备份脚本 +│ └── cleanup.sh # 备份清理脚本 +├── config/ # 配置文件目录 +├── systemd/ # systemd 服务模板 +├── install.sh # 安装脚本 +└── README.md # 项目文档 +``` + +## 5. 使用场景 + +- 需要定期备份 Docker 容器数据的开发者和系统管理员 +- 个人服务器和小型企业基础设施 +- 需要自动化备份和管理备份文件的场景 +- 对 MySQL 数据库和文件系统数据有备份需求的项目 + +## 6. 关键特性 + +- 一键安装和配置 +- 灵活的备份策略 +- 完善的日志记录 +- 自动清理备份文件 +- 支持自定义备份计划 +- 安全性考虑(如权限控制) + +## 7. 许可证 + +MIT License - 开源且自由使用 \ No newline at end of file diff --git a/llmdoc/reference/coding-conventions.md b/llmdoc/reference/coding-conventions.md new file mode 100644 index 0000000..634f667 --- /dev/null +++ b/llmdoc/reference/coding-conventions.md @@ -0,0 +1,90 @@ +# Bash 脚本编码约定 + +## 1. 脚本结构约定 + +### 1.1 基本骨架 +- 必须以 `#!/bin/bash` 开头 +- 使用 `set -e` 和 `set -o pipefail` 启用严格错误处理 +- 按照以下顺序组织脚本: + 1. Shebang + 2. 文件描述注释 + 3. 变量和常量定义 + 4. 日志和颜色输出函数 + 5. 主要功能函数 + 6. 主函数(`main()`) + 7. 主函数调用 + +### 1.2 错误处理 +- 使用 `set -e` 在任何命令执行失败时立即退出脚本 +- 使用 `set -o pipefail` 确保管道命令链任何一个失败都返回失败状态 +- 对于可能失败的操作,编写明确的错误检查和日志记录机制 + +## 2. 命名约定 + +### 2.1 变量命名 +- 全局变量使用大写,单词间使用下划线分隔 + - 正确: `SCRIPT_DIR`, `DEFAULT_INSTALL_DIR` +- 局部变量使用小写,单词间使用下划线分隔 + - 正确: `backup_type`, `temp_backup_dir` + +### 2.2 函数命名 +- 使用小写,单词间使用下划线分隔 +- 动词 + 名词的形式 + - 正确: `install_dependencies()`, `check_root()` + - 错误: `Dependencies()`, `rootCheck()` + +## 3. 日志记录约定 + +### 3.1 日志级别 +- 使用以下日志级别函数: + - `log_info()`: 普通信息 + - `log_warn()`: 警告信息 + - `log_error()`: 错误信息 + +### 3.2 日志输出 +- 日志应包含时间戳 +- 使用颜色区分不同日志级别 +- 日志消息应简洁明了,描述当前操作或状态 + +## 4. 注释风格 + +### 4.1 文件头注释 +- 使用 `###############################################################################` +- 包含脚本名称和简要功能描述 + +### 4.2 函数注释 +- 在函数定义前使用块注释 +- 描述函数的目的和关键行为 + +### 4.3 行内注释 +- 仅在代码复杂或不明显时使用 +- 解释 "为什么" 而非 "做什么" + +## 5. 参数和配置处理 + +### 5.1 参数解析 +- 使用 `case` 语句处理命令行参数 +- 提供帮助选项(`-h`, `--help`) +- 对无效参数给出明确错误提示 + +### 5.2 配置加载 +- 使用配置文件(如 YAML)管理可配置参数 +- 提供合理的默认值 +- 在加载配置时进行有效性检查 + +## 6. 性能和安全最佳实践 + +### 6.1 依赖检查 +- 在脚本开始检查所有必需的外部工具 +- 为缺失的依赖提供明确的安装指导 + +### 6.2 权限管理 +- 对于需要特权的脚本,明确检查 root 权限 +- 谨慎处理文件和目录权限 + +## 7. 示例项目特定约定 + +本项目脚本特有的一些约定: +- 使用 `BASH_SOURCE[0]` 获取脚本所在目录 +- 支持通过环境变量覆盖默认配置 +- 使用 `trap` 注册清理函数 \ No newline at end of file diff --git a/llmdoc/reference/configuration-schema.md b/llmdoc/reference/configuration-schema.md new file mode 100644 index 0000000..d878402 --- /dev/null +++ b/llmdoc/reference/configuration-schema.md @@ -0,0 +1,62 @@ +# 配置架构参考 + +## 配置项概览 + +### `backup` 区块 + +| 配置项 | 类型 | 必填 | 默认值 | 描述 | +|--------|------|------|--------|------| +| `output_dir` | 字符串 | 是 | `/var/backups/docker-backup` | 备份文件存储目录 | +| `prefix` | 字符串 | 否 | `backup` | 备份文件名前缀 | +| `retention.enabled` | 布尔 | 否 | `true` | 是否启用自动清理 | +| `retention.keep_days` | 整数 | 否 | `7` | 保留最近 N 天备份 | +| `retention.keep_count` | 整数 | 否 | `null` | 保留最近 N 个备份文件 | + +### `folders` 区块 + +| 配置项 | 类型 | 必填 | 默认值 | 描述 | +|--------|------|------|--------|------| +| `enabled` | 布尔 | 否 | `true` | 是否启用文件夹备份 | +| `sources` | 字符串数组 | 是 | `[]` | 需备份的文件夹路径列表 | +| `excludes` | 字符串数组 | 否 | 预定义排除模式 | 排除的文件/文件夹模式 | + +### `mysql` 区块 + +| 配置项 | 类型 | 必填 | 默认值 | 描述 | +|--------|------|------|--------|------| +| `enabled` | 布尔 | 否 | `true` | 是否启用 MySQL 备份 | +| `container_name` | 字符串 | 是 | 无 | MySQL 容器名称 | +| `username` | 字符串 | 是 | 无 | 数据库用户名 | +| `password` | 字符串 | 是 | 无 | 数据库密码 | +| `databases` | 字符串数组或字符串 | 是 | 无 | 要备份的数据库,可以是具体库名或 `"all"` | + +### `logging` 区块 + +| 配置项 | 类型 | 必填 | 默认值 | 描述 | +|--------|------|------|--------|------| +| `enabled` | 布尔 | 否 | `true` | 是否启用日志 | +| `log_file` | 字符串 | 是 | `/var/log/docker-backup.log` | 日志文件路径 | +| `level` | 字符串 | 否 | `"INFO"` | 日志级别 (`DEBUG`, `INFO`, `WARN`, `ERROR`) | + +### `notification` 区块 + +| 配置项 | 类型 | 必填 | 默认值 | 描述 | +|--------|------|------|--------|------| +| `enabled` | 布尔 | 否 | `false` | 是否启用通知 | +| `method` | 字符串 | 条件必填 | 无 | 通知方式 (`email`, `webhook`) | +| `webhook_url` | 字符串 | 条件必填 | 无 | Webhook 地址 | +| `on_failure_only` | 布尔 | 否 | `true` | 是否仅在备份失败时通知 | + +## 配置依赖和约束 + +1. 互斥配置: + - `retention.keep_days` 和 `retention.keep_count` 互斥 + +2. 必要条件: + - MySQL 备份需要 `container_name`、`username`、`password` + - 通知需要 `method` 和相应的地址 + +3. 验证规则: + - 文件夹备份需要至少一个有效的 `sources` + - 检查路径有效性 + - 验证工具依赖(`yq`, `tar`, `docker`) \ No newline at end of file diff --git a/llmdoc/reference/git-conventions.md b/llmdoc/reference/git-conventions.md new file mode 100644 index 0000000..3b7af1d --- /dev/null +++ b/llmdoc/reference/git-conventions.md @@ -0,0 +1,88 @@ +# Git 约定 + +## 1. 分支策略 + +### 主分支 +- **主分支名称**:`main` +- **主分支规则**: + - 始终保持稳定和可部署状态 + - 直接对应生产环境 + - 受保护分支,需要代码审查才能合并 + +### 开发分支类型 +- `feature/[功能名称]`:新功能开发 +- `bugfix/[问题描述]`:修复特定 bug +- `hotfix/[紧急问题]`:生产环境紧急修复 +- `docs/[文档内容]`:文档更新 +- `refactor/[模块名称]`:代码重构 + +## 2. 提交消息格式 + +提交消息应遵循语义化提交规范: + +``` +(): + +[可选的详细描述] + +- 可选的脚注信息 +``` + +### 类型 (Type) +- `feat`: 新功能 +- `fix`: 修复 bug +- `docs`: 文档变更 +- `style`: 代码格式调整 +- `refactor`: 代码重构 +- `test`: 测试相关 +- `chore`: 构建过程或辅助工具变更 + +### 示例提交消息 +``` +feat(auth): 添加用户注册功能 + +- 实现基于电子邮件的用户注册流程 +- 集成用户验证机制 +``` + +## 3. 推荐工作流程 + +1. 从 `main` 创建功能分支 + ```bash + git checkout -b feature/new-feature main + ``` + +2. 进行开发并频繁提交 + ```bash + git add . + git commit -m "feat(module): 描述具体变更" + ``` + +3. 推送分支到远程仓库 + ```bash + git push -u origin feature/new-feature + ``` + +4. 创建 Pull Request + - 目标分支:`main` + - 包含详细的变更说明 + - 等待代码审查和批准 + +5. 合并后清理分支 + ```bash + git checkout main + git pull + git branch -d feature/new-feature + ``` + +## 4. 其他最佳实践 + +- 保持提交原子化和有意义 +- 编写清晰、简洁的提交消息 +- 避免在一个提交中包含多个无关的变更 +- 使用 `.gitignore` 排除不需要版本控制的文件 + +## 5. 推荐工具 + +- Git 提交检查:`pre-commit` +- 代码审查:GitHub/GitLab Pull Request \ No newline at end of file