宝塔默认备份不支持--exclude参数,必须停用原生任务、改用自定义Shell脚本调用tar命令显式排除;排除路径需为相对路径且不带尾斜杠,验证须解压前检查归档内容。

backup.py 本身不支持 --exclude 参数,宝塔默认走的是全量打包逻辑,所以一碰到 uploads、runtime、cache 这类目录,备份体积就直接翻倍甚至更高——这不是配置问题,是设计限制。
宝塔原生备份无法加 exclude,必须用自定义 Shell 任务替代
你改 /www/server/panel/class/backup.py 搜索 tar -zcf 然后硬塞 --exclude=... 是无效的。宝塔在调用 tar 前会先构建临时路径列表,排除逻辑被绕过,最终仍会把整个网站目录打进去。
真正能生效的方式只有一种:停用宝塔自带的“网站备份”任务,改用 Shell 脚本 + 手动 tar 命令,并显式传入 --exclude。
- 进【计划任务】→ 添加新任务 → 类型选“Shell 脚本”
- 脚本内容类似:
cd /www/wwwroot && tar -zcf /mnt/backup/example.com_$(date +\%Y\%m\%d).tar.gz --exclude="example.com/runtime" --exclude="example.com/uploads" --exclude="example.com/cache" example.com
- 注意:所有
--exclude值必须是相对于tar当前工作目录(即/www/wwwroot)的相对路径,且末尾不带斜杠;写成/www/wwwroot/example.com/runtime/会失效 - 执行前先手动跑一遍命令加
-v(如tar -zcvf ...)确认哪些文件真被跳过了
哪些目录适合 exclude?别乱删导致恢复失败
不是所有“看着大”的目录都能随便跳过。有些目录删了备份能变小,但恢复时网站直接 500;有些则完全无影响,纯属缓存垃圾。
- 安全排除项(几乎可无脑加):
runtime/(ThinkPHP/Laravel)、storage/logs/(Laravel)、wp-content/cache/(WP Super Cache)、public/assets/(编译产物) - 谨慎排除项:
uploads/或wp-content/uploads/—— 如果你没单独备份媒体库或 CDN 没开启原图回源,这里删了就丢用户上传的图片 - 绝对不能 exclude:
wp-content/themes/、wp-content/plugins/、config.php、.env—— 这些是运行必需,排除后恢复等于重装 - 查证方法:进对应网站根目录,用
du -sh */ | sort -hr看哪几个子目录占空间最大,再结合框架文档确认用途
exclude 后如何验证备份真的没包含那些目录?
光看压缩包大小下降没用。常见假象是:tar 命令写了 --exclude,但路径写错或没生效,结果还是全打了进去,只是 gzip -1 压得快了点而已。
- 解压前检查:用
tar -ztvf /mnt/backup/example.com_20260417.tar.gz | grep "runtime\|cache",如果返回任何行,说明排除失败 - 更可靠方式:用
tar -tf列出全部路径,重定向到文件,再grep -v看是否真不含目标关键词:tar -tf /mnt/backup/example.com_20260417.tar.gz > list.txt && ! grep -q "runtime" list.txt && echo "OK"
- 别依赖宝塔“还原”按钮测试:它只校验文件头和 .tar.gz 后缀,不检查内部路径完整性
真正麻烦的不是加 --exclude,而是每次网站结构微调(比如换了个插件、加了个缓存目录),都得同步更新 Shell 脚本里的排除列表——漏一条,备份就悄悄胖回去。











