# msync **Repository Path**: mike_co/msync ## Basic Information - **Project Name**: msync - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-11-14 - **Last Updated**: 2025-12-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # msync - 远程差量备份工具 使用 rsync 进行远程差量备份的 Rust 工具,支持定时执行。 ## 功能特性 - ✅ 使用 rsync 进行高效的差量备份 - ✅ 支持 SSH 远程备份 - ✅ 支持定时执行备份任务 - ✅ 自动删除远程已删除的文件(`--delete`) - ✅ 支持多个定时时间点 - ✅ 按日期切分的日志文件(保存在 `logs/` 目录) ## 系统要求 - Windows 10 或 Windows 11 - rsync(程序会自动检测系统 rsync,按以下优先级): 1. 系统 PATH 中的 rsync 2. WSL (Windows Subsystem for Linux) 中的 rsync 3. Git for Windows 自带的 rsync **注意**:如果以上都没有,程序会报错。请先安装 rsync: - 安装 Git for Windows(包含 rsync) - 安装 WSL 并在其中安装 rsync - 安装 Cygwin 并安装 rsync 包 - 将 rsync 添加到系统 PATH 环境变量 ## 配置说明 编辑 `config.toml` 文件: ```toml [backup] source_dir = "C:/Users/Administrator/Documents" [ssh] # 是否启用 SSH 备份 enabled = true # 远程服务器地址 host = "192.168.1.100" # SSH 端口,默认 22 port = 22 # 用户名 username = "user" # 密码(可选,建议使用密钥认证) password = "" # 私钥文件路径(推荐使用密钥认证) private_key_path = "~/.ssh/id_rsa" # 远程目标目录 remote_destination_dir = "/backup/msync" # 路径格式:windows(Windows 路径,如 C:/Users/...)、gitbash(Git Bash 路径,如 /C/Users/...)、wsl(WSL 路径,如 /mnt/c/Users/...) # 默认值:windows path_format = "windows" [schedule] # 是否启用定时备份 enabled = true # 定时执行时间,格式:HH:MM(24小时制) # 可以设置多个时间,用逗号分隔,例如 "02:30,14:30" times = "02:30,14:30" # cron 表达式(暂未实现) cron = "" ``` ## 使用方法 ### 1. 单次备份 如果 `schedule.enabled = false`,程序会执行一次备份后退出: ```bash cargo run ``` 或指定配置文件: ```bash cargo run -- path/to/config.toml ``` ### 2. 定时备份 如果 `schedule.enabled = true`,程序会持续运行,在指定时间执行备份: ```bash cargo run ``` 程序会显示下次备份时间,按 `Ctrl+C` 退出。 ## rsync 参数说明 程序使用以下 rsync 参数: - `-a`: 归档模式,保留权限、时间戳等 - `-v`: 详细输出 - `-z`: 压缩传输 - `--delete`: 删除目标目录中源目录不存在的文件 - `--progress`: 显示传输进度 ## 路径格式配置 `path_format` 参数用于指定传递给 rsync 的路径格式,根据你的运行环境选择: - **`windows`**(默认):Windows 路径格式,如 `C:/Users/...` - 适用于:Windows 命令提示符、PowerShell、Cygwin 等环境 - **`gitbash`**:Git Bash 路径格式,如 `/C/Users/...` - 适用于:Git Bash、Git for Windows 的 rsync - **`wsl`**:WSL 路径格式,如 `/mnt/c/Users/...` - 适用于:WSL (Windows Subsystem for Linux) 环境 **注意**: - 配置文件中的 `source_dir` 始终使用 Windows 路径格式(如 `C:/Users/...`) - 程序会根据 `path_format` 参数自动转换路径格式传递给 rsync - 如果路径转换不正确,请根据实际运行环境调整 `path_format` 参数 ## SSH 认证 推荐使用 SSH 密钥认证: 1. 生成 SSH 密钥对(如果还没有): ```bash ssh-keygen -t rsa -b 4096 ``` 2. 将公钥复制到远程服务器: ```bash ssh-copy-id user@remote_host ``` 3. 在配置文件中设置 `private_key_path` ## 日志功能 程序会自动在运行目录下创建 `logs/` 文件夹,并按日期切分日志文件: - 日志文件格式:`logs/msync_YYYY-MM-DD.log` - 每天自动创建新的日志文件 - 日志同时输出到控制台和文件 - 记录所有备份操作、错误信息和 rsync 输出 示例日志内容: ``` [2024-01-15 02:30:00] [INFO] 开始使用 rsync 进行差量备份... [2024-01-15 02:30:00] [INFO] 源目录: C:/Users/Administrator/Documents [2024-01-15 02:30:00] [INFO] 远程目录: user@192.168.1.100:/backup/msync [2024-01-15 02:30:05] [INFO] 备份成功: C:/Users/Administrator/Documents -> 192.168.1.100:/backup/msync ``` ## 注意事项 1. **rsync 路径**:确保 rsync 在系统 PATH 中,或程序能找到 rsync 可执行文件 2. **SSH 连接**:确保 SSH 连接正常,建议使用密钥认证 3. **目录路径**: - Windows 路径使用正斜杠或反斜杠都可以 - 源目录末尾的 `/` 表示同步目录内容,而不是目录本身 4. **定时任务**:程序需要持续运行才能执行定时备份,建议作为服务运行 5. **日志文件**:日志文件会自动创建在程序运行目录的 `logs/` 文件夹中,按日期切分 ## 目录结构 程序运行后,建议的目录结构如下: ``` msync/ ├── msync.exe # 主程序 ├── config.toml # 配置文件(需要手动创建) └── logs/ # 日志目录(自动创建) ├── msync_2024-01-15.log └── ... ``` **说明**: - `config.toml`:需要手动创建配置文件(参考下方配置说明) - `logs/`:日志文件自动创建,按日期切分 ## 编译 ```bash cargo build --release ``` 编译后的可执行文件在 `target/release/msync.exe` **部署步骤**: 1. 确保系统已安装 rsync(Git for Windows、WSL 或 Cygwin) 2. 将 `msync.exe` 复制到目标目录 3. 创建 `config.toml` 配置文件(参考下方配置说明) ## 示例 ### 配置文件示例 ```toml [backup] source_dir = "D:/Documents" [ssh] enabled = true host = "backup.example.com" port = 22 username = "backup" private_key_path = "C:/Users/Administrator/.ssh/id_rsa" remote_destination_dir = "/backup/documents" [schedule] enabled = true times = "02:00,14:00" ``` ### 运行示例 ``` 读取配置文件: config.toml 定时任务已启动,将在以下时间执行备份: - 02:00 - 14:00 下次备份时间: 02:00 (3小时25分钟后) 程序运行中,按 Ctrl+C 退出... ```