Repository navigation
Releases
Releases · mingyangbest/tpbackup
v0.2.3:装的时候一条命令,不用再自己编译
以前装它得先 clone、改三处占位符、再等本地编译几分钟。NAS 上没有 git、或者不熟悉命令行的人,往往卡在这一步就没继续。现在镜像直接拉:
curl -fsSL https://raw.githubusercontent.com/mingyangbest/tpbackup/main/install.sh | bash新增
- 镜像发到了 GitHub 容器仓库
ghcr.io/mingyangbest/tpbackup,amd64 和 arm64 都有。装的过程不再需要 git,也不用编译。 install.sh一键装:检查 Docker、建目录、生成随机密码、拉镜像、起容器、等健康检查、把访问地址和密码打印出来。重复运行不会重置密码、不会动数据,升级时也可以直接重跑。- 仓库根目录放了一份开箱能用的
docker-compose.yml。默认端口 8088、密码 tpbackup、备份目录是当前目录下的library/,什么都不改就能起来。想改就复制一份.env.example成.env,改三行。 docker-compose.build.yml:想本地构建(改代码,或者不想用预构建镜像)时走这条。配置继承上面那份,端口密码目录的改法完全一样,不会出现两份配置各自漂移。- 4 项部署入口测试:
install.sh内嵌的 compose 与仓库文件逐字比对、.env.example里的键是不是真有人读、开箱默认值对不对、脚本语法。
修好的问题
- 一键脚本会把已有的同名容器顶掉。第一版容器名默认
tpbackup,机器上已经有一个在跑时,compose 认为这就是同一个服务,直接替换掉——换成新镜像、新端口、新密码,脚本还照常说「装好了」。真机验收时把一台生产实例这么顶掉过,数据卷没动,配置和令牌都在,但那几分钟服务是断的。现在起容器前先查同名容器属于哪个目录,不是本目录就停下,把两个选择摆出来:升级它,或者换个名字装第二个。 - 打印出来的地址可能打不开。以前取
hostname -I的第一项,NAS 上那往往是网桥或虚拟机地址(实测那台机器第一项是 192.168.124.112,真地址排在后面)。改成取默认路由的出口地址。
升级前看一眼
- 这一版没改容器里的代码。
app/和Dockerfile跟 v0.2.2 逐字相同,已经在跑的实例不需要动,备份行为一点没变。这次改的是「怎么装」。 docker-compose.example.yml删了。你机器上那份docker-compose.yml是你自己的,照旧用,不用跟着改;仓库里新的那份是给新装的人用的(拉镜像,不本地构建)。- 同一台机器想装第二个实例,名字和端口都得换:
TPBACKUP_NAME=tpbackup2 TPBACKUP_PORT=8090 bash install.sh。只换端口不换名字,会被当成同一个实例。 - 镜像标签:
0.2.3这样的数字标签固定版本,latest跟着默认分支走。
v0.2.2:大文件断了能接着传,报表数字不再算错
大文件传到一半断了,现在不用从第一片重来。另外修好了几处会把数字算错的地方。
新增
- 大文件可以接着传。16MB 以上的文件切成 8MB 一片慢慢发,传过的记在本地。网络断了、程序退出了,下次跑同一个任务会接着上次的会话传。能省多少要看是怎么断的:只是网断、程序还在跑,会当场记下进度,下次真能接着传;程序被强杀或者容器重启,只认每 256MB 记一次的那个点,所以 256MB 以下的文件实际上还是整个重传一遍,会话能接着用,分片从第一片重新开始。
- 自动化测试从 0 加到 35 个,跑在 CI 里。以前只有编译检查和语法检查,改一次上传逻辑只能上真机试。现在切片数对不对、排除规则生不生效、路径能不能越界、空文件算不算、过期的会话会不会清、复核结果准不准,都有测试看着。
修好的问题
- 推送后复核哈希,比错了对象。以前拿这次要推的全部文件去跟云端比,没传成功的也拉进来比,于是冒出「内容哈希不符」这种假错误,复核数还偏大。现在只比真正传上去的。
- 哈希复核没有大小上限。注释里写着超过 64MB 不比内容,代码里其实没做,大文件会整个读出来算哈希。现在按 64MB 卡住,跟目录同步那边一个标准。
- 核对云端文件时,只有推送这条没把大小写统一。目录同步和孤儿扫描早就转成小写再比了,推送还在用原始文件名。云端返回的名字和本地写法不一样时,就会报「云端未找到」,整轮判失败。现在三处一样。
- 目录同步的数字会算两遍。一个文件传成功了、但复核没过,它同时被算进成功和失败,两个数加起来比实际文件还多。现在从成功里扣掉。
升级前看一眼
- 可以直接覆盖升级。数据库会自己加一张表存上传进度,原来的任务、运行记录、令牌都不动。
- 不想用这个功能,把 TP_RESUME 设成 0 就退回整文件上传。阈值也能调,环境变量 TP_RESUME_MIN_SIZE,默认 16MB。
- 报表数字会变。之前那些「哈希不符」的假错误不会再出现。「成功 + 失败」可能不再等于文件总数,因为复核没过的只算失败一次,这是修好了,不是出新毛病。
- 大小写这一处,在日常使用里碰不到。联通云盘原样保留文件名大小写,正常传上去什么名字、读回来还是什么名字,所以这条只有测试能证明,真机上证明的是没把它搞坏。同样只有测试能证明的还有另外两处。
这一版在真实部署上跑过:120MB 传一半把容器停掉,重启后接着上次的会话传,传完下载回来和本地哈希一致;12MB 的下载回来哈希也一致;一条真实推送任务跑通;冒烟全过。
v0.2.1:修一批漏文件、算错数的问题
这一版没有新功能,都是修问题。改动来自把 v0.2.0 从头到尾逐行读一遍之后确认的清单。
修好的问题
- 排除规则对文件不起作用。界面上写的是「排除的目录 / 文件」,示例还给了 *.tmp,但程序只拿它排目录,文件一个都没排掉。现在目录和文件用同一份规则,跑完日志里会写明这次用了哪几条。
- 空文件两边处理相反。目录同步是悄悄跳过,日志上看不出来,.gitkeep 这种文件就这么丢了;脚本推送则是遇到一个空文件整批都不传,100 个文件里混一个就全废。现在目录同步单独计数并写日志,推送只把这一个记成失败,其余照传。
- 分片数少算了一片。20MB 的文件被切成 8MB + 12MB,8 到 16MB 的直接整包发一片。云盘目前收得下,但片数和实际对不上,服务端哪天较真就会变成小文件能传、大文件全挂。改成向上取整。
- 新建任务的路径校验只做了一半。以前只比字符串开头,/vol10 会被 /vol1 放过,软链接也能绕到目录外面;编辑任务完全不校验,还能改成跟别人重名。现在按真实路径比,新建和编辑共用一处,重名直接拒绝。
- 改任务名可能撞车。以前改名不查重名,撞上直接报 500。现在提前拦住。
- 令牌文件有个很短的 644 窗口。以前先换文件再改权限,中间有一瞬间谁都能读。改成先改临时文件的权限再换过去。
新增
- 孤儿扫描多了「含已排除」的视角。排除规则生效之后,以前传上去的 *.tmp 会被规则挡住,从孤儿清单里消失,可它还在占配额。现在可以专门扫一遍这些被规则藏起来的条目,仍然只列不删。
其他
- CI 的编译检查改成扫目录。以前是手写文件清单,漏了 app/orphans.py 这个文件。
- 云端占用那行注释写「6 小时缓存」,代码其实是 24 小时。按代码改了注释。
升级前看一眼
- 可以直接覆盖升级。任务配置、运行记录、令牌格式都没变。
- 任务里配了排除规则的要注意:升级后文件会真的开始被排掉,之前一直在传的 *.tmp 这类文件不再上传。这是本来该有的行为,不想这样的话,先把规则里管文件的那部分删掉。
- 大文件断点续传这一版没做,在 v0.2.2 里补上了。
v0.2.0:孤儿扫描、演练面板、网页换令牌
第一个正式版本。从这版起,每次发布都会写一份说明,说清楚改了什么、升级要不要动手。
新增
- 孤儿扫描:云端有、本地已经删掉的文件,可以扫出来看看。文件逐个列,目录只给整棵树的大小和文件数,只列清单,不删云端任何东西。
- 恢复演练:首页会显示上次演练时间、抽查几个、通过几个,超过 45 天没练会提醒。
- 演练加查内容:以前只比文件大小,现在大小对了还要比 SHA256,内容不一致算失败。云端没返回哈希时,以大小为准,不会误判。
- 网页里换令牌:不用再 SSH 进去改文件。粘上 access_token 和 refresh_token,保存前先连一次云盘,连得上才写入,连不上不动你原来的。
- README 换成三张实拍图。
修好的问题
- 演练卡片的「过期」提醒一直不出现。判断时间时用错了格式,报错又被吞掉,结果永远是「没过期」。
- 「多久算过期」两处对不上:面板按 35 天,巡检脚本按 45 天。统一成 45 天。
- README 里写着能「在界面浏览云端、取回文件」,其实这个入口早就删了。改成实际写法:取回走 /api/restore 接口,演练走 tools/drill.py。
升级前看一眼
- 可以直接覆盖升级。令牌文件格式没变,任务配置和运行记录都在。
- 升级后演练卡片先显示「暂无报告」,等下次 drill.py 跑完就有了。
- dir 模式是明文上传,云盘上能看到文件名和内容。密码库、证件这类东西请走 push 模式,先在宿主机打包加密再传。
- 仓库里只有源码和 Dockerfile,没有现成镜像。clone 下来执行 sudo docker compose up -d --build,几分钟能构建好。
这一版在真实部署上跑过:冒烟 10/10、每日巡检正常、演练 5/5 且哈希一致。