我的局域网 文件分享工具
给 dufs 换个现代皮肤:一个支持 7 天自动过期的自托管文件分享页
适合人群:家里有 NAS / 服务器 / VPS,平时想临时分享文件,又不想折腾复杂网盘系统的朋友。
最近我在折腾一个很小的自托管文件分享页。需求其实很简单:
局域网内有个临时文件需要在其它设备下载;
页面不要太“上古目录索引”;
支持上传、删除、搜索、打包下载;
临时分享的文件最好能自动过期,免得越堆越多;
部署方式要轻量,最好 Docker Compose 一把梭。
原本 dufs 已经非常适合这个场景:单文件、轻量、支持上传下载和 WebDAV。但默认界面比较朴素,所以我基于它做了一个小项目:dufs-modern-share。
项目地址:https://github.com/j1111011/dufs-modern-share
先看效果
默认 dufs 效果
修复后的效果图整体风格做成了更接近现代 Web 应用的感觉:卡片布局、柔和渐变、玻璃拟态、移动端适配,还支持暗色模式。默认界面是中文,也可以通过一个配置变量切换成英文。
为什么选 dufs?
如果只是临时分享文件,我个人不太想上复杂网盘系统。很多网盘/文件管理器功能当然强,但也意味着:
服务更重;
配置项更多;
权限、数据库、反代、缓存都可能要照顾;
只是分享一个文件时显得有点“杀鸡用牛刀”。
dufs 的优点是足够直接:指定一个目录,它就能把这个目录变成一个可访问的文件服务。
它本身支持:
文件/文件夹浏览;
上传文件和文件夹;
删除、移动、重命名;
搜索;
文件夹打包下载;
在线编辑文本文件;
WebDAV;
基础认证;
自定义前端 assets。
最后一点很关键:它支持 --assets 覆盖内置前端资源,所以不需要 fork Rust 后端,也不需要重新编译 dufs,就能换页面。
这个项目做了什么?
dufs-modern-share 主要做了两类增强。
1. 给 dufs 换了现代 UI
相比默认目录页,新的界面做了这些调整:
顶部工具栏改成玻璃拟态卡片;
文件列表更清爽,hover 状态更明显;
首页增加文件数、文件夹数、总大小统计;
增加“几天后过期”的小徽标;
默认中文化;
支持暗色模式;
移动端下表格会变成更适合小屏幕的卡片式展示。
2. 增加 7 天自动过期清理
dufs 本身负责文件服务,不负责生命周期管理。所以我额外写了一个独立清理脚本:
默认保留 7 天;
按文件修改时间 mtime 判断是否过期;
默认 dry-run,不会直接删除;
加 --delete 才会真正删除;
可选清理空目录;
默认跳过隐藏文件、隐藏目录和符号链接;
会拒绝 /、用户 home 等危险根目录,减少误删风险。
这样前端负责提示“几天后过期”,后端用脚本定时清理,逻辑比较简单,也不影响 dufs 本体。
Docker Compose 部署
如果你已经有 Docker,部署基本就是几行:
git clone https://github.com/j1111011/dufs-modern-share.git cd dufs-modern-share cp .env.example .env mkdir -p share docker compose up -d dufs
默认访问:
http://localhost:3002/
如果部署在 NAS 或服务器上,把 localhost 换成对应 IP 或域名即可。
配置文件
.env.example 里主要是这些配置:
SHARE_DIR=./share ASSETS_DIR=./assets HOST=0.0.0.0 PORT=3002 RETENTION_DAYS=7 DUFS_ALLOW_FLAGS=--allow-upload --allow-delete --allow-search --allow-archive DUFS_EXTRA_ARGS= EXPIRE_INCLUDE_HIDDEN=false EXPIRE_EMPTY_DIRS=true
如果想让 dufs 开放全部操作,可以把权限参数改成:
DUFS_ALLOW_FLAGS=-A
如果你只想开放上传,不允许别人删除,也可以按 dufs 的参数自己组合。
切换英文界面
默认是中文。如果想换成英文,改 assets/config.js:
window.DUFS_LANGUAGE = window.DUFS_LANGUAGE || "en";
支持值:
zh:中文;
en:英文。
手动跑一次过期清理
先预览,不删除:
python3 scripts/expire_dufs_files.py ./share --days 7
确认没问题后再删除:
python3 scripts/expire_dufs_files.py ./share --days 7 --delete --empty-dirs
Docker Compose 方式也可以直接跑:
docker compose --profile tools run --rm expire
定时清理
比如用 cron 每小时跑一次:
0 * * * * /opt/dufs-modern-share/scripts/run-expire.sh >> /var/log/dufs-expire.log 2>&1
项目里也放了 systemd service/timer 示例,适合 Linux 服务器长期跑。
如果你已经在用 dufs
如果你本来就有 dufs,只想换界面,可以直接加 --assets:
dufs ./share -b 0.0.0.0 -p 3002 -A --assets ./assets
也就是说,它不是一个替代 dufs 的复杂系统,更像是 dufs 的一个现代化前端皮肤 + 自动清理工具。
适合哪些场景?
我觉得比较适合这些情况:
家庭 NAS 临时文件中转;
局域网内传文件;
小团队临时上传/下载资料;
不想搭完整网盘,但又嫌默认目录索引太丑;
想让分享文件默认自动过期。
不太适合的场景:
需要复杂用户体系;
需要精细权限和审计;
需要相册、同步盘、版本管理等完整网盘能力;
要做长期文件归档。
这类需求还是建议上更完整的文件管理/网盘系统。
一些注意点
<#&!153#&!>过期规则基于 mtime
如果上传的文件保留了很早以前的修改时间,可能会更快被判定为过期。
公开到公网前建议加认证
dufs 支持基础认证,公网环境不要裸奔。可以结合反向代理、HTTPS、访问控制一起用。
删除脚本先 dry-run
第一次部署建议先不加 --delete,确认输出符合预期后再开启真正删除。
它仍然是轻量分享工具
不要把它当成完整网盘系统,定位清楚会更好用。
总结
这次改造的核心思路是:不要把简单事情复杂化。
dufs 已经把文件服务做得很轻量了,我只是基于 --assets 做了一个更现代的中文界面,再补一个 7 天自动过期清理器。对于“临时分享文件”这个需求来说,已经足够顺手。
项目地址再放一次:
https://github.com/j1111011/dufs-modern-share
如果你家里有 NAS、软路由、小主机或者 VPS,想搭一个轻量的临时文件分享页,可以试试看。
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~
