# data_backup_for **Repository Path**: ismartyx/data_backup_for ## Basic Information - **Project Name**: data_backup_for - **Description**: 一个功能强大的多数据源统一备份与分发工具,支持 MySQL 数据库备份、MinIO 对象存储数据拉取,通过 Syncthing 实现去中心化分发,以及灵活的定时任务调度。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: sync - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2026-05-13 - **Last Updated**: 2026-05-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 生产数据备份工具 (Syncthing + MinIO + MySQL 版) 一个功能强大的**多数据源统一备份与分发工具**,支持 MySQL 数据库备份、MinIO 对象存储数据拉取,通过 Syncthing 实现去中心化分发,以及灵活的定时任务调度。 ## 📋 项目概述 **data_backup_for** 是一个企业级**多数据源统一备份解决方案**,支持独立或组合使用以下功能模块: | 模块 | 数据源 | 功能描述 | 数据流向 | |:---:|:-------------:|:--------------------------|:--------------| | 🗄️ | **MySQL** | 全库/逐库备份,自动压缩(gzip/tar.gz) | 数据库 → 本地文件 | | ☁️ | **MinIO** | 从对象存储拉取 bucket 数据 | 对象存储 → 本地文件 | | 🔄 | **Syncthing** | 统一分发通道,将本地数据同步到各节点 | 本地文件 → 去中心化网络 | **核心特性**: - **模块化设计**:MySQL 备份(`MYSQL_ENABLED`)、MinIO 同步(`MINIO_ENABLED`)、Syncthing 分发(`SYNCTHING_ENABLED`)可独立启用,按需组合 - **统一出口**:多个数据源的数据通过 Syncthing 统一分发,简化多节点同步架构 - **独立调度**:各模块可配置独立的 Cron 定时,互不干扰 - **生产就绪**:守护进程模式、优雅退出、自动清理、详细日志 ## 🚀 主要特性 ### 🗄️ 数据源模块 #### MySQL 备份 - **独立开关**:通过 `MYSQL_ENABLED` 控制是否启用 MySQL 备份,与 MinIO、Syncthing 完全独立 - **智能端口检测**:自动检测 MySQL 端口(支持配置文件指定、进程检测) - **多种备份模式**: - 全库备份(`--all-databases`)→ 单个 `.sql.gz` 文件 - 逐库备份(`DUMP_EACH_DB=yes`)→ 每个库独立 `.sql` 文件,最终打包为一个 `.tar.gz` 归档;单库失败不影响其他库 - **跳过视图**:遇到损坏视图时可选择跳过(`SKIP_VIEWS=yes`) - **忽略指定数据库**:可配置忽略的数据库列表 - **自定义参数**:支持额外的 `mysqldump` 参数 - **自动压缩**:全库模式 gzip 压缩,逐库模式 tar.gz 打包压缩 #### MinIO 对象存储同步 - **mc mirror 同步**:使用 MinIO Client 将 bucket 数据镜像到本地 - **独立调度**:配置 `MINIO_CRON` 后,MinIO 同步拥有独立 Cron,与 MySQL 备份完全解耦 - **不被打断**:守护进程模式下 `mc mirror` 在后台 goroutine 运行,即使调度触发下一轮备份也不会被中断 - **优雅退出**:收到 `SIGTERM`/`SIGINT` 后等待正在进行的 `mc mirror` 自然完成再退出 - **内嵌 mc 支持**:支持内嵌 mc 二进制,无需外部依赖 - **自动目录创建**:自动创建以 bucket 命名的子目录 ### 🔄 统一分发模块 #### Syncthing 去中心化同步 - **智能复用**:优先检测并复用外部运行的 Syncthing 实例,无需重复启动 - **内嵌 Syncthing**:未检测到外部实例时自动释放并启动内嵌二进制 - **统一出口**:将 MySQL 备份目录、MinIO 同步目录统一通过 Syncthing 分发到各节点 - **自动配置**:自动创建共享文件夹,设置 sendonly 模式 - **自动接受设备**:可配置自动接受新设备连接 - **多文件夹支持**:不同数据源可使用独立的 Syncthing 文件夹 ID ### ⏰ 任务调度 - **单次执行**:立即执行一次备份任务(MinIO 同步同步阻塞执行) - **守护进程模式**:后台运行,MySQL 备份按 `BACKUP_CRON` 定时,MinIO 同步按 `MINIO_CRON` 独立定时 - **信号处理**:支持 Ctrl+C 优雅退出,自动停止 Syncthing 子进程,等待 MinIO 同步完成 ### 📁 文件管理 - **备份保留策略**:按天数自动清理过期备份文件 - **日志保留策略**:按天数自动清理过期日志文件 - **每日日志**:日志按日期命名(`backup_YYYYMMDD.log`),同时输出到控制台 ## 📦 安装与使用 ### 1. 环境要求 - **Go 1.21+**(仅编译时需要) - **MySQL 客户端工具**:`mysqldump` 命令必须在 PATH 中或指定路径 - **可选依赖**: - MinIO Client (`mc`):用于 MinIO 同步(也可使用内嵌版本) ### 2. 准备内嵌二进制(可选) 如需将 Syncthing 和 mc 打包进可执行文件: ```bash # 准备 Syncthing 二进制(Windows 示例) mkdir -p syncthing/embed_in_bin # 下载对应平台的 syncthing 二进制到 syncthing/embed_in_bin/ # Windows: syncthing.exe Linux/macOS: syncthing # 准备 mc 二进制(Windows 示例) # 下载 mc.exe 到 syncthing/embed_in_bin/ ``` ### 3. 编译安装 **Windows (PowerShell):** ```powershell # 克隆项目 git clone https://gitee.com/ismartyx/data_backup_for.git cd data_backup_for # 编译 .\build.ps1 ``` **Linux/macOS:** ```bash # 克隆项目 git clone https://gitee.com/ismartyx/data_backup_for.git cd data_backup_for # 编译 chmod +x build.sh ./build.sh ``` 编译后会在 `dist/` 目录生成: - `data_backup_for_windows_amd64_*.exe`(Windows) - `data_backup_for_linux_amd64_*`(Linux x86_64) ### 4. 配置文件 创建 `backup_config.conf` 配置文件: ```ini # ============================================================ # MySQL 备份 + Syncthing 同步 + MinIO 拉取 配置文件 # ============================================================ # ======================== MySQL 连接 ======================== MYSQL_HOST = 127.0.0.1 MYSQL_PORT = 3306 MYSQL_USER = root MYSQL_PASSWORD = your_password # ====================== 备份基础设置 ======================== # 是否启用 MySQL 备份: true/false(与 MinIO、Syncthing 完全独立) MYSQL_ENABLED = true # MySQL 备份文件存放目录 MYSQL_BACKUP_DIR = ./backups # 日志目录 LOG_DIR = ./logs # 本地备份保留天数 MYSQL_BACKUP_KEEP_DAYS = 7 # 日志文件保留天数 LOG_KEEP_DAYS = 30 # 守护模式定时备份(cron 表达式,留空则仅支持单次运行) BACKUP_CRON = 0 3 * * * # ==================== mysqldump 高级选项 ==================== # 跳过视图导出(有损坏视图时开启): yes/no SKIP_VIEWS = no # 逐库备份,单库失败不影响其他库: yes/no DUMP_EACH_DB = no # 忽略指定数据库(逗号分隔,留空则不忽略) IGNORE_DATABASES = # 附加 mysqldump 参数(直接追加到命令行) MYSQLDUMP_FLAGS = # mysqldump/mysql 可执行文件路径(留空则使用系统 PATH) # 优先级: 此处配置 > 环境变量 MYSQLDUMP_PATH/MYSQL_PATH > 系统 PATH # Windows 示例: MYSQLDUMP_PATH = C:\mysql\bin\mysqldump.exe MYSQL_PATH = MYSQLDUMP_PATH = # =================== Syncthing 去中心化同步 ================= # 是否启用 Syncthing 同步: true/false SYNCTHING_ENABLED = true # Syncthing REST API 地址(内嵌进程默认 http://127.0.0.1:8384) SYNCTHING_API_URL = http://127.0.0.1:8384 # Syncthing API 密钥(留空时程序自动生成) # 注意:如已有外部 Syncthing 实例运行,需配置与其 API Key 一致才能复用 SYNCTHING_API_KEY = mysecretkey123 # MySQL 备份目录在 Syncthing 中的文件夹 ID SYNC_MYSQL_FOLDER_ID = mysql-backup # MySQL 备份文件共享给 Syncthing 的本地目录(留空则使用 MYSQL_BACKUP_DIR) SYNC_MYSQL_DIR = ./backups # 等待对端同步完成的超时秒数(无对端连接时自动跳过) SYNC_TIMEOUT_SEC = 180 # Syncthing 配置目录(留空则使用默认位置) SYNC_CONFIG_DIR = # 新设备连接时自动接受并加入共享文件夹: true=自动接受, false=手动在 Web UI 操作 SYNC_AUTO_ACCEPT = false # sendonly 模式:强制以本机版本覆盖对端(防止对端误删/改后同步回来): true/false SYNC_OVERRIDE = true # ==================== MinIO 对象存储拉取 ==================== # 是否启用 MinIO 同步: true/false MINIO_ENABLED = false # MinIO 服务地址 MINIO_ENDPOINT = http://192.168.1.100:9000 # MinIO 访问密钥 / 秘钥 MINIO_ACCESS_KEY = minioadmin MINIO_SECRET_KEY = minioadmin # 要拉取的 bucket 名称 MINIO_BUCKET = mybucket # MinIO 数据落盘根目录(bucket 自动作为子文件夹,如 {MINIO_LOCAL_DIR}/mybucket/) # 留空则默认放在 SYNC_MYSQL_DIR/minio/{bucket}/ 下 MINIO_LOCAL_DIR = ./minio-backup # mc 可执行文件路径(留空则优先使用内嵌 mc,否则回退到系统 PATH) MINIO_MC_BIN = # MinIO 独立定时同步(cron 表达式,留空则跟随 BACKUP_CRON 异步执行) MINIO_CRON = # MinIO 落盘目录在 Syncthing 中的文件夹 ID(留空则自动生成: SYNC_MYSQL_FOLDER_ID-minio) SYNC_MINIO_FOLDER_ID = minio-backup ``` ### 5. 运行方式 #### 单次运行 ```bash # Linux/macOS ./data_backup_for_linux_amd64 backup_config.conf # Windows data_backup_for_windows_amd64.exe backup_config.conf ``` #### 守护进程模式(带定时任务) ```bash # Linux/macOS ./data_backup_for_linux_amd64 -daemon backup_config.conf # Windows data_backup_for_windows_amd64.exe -daemon backup_config.conf ``` 守护进程模式特点: 1. 启动时立即执行一次备份 2. 按照 `BACKUP_CRON` 定时执行 MySQL 备份 3. 若配置了 `MINIO_CRON`,MinIO 同步独立调度,`mc mirror` 后台运行不被打断 4. **Syncthing 智能管理**:优先检测并复用外部运行的 Syncthing 实例;若无可用实例则自动启动内嵌 Syncthing;程序退出时仅停止本程序启动的实例 5. 按 Ctrl+C 或发送 SIGTERM 信号优雅退出,等待正在运行的 `mc mirror` 完成后再停止 ## 📖 使用示例 ### 示例 1:仅 MySQL 备份 ```ini # 最简配置,仅备份 MySQL MYSQL_ENABLED = true MYSQL_HOST = 192.168.1.10 MYSQL_USER = backup MYSQL_PASSWORD = secret123 BACKUP_DIR = /var/backups/mysql LOG_DIR = /var/log/mysql-backup MYSQL_BACKUP_KEEP_DAYS = 14 SYNCTHING_ENABLED = false MINIO_ENABLED = false ``` ### 示例 2:MySQL + Syncthing 同步 ```ini # 备份 MySQL 并通过 Syncthing 同步到其他节点 MYSQL_HOST = 192.168.1.10 MYSQL_USER = backup MYSQL_PASSWORD = secret123 BACKUP_DIR = /var/backups/mysql SYNCTHING_ENABLED = true SYNC_MYSQL_FOLDER_ID = production-mysql-backup SYNCTHING_API_KEY = auto # 留空会自动生成 SYNCTHING_AUTO_ACCEPT = true ``` ### 示例 3:仅 MinIO 同步(不备份 MySQL) ```ini # 关闭 MySQL 备份,仅做 MinIO 数据拉取 MYSQL_ENABLED = false MINIO_ENABLED = true MINIO_ENDPOINT = http://minio.example.com:9000 MINIO_ACCESS_KEY = admin MINIO_SECRET_KEY = password MINIO_BUCKET = documents MINIO_LOCAL_DIR = /var/backups/minio MINIO_CRON = 0 */4 * * * SYNCTHING_ENABLED = false ``` ### 示例 4:完整配置(MySQL + Syncthing + MinIO) ```ini # 完整配置,同时支持三种备份方式 MYSQL_ENABLED = true MYSQL_HOST = 192.168.1.10 MYSQL_USER = backup MYSQL_PASSWORD = secret123 BACKUP_DIR = D:\backups\mysql # Syncthing 同步 MySQL 备份 SYNCTHING_ENABLED = true SYNC_MYSQL_FOLDER_ID = mysql-backup SYNCTHING_AUTO_ACCEPT = true # MinIO 同步(将对象存储数据同步到本地,再通过 Syncthing 分发) MINIO_ENABLED = true MINIO_ENDPOINT = http://minio.example.com:9000 MINIO_ACCESS_KEY = admin MINIO_SECRET_KEY = password MINIO_BUCKET = documents MINIO_SYNC_DIR = D:\backups\minio SYNC_MINIO_FOLDER_ID = minio-documents ``` ### 示例 5:MySQL 与 MinIO 独立调度(推荐生产环境) MinIO 数据量大时,`mc mirror` 耗时很长,配置独立 Cron 可避免与 MySQL 备份互相阻塞: ```ini MYSQL_HOST = 192.168.1.10 MYSQL_USER = backup MYSQL_PASSWORD = secret123 BACKUP_DIR = /var/backups/mysql LOG_DIR = /var/log/mysql-backup # MySQL 备份:每天凌晨 2 点 BACKUP_CRON = 0 2 * * * MINIO_ENABLED = true MINIO_ENDPOINT = http://minio.example.com:9000 MINIO_ACCESS_KEY = admin MINIO_SECRET_KEY = password MINIO_BUCKET = documents MINIO_SYNC_DIR = /var/backups/minio # MinIO 同步:每 4 小时独立执行一次,mc mirror 后台运行不被打断 MINIO_CRON = 0 */4 * * * ``` ## ⚙️ 配置说明 ### MySQL 配置 | 配置项 | 说明 | 必填 | 默认值 | |--------|------|------|--------| | `MYSQL_HOST` | MySQL 主机地址 | 是 | - | | `MYSQL_PORT` | MySQL 端口 | 否 | 自动检测 | | `MYSQL_USER` | MySQL 用户名 | 是 | - | | `MYSQL_PASSWORD` | MySQL 密码 | 是 | - | | `MYSQL_PATH` | mysql 命令路径 | 否 | 自动检测 | | `MYSQLDUMP_PATH` | mysqldump 命令路径 | 否 | 自动检测 | ### 备份配置 | 配置项 | 说明 | 必填 | 默认值 | |--------------------------|-----------------------------|----|--------| | `MYSQL_ENABLED` | 启用 MySQL 备份(`true`/`false`) | 否 | `true` | | `BACKUP_DIR` | 本地备份目录 | 是 | - | | `LOG_DIR` | 日志目录 | 是 | - | | `MYSQL_BACKUP_KEEP_DAYS` | 备份保留天数 | 否 | 7 | | `LOG_KEEP_DAYS` | 日志保留天数 | 否 | 30 | | `BACKUP_CRON` | Cron 表达式(守护模式) | 否 | - | ### MySQL 高级选项 | 配置项 | 说明 | 默认值 | |-------------------------|---------------------------------------------|------| | `SKIP_VIEWS` | 跳过视图导出(`yes`/`no`) | `no` | | `DUMP_EACH_DB` | 逐库备份,每库独立 `.sql`,最终打包 `.tar.gz`(`yes`/`no`) | `no` | | `IGNORE_DATABASES` | 忽略的数据库(逗号分隔) | 空 | | `MYSQLDUMP_EXTRA_FLAGS` | 额外的 mysqldump 参数 | 空 | ### Syncthing 配置 | 配置项 | 说明 | 默认值 | |------------------------|------------------------------|-------------------------| | `SYNCTHING_ENABLED` | 启用 Syncthing(`true`/`false`) | `false` | | `SYNCTHING_API_URL` | Syncthing REST API 地址 | `http://127.0.0.1:8384` | | `SYNCTHING_API_KEY` | API Key(留空自动生成;复用外部实例时需配置一致) | 自动生成 | | `SYNC_MYSQL_FOLDER_ID` | 共享文件夹 ID | `mysql-backup` | | `SYNC_MYSQL_DIR` | 共享目录路径(默认使用 BACKUP_DIR) | - | | `SYNC_TIMEOUT_SEC` | 同步超时时间(秒) | 180 | | `SYNC_CONFIG_DIR` | Syncthing 配置目录(留空使用默认位置) | - | | `SYNC_AUTO_ACCEPT` | 自动接受新设备连接 | `false` | | `SYNC_OVERRIDE` | 强制以本机版本覆盖对端(sendonly 模式) | `true` | ### MinIO 配置 | 配置项 | 说明 | 默认值 | |------------------------|---------------------------------------------|--------------------------------| | `MINIO_ENABLED` | 启用 MinIO 同步(`true`/`false`) | `false` | | `MINIO_ENDPOINT` | MinIO 服务端点 | - | | `MINIO_ACCESS_KEY` | 访问密钥 | - | | `MINIO_SECRET_KEY` | 密钥 | - | | `MINIO_BUCKET` | 要同步的 bucket | - | | `MINIO_SYNC_DIR` | 本地同步目录 | `{BACKUP_DIR}/minio/{bucket}` | | `MINIO_MC_PATH` | mc 命令路径(留空使用内嵌或 PATH) | 自动检测 | | `MINIO_CRON` | MinIO 独立调度 Cron(留空则随 MySQL 备份异步触发,**推荐配置**) | 空(随备份触发) | | `SYNC_MINIO_FOLDER_ID` | MinIO 的 Syncthing 文件夹 ID | `{SYNC_MYSQL_FOLDER_ID}-minio` | ## 📝 日志说明 ### 日志文件 | 文件名格式 | 说明 | |------------|------| | `backup_YYYYMMDD.log` | 每日备份日志,同时输出到控制台 | ### 日志内容示例 ``` [2025-05-13 14:30:00] ========== 开始备份任务 ========== [2025-05-13 14:30:00] Step 0: 使用手工指定的 MySQL 端口: 3306 ✋ [2025-05-13 14:30:00] Step 0.5: 验证 MySQL 连接 (127.0.0.1:3306)... [2025-05-13 14:30:00] ✅ MySQL 连接正常 [2025-05-13 14:30:00] Step 1: 逐库导出 MySQL 数据库 (DUMP_EACH_DB=true)... [2025-05-13 14:30:10] 📋 待备份数据库: 5 个 [2025-05-13 14:30:10] 📤 导出数据库: mydb1 ... [2025-05-13 14:30:15] ✅ 数据库 mydb1 导出成功 → mydb1.sql [2025-05-13 14:30:15] 📤 导出数据库: mydb2 ... [2025-05-13 14:30:20] ✅ 数据库 mydb2 导出成功 → mydb2.sql [2025-05-13 14:30:20] 📦 正在打包 5 个 .sql 文件为 tar.gz ... [2025-05-13 14:30:28] 📦 备份文件: backups/mysql_all_2025-05-13_14-30-00.tar.gz,大小: 128.3 MB [2025-05-13 14:30:28] Step 2: 校验备份文件完整性... [2025-05-13 14:30:29] ✅ 备份文件完整性校验通过 [2025-05-13 14:30:29] ☁️ MinIO 同步在后台异步执行,不阻塞备份任务... [2025-05-13 14:30:29] Step 3.5: 启动 Syncthing 去中心化同步... [2025-05-13 14:30:30] 🔄 触发 Syncthing 重新扫描... [2025-05-13 14:30:30] Step 4: 清理 7 天前的本地备份... [2025-05-13 14:30:30] ========== 备份任务全部完成 ========== ``` ## 🔧 故障排除 ### 常见问题 #### 1. MySQL 连接失败 **现象**:备份启动时报错连接失败 **排查步骤**: ```bash # 检查 MySQL 服务状态 mysqladmin -h -u -p status # 验证端口连通性 telnet ``` **解决方案**: - 检查 MySQL 服务是否运行 - 验证用户名密码正确性 - 确认防火墙允许连接 - 检查 MySQL 用户是否有远程访问权限 #### 2. mysqldump 命令未找到 **现象**:报错 "mysqldump: command not found" **解决方案**: ```ini # 在配置文件中指定路径 MYSQLDUMP_PATH = /usr/bin/mysqldump # Windows 示例 MYSQLDUMP_PATH = C:\mysql\bin\mysqldump.exe ``` #### 3. Syncthing 启动失败 **现象**:报错 "读取内嵌 syncthing 二进制失败" **原因**:内嵌二进制是占位文件或不存在 **解决方案**: 1. 下载对应平台的 Syncthing 二进制 2. 放入 `syncthing/embed_in_bin/` 目录 3. 重新编译项目 ```bash # Linux 示例 wget https://github.com/syncthing/syncthing/releases/download/v1.29.7/syncthing-linux-amd64-v1.29.7.tar.gz tar xf syncthing-linux-amd64-v1.29.7.tar.gz cp syncthing-linux-amd64-v1.29.7/syncthing syncthing/embed_in_bin/ ./build.sh ``` #### 4. 检测到外部 Syncthing 实例但 API Key 不匹配 **现象**:报错 "检测到外部 Syncthing 实例运行,但 API Key 不匹配" **原因**:本程序优先检测复用外部 Syncthing 实例,如果外部实例的 API Key 与配置文件不一致,则无法通过 API 控制该实例 **解决方案**: 1. **方案一(推荐)**:获取外部 Syncthing 的 API Key 并配置到本程序 - 在外部 Syncthing 的 Web UI 中查看 Settings → GUI → API Key - 将该 Key 配置到 `backup_config.conf` 的 `SYNCTHING_API_KEY` 项 2. **方案二**:修改外部 Syncthing 的 API Key 为本程序配置的值 - 在外部 Syncthing 的 Web UI 中将 API Key 设置为配置文件中的值 3. **方案三**:停止外部 Syncthing 实例,让本程序自动启动内嵌实例 #### 5. MinIO 同步失败 **现象**:mc mirror 命令失败 **解决方案**: - 检查 MinIO 服务端点是否可访问 - 验证访问密钥和密钥正确性 - 确认 bucket 存在且有访问权限 - 指定外部 mc 路径:`MINIO_MC_PATH = /usr/local/bin/mc` #### 6. 备份文件过大 **解决方案**: - 使用 `IGNORE_DATABASES` 排除不需要的数据库 - 启用 `DUMP_EACH_DB` 逐库备份,便于单独管理 - 考虑使用 `MYSQLDUMP_EXTRA_FLAGS` 添加压缩选项 ### 调试技巧 ```bash # 实时查看日志 tail -f logs/backup_$(date +%Y%m%d).log # 测试配置文件是否正确加载(单次运行,输出到控制台) ./data_backup_for config.conf 2>&1 | head -30 ``` ## 🖥️ 系统集成 ### Linux Systemd 服务 ```bash # 创建 systemd 服务文件 sudo tee /etc/systemd/system/mysql-backup.service << 'EOF' [Unit] Description=MySQL Backup with Syncthing Sync Service After=network.target [Service] Type=simple User=backup WorkingDirectory=/opt/mysql_backup ExecStart=/opt/mysql_backup/data_backup_for_linux_amd64 -daemon /opt/mysql_backup/backup_config.conf Restart=on-failure RestartSec=30 [Install] WantedBy=multi-user.target EOF # 设置权限 sudo chmod 644 /etc/systemd/system/mysql-backup.service # 启用并启动服务 sudo systemctl daemon-reload sudo systemctl enable mysql-backup sudo systemctl start mysql-backup # 查看状态 sudo systemctl status mysql-backup sudo journalctl -u mysql-backup -f ``` ### Windows 服务 使用 NSSM 将程序注册为 Windows 服务: ```powershell # 下载 NSSM: https://nssm.cc/download # 安装服务 nssm install MySQLBackup "C:\path\to\data_backup_for_windows_amd64.exe" nssm set MySQLBackup AppParameters "-daemon C:\path\to\backup_config.conf" nssm set MySQLBackup WorkingDirectory "C:\path\to\backup" nssm start MySQLBackup ``` ### Docker 部署 ```dockerfile FROM golang:1.21-alpine AS builder WORKDIR /app COPY . . RUN cd syncthing && go build -o /app/data_backup_for . FROM alpine:latest RUN apk add --no-cache mysql-client COPY --from=builder /app/data_backup_for /usr/local/bin/ ENTRYPOINT ["data_backup_for"] ``` ```yaml # docker-compose.yml version: '3.8' services: mysql-backup: build: . volumes: - ./backup_config.conf:/config.conf - ./backups:/backups - ./logs:/logs command: ["-daemon", "/config.conf"] restart: unless-stopped ``` ## 🔒 安全建议 ### 配置文件安全 ```bash # Linux/macOS: 设置严格的文件权限 chmod 600 backup_config.conf chown backup:backup backup_config.conf # 将配置文件放在安全目录 mkdir -p /etc/mysql_backup mv backup_config.conf /etc/mysql_backup/ ln -s /etc/mysql_backup/backup_config.conf ./backup_config.conf ``` ### 密码管理 1. **使用专用备份账号**: ```sql CREATE USER 'backup'@'%' IDENTIFIED BY 'strong_password'; GRANT SELECT, LOCK TABLES, SHOW VIEW, RELOAD, REPLICATION CLIENT ON *.* TO 'backup'@'%'; FLUSH PRIVILEGES; ``` 2. **定期更换密码**: - 建议每 90 天更换一次 - 避免使用默认密码 3. **考虑使用密钥管理服务**(生产环境): - HashiCorp Vault - AWS Secrets Manager - Azure Key Vault ### 网络安全 1. **Syncthing 安全**: - 启用设备验证 - 使用强 API Key - 限制 Web UI 访问(绑定到 127.0.0.1) - 启用 HTTPS(通过反向代理) 2. **MinIO 安全**: - 使用 HTTPS 端点 - 启用 bucket 策略限制 - 定期轮换访问密钥 3. **防火墙配置**: ```bash # 仅允许必要的端口 # MySQL: 3306(建议限制源 IP) # Syncthing: 22000 (TCP), 21027 (UDP) # MinIO: 9000 ``` ## 📁 项目结构 ``` data_backup_for/ ├── syncthing/ │ ├── data_backup_for.go # 主程序入口 │ ├── backup_runner.go # 备份流程编排 │ ├── backup_config.conf # 配置文件示例 │ ├── config.go # 配置解析 │ ├── syncthing_process.go # Syncthing 进程管理(含复用逻辑) │ ├── syncthing_client.go # Syncthing REST API 客户端 │ ├── syncthing_embed.go # Syncthing 内嵌二进制释放 │ ├── minio_sync.go # MinIO 同步逻辑 │ ├── mc_embed.go # MinIO Client 内嵌逻辑 │ ├── mysql_backup.go # MySQL 备份逻辑 │ ├── file_utils.go # 文件工具函数 │ ├── logger.go # 日志工具 │ ├── go_boot.go # 守护模式启动 │ └── embed_in_bin/ # 内嵌二进制目录(可选) │ ├── syncthing(.exe) # Syncthing 二进制 │ └── mc(.exe) # MinIO Client 二进制 ├── go.mod # Go 模块定义 ├── go.sum # 依赖版本锁定 ├── build.ps1 # Windows 构建脚本 ├── build.sh # Linux/macOS 构建脚本 ├── dist/ # 编译输出目录 ├── logs/ # 默认日志目录 └── README.md # 本文件 ``` ## 📄 许可证 随便用 ## 📞 联系方式 - 项目地址:[https://gitee.com/ismartyx/data_backup_for](https://gitee.com/ismartyx/data_backup_for.git) - 作者:ismartyx --- **⚠️ 注意事项**: 1. 生产环境部署前,请务必在测试环境充分验证 2. 定期检查备份文件完整性 3. 建议配置监控告警,及时发现备份失败 4. 备份文件包含敏感数据,请妥善保管