飞牛用户请使用 OpenSync-fnOS 飞牛原生 fpk 版,安装即用。
在 OpenSync-fnOS Releases 下载
opensync-amd64.fpk(x86 / amd64)或opensync-arm64.fpk(ARM / arm64),在飞牛 NAS 应用管理界面安装完成后即可打开使用,无需 Docker。
官网 | English | 60 秒演示动图 | Docker Hub | Discussions
OpenSync 是面向飞牛 fnOS / 飞牛 NAS、普通 NAS 和 Docker 环境的 AList / OpenList 自动同步工具:把本地目录、网盘、对象存储和 WebDAV 组织成可定时、可追踪、可重试的备份、镜像、归档和迁移任务。
适合已经在使用 AList / OpenList、又需要类似群晖 Cloud Sync 的定时任务、实时进度、失败重试和通知的人。飞牛用户使用原生 fpk;普通 NAS、服务器和 Docker 环境使用 Docker Compose。
| 环境 | 推荐入口 | 下一步 |
|---|---|---|
| 飞牛 fnOS | 原生 fpk Releases | 下载对应架构的 .fpk,在 fnOS 应用管理界面安装 |
| Docker / 其它 NAS | Docker Compose | 复制下面的三条命令并打开 http://你的设备IP:8023/ |
mkdir -p opensync && cd opensync
curl -fsSLO https://raw.githubusercontent.com/chenbin3625/OpenSync/main/docker-compose.yml
docker compose up -d- 你已经用 AList / OpenList 接好了各种存储端,但还缺少定时备份、迁移和归档任务。
- 你想把 NAS 本地目录同步到网盘、对象存储、WebDAV 或另一台设备,不想每次手动复制。
- 你希望看到实时进度、失败文件、历史记录和失败重试,而不是只看命令行日志。
- 你需要一个适合 Docker、飞牛 NAS、普通 NAS 和 ARM 设备的可视化同步工具。
登录页和顶栏的月亮 / 太阳按钮可切换浅色与深色模式,主题偏好保存在当前浏览器,刷新和退出登录后仍保留。
这张动图展示 OpenSync 的主流程:添加 AList / OpenList 引擎、新建同步任务、手动运行、查看实时进度和接收通知。
飞牛用户不需要 Docker,直接安装原生 fpk 包即可:
- 打开 OpenSync-fnOS Releases,下载与设备架构匹配的安装包:
- x86 / amd64:
opensync-amd64.fpk - ARM / arm64:
opensync-arm64.fpk
- x86 / amd64:
- 在飞牛 NAS 的应用管理界面安装该 fpk 包。
- 安装完成后在应用列表中打开 OpenSync 即可使用。
发布页附带 SHA256SUMS,可用于校验安装包:
shasum -a 256 -c SHA256SUMS推荐使用 Docker Compose 部署:
mkdir -p opensync
cd opensync
curl -O https://raw.githubusercontent.com/chenbin3625/OpenSync/main/docker-compose.yml
docker compose up -d启动后访问:
http://你的设备IP:8023/
首次启动后,打开 Web 页面按提示创建管理员用户名和密码。创建完成时页面会一次性展示 24 位恢复密钥,请立即保存;忘记密码时可用“用户名 + 恢复密钥”在 Web 端设置新密码,成功后旧恢复密钥会失效并生成新的恢复密钥。
如果恢复密钥也丢失,需要登录服务器执行 CLI 兜底重置:
./opensync reset-password --user adminDocker Compose 部署可执行:
[ -f .env ] && . ./.env
docker compose exec --user "${PUID:-1000}:${PGID:-1000}" opensync ./opensync reset-password --user admin| 场景 | 示例 |
|---|---|
| 飞牛相册备份 | 把本地照片库自动备份到网盘或对象存储。 |
| 下载目录归档 | 把下载完成的文件定时移动到 WebDAV、另一台 NAS 或冷存储目录。 |
| 影音库镜像 | 把一个 AList / OpenList 后端中的媒体目录镜像到另一个后端。 |
| 文档保护 | 对工作文档做仅新增备份,并在确实有文件同步时通知。 |
| 存储迁移 | 在 AList / OpenList 暴露的不同网盘之间迁移或镜像文件。 |
| 能力 | OpenSync | rclone | 群晖 Cloud Sync | AList / OpenList 自带复制 |
|---|---|---|---|---|
| 目标用户 | 飞牛、NAS、Docker、AList / OpenList 用户 | 命令行和脚本用户 | 群晖用户 | AList / OpenList 用户 |
| 可视化任务管理 | 支持 | 不支持,除非额外封装 UI | 支持 | 偏手动操作 |
| AList / OpenList 集成 | 原生管理多个引擎 | 通常通过 WebDAV 或配置文件 | 不面向 AList / OpenList | 原生,但不是调度器 |
| 多源多目标任务 | 支持 | 可脚本化 | 受产品能力限制 | 手动操作为主 |
| 仅新增 / 全同步 / 移动 | 支持 | 支持,依赖命令组合 | 受产品能力限制 | 复制 / 移动为主 |
| 实时逐文件进度 | 支持 | 命令行输出或日志 | 产品 UI | 有限 |
| 历史任务失败重试 | 支持 | 可脚本化 | 受产品能力限制 | 无专门历史重试 |
| 通知渠道 | Webhook、Server 酱、钉钉、企业微信、飞书 | 可脚本化 | 受产品能力限制 | 无专门通知层 |
| 最适合 | 给 AList / OpenList 加一层可视化 Cloud Sync | 高级用户和自动化脚本 | 只用群晖生态的场景 | 偶尔手动复制文件 |
- 多源多目标:支持单个或多个源目录同步到单个或多个目标目录。
- 三种同步模式:仅新增、全同步和移动模式,分别适合增量备份、目标镜像和归档迁移。
- 灵活调度:支持手动执行、按分钟间隔执行、Cron 定时执行,以及一键执行全部已启用任务。
- 精确筛选:支持 Gitignore 风格排除规则和最小/最大文件大小过滤。
- 实时进度:展示扫描数量、传输速度、剩余时间,以及已完成、失败、等待和运行中的文件明细。
- 任务管理:运行中的任务可以停止;历史任务可以查看详情、重试未完成项和删除记录。
- 多引擎:可管理多个 AList / OpenList 实例,保存前验证地址和令牌,已保存令牌不会回显。
- 通知渠道:支持自定义 Webhook、Server 酱、钉钉、企业微信和飞书 / Lark;可设置无文件需要同步时静默。
- Webhook 定制:支持 GET / POST / PUT、JSON 请求体模板、自定义请求头和发送测试。
- 在线运行配置:可调整历史任务保留时间、任务超时、复制/扫描并发和失败自动重试次数。
- 账号恢复:首次初始化生成 24 位恢复密钥,支持网页重置密码和
reset-passwordCLI 兜底重置。 - 自适应界面:支持桌面端和移动端布局,保持统一浅色主题,任务结束后实时视图会立即更新。
任务以卡片形式展示源目录、目标目录、同步模式与调度计划,可实时查看统计并一键执行、停止、编辑或删除。
任务运行时可实时查看扫描文件数、传输速度、剩余时间,以及已完成、失败、等待和运行中的文件明细。
历史任务记录每次执行的开始时间、耗时与结果,可查看详情、重试未完成项或删除记录。
任务详情页汇总扫描结果与传输统计,并可逐条查看每个文件的同步状态与错误信息。
可维护多个 AList / OpenList 实例,添加引擎时自动验证地址与令牌,已保存令牌不会回显。
支持自定义 Webhook、Server 酱、钉钉、企业微信和飞书 / Lark 等通知渠道,保存前可发送测试消息。
在线调整历史任务保留时间、任务超时、复制/扫描并发与失败自动重试,并支持账号与密码管理。
在通知配置页新增通知时,选择“自定义Webhook”即可接入支持 HTTP/HTTPS 回调的消息服务或自动化平台。
URL为必填项,必须填写有效的 HTTP 或 HTTPS Webhook 地址,可指向内网或本机服务。HTTP方法支持GET、POST、PUT,默认使用POST。GET会把通知标题和内容作为title、content查询参数发送。POST/PUT默认以application/json发送请求体。请求体模板可选,必须是 JSON 对象,支持{title}和{content}占位符;留空时默认发送{"title":"通知标题","content":"通知内容"}。请求头 JSON可选,必须是 JSON 对象,适合填写Authorization、X-Token等鉴权头。- 打开“无需同步时不发送”后,当任务没有需要同步的内容时不会发送通知。
- 保存前可以点击“测试”发送测试消息,确认目标服务能够正常接收。
示例请求体模板:
{
"msg_type": "text",
"text": {
"title": "{title}",
"content": "{content}"
}
}示例请求头:
{
"Authorization": "Bearer your-token"
}services:
opensync:
image: chenbin3625/opensync:latest
container_name: opensync
restart: unless-stopped
ports:
- "8023:8023"
volumes:
- ./data:/app/data
tmpfs:
- /tmp:mode=1777
environment:
TZ: Asia/Shanghai
PUID: ${PUID:-1000}
PGID: ${PGID:-1000}
SQLITE_TMPDIR: /tmp
TMPDIR: /tmp
OPENSYNC_BIND: 0.0.0.0
OPENSYNC_PORT: 8023
GIN_MODE: release每次发布同时推送版本号标签和 latest,latest 始终指向最新的稳定版本。
docker run -d \
--name opensync \
--restart unless-stopped \
-p 8023:8023 \
-v opensync-data:/app/data \
--tmpfs /tmp:mode=1777 \
-e TZ=Asia/Shanghai \
-e SQLITE_TMPDIR=/tmp \
-e TMPDIR=/tmp \
-e OPENSYNC_BIND=0.0.0.0 \
-e OPENSYNC_PORT=8023 \
-e GIN_MODE=release \
chenbin3625/opensync:latest- 备份当前挂载的
data/目录。 - 拉取最新镜像或指定版本镜像。
- 重新启动容器。
- 首次启动会自动执行数据库迁移。
升级时不要删除 data/secret.key,否则旧登录 Cookie 和敏感信息加解密会失效。Web 端密码重置只使用恢复密钥,不会要求输入或暴露 data/secret.key。
定时任务时区始终由 TZ 控制;当 data/config.ini 不存在时,其它启动配置会读取环境变量:
| 变量 | 默认值 | 说明 |
|---|---|---|
TZ |
Asia/Shanghai |
容器和定时任务使用的时区 |
PUID / PGID |
1000 / 1000 |
容器运行使用的宿主机用户和用户组 |
SQLITE_TMPDIR / TMPDIR |
/tmp |
SQLite 和运行时使用的临时目录 |
OPENSYNC_BIND |
0.0.0.0 |
HTTP 监听地址 |
OPENSYNC_PORT |
8023 |
HTTP 服务端口 |
OPENSYNC_EXPIRES |
7 |
登录有效期,单位天 |
OPENSYNC_LOG_LEVEL |
1 |
文件日志等级 |
OPENSYNC_CONSOLE_LEVEL |
2 |
控制台日志等级 |
OPENSYNC_LOG_SAVE |
7 |
日志保留天数 |
OPENSYNC_TASK_SAVE |
30 |
历史任务保留天数,0 表示保留全部 |
OPENSYNC_TASK_TIMEOUT |
48 |
单次任务超时时间,单位小时,0 表示不限制 |
OPENSYNC_COPY_CONCURRENCY |
5 |
单个任务的复制并发数,范围 1 到 100 |
OPENSYNC_SCAN_CONCURRENCY |
8 |
单个任务的扫描并发数,范围 1 到 20 |
OPENSYNC_MAX_RETRIES |
2 |
单个复制项失败后的最大自动重试次数,0 表示不自动重试 |
OPENSYNC_TRUSTED_PROXIES |
空 | 信任的反向代理 CIDR 列表(逗号分隔) |
OPENSYNC_CHOWN |
自动 | 容器数据目录权限策略:always 强制递归修改,never 跳过,未设置时仅在目录所有者不匹配时修改 |
端口:映射 8023,或你设置的 OPENSYNC_PORT。
注意:
data/config.ini一旦存在,除OPENSYNC_TLS_CERT/OPENSYNC_TLS_KEY外的环境变量在重启后将不再生效,配置文件优先。历史任务保留、任务超时、复制/扫描并发和自动重试次数也可以在系统设置页在线调整。
任务超时在系统设置、配置文件和环境变量中均以小时为单位:1 表示一小时,0 表示不限时,修改后对新启动的任务生效。v1.16.2 及更早版本的设置页曾将该单位误标为分钟;已有数值不会自动换算,如果曾为一小时填写 60,请改为 1 并重新启动任务。到达超时后会停止扫描和传输,并请求取消远端任务;远端响应和清理可能需要额外时间。
请持久化 /app/data,它包含数据库、密钥、配置和日志。丢失该目录意味着丢失账号、引擎、任务和历史记录。
- Docker Compose 使用
./data:/app/data;Docker 命令示例使用命名卷opensync-data:/app/data。 - 容器启动时会根据
PUID/PGID检查/app/data的文件归属,避免宿主机目录生成 root 权限文件。可通过OPENSYNC_CHOWN=always强制递归修改,或通过OPENSYNC_CHOWN=never跳过。 - 升级时不要删除
data/secret.key,否则旧登录 Cookie 和敏感信息加解密会失效。Web 端密码重置只使用恢复密钥,不会暴露secret.key。 - 升级前建议先备份挂载的
data/目录,首次启动会自动执行数据库迁移。 - 不要公开
data/目录或任何包含 AList / OpenList Token 的文件;如果误分享了运行数据目录,请及时更换 Token。
docker build -t opensync .
docker run -d \
--name opensync \
--restart unless-stopped \
-p 8023:8023 \
-v opensync-data:/app/data \
--tmpfs /tmp:mode=1777 \
-e TZ=Asia/Shanghai \
-e OPENSYNC_PORT=8023 \
-e GIN_MODE=release \
opensync先构建前端,构建结果会写入 Go 的静态资源嵌入目录:
cd frontend
npm install
npm run build再构建并运行后端:
cd ../backend
go build -o opensync ./cmd/server
./opensync启动后端:
cd backend
go run ./cmd/server启动前端开发服务:
cd frontend
npm install
npm run dev前端开发服务地址:
http://127.0.0.1:3000/
开发服务会把 /svr 接口代理到:
http://localhost:8023
cd frontend
npm run build
cd ../backend
go test ./...GitHub Discussions 已开启:
Q&A:使用求助、部署排障和配置问题。Ideas:功能建议、改进想法和路线讨论。Show and tell:部署案例、截图、NAS 方案分享。
可复现的问题请提交 Issue;使用问题和部署经验优先发 Discussions。
不要提交或公开 backend/data、Docker 挂载的 data/ 目录或任何包含 AList / OpenList Token 的文件。漏洞反馈和加固建议见 SECURITY.md。
欢迎提交 Issue、Discussion 和 Pull Request。提交代码前请阅读 CONTRIBUTING.md。
本项目以 MIT License 授权。







