所有文章

bepasty 局域网版:手机友好的文件 / 文字分享,支持续传与浏览器端加密

王子豪 ·

bepasty 是一个老牌开源“文件版 pastebin”:上传任意文件或一段文字,得到一个短链接,别人打开就能预览、下载。我们在它的基础上做了一个面向家庭 / 小团队局域网的派生版,源码公开:

两者都沿用上游的 BSD-2-Clause 许可证。

文件列表:每项有下载、复制内容、重命名、删除和分享链接

解决什么问题

家里几台电脑、手机之间传东西,常见做法是发微信、AirDrop 或者网盘。它们各有毛病:微信压缩图片、有大小限制;AirDrop 只在苹果设备之间;网盘要登录、要走外网。

我想要的是:局域网里开一个网页,手机上点一下就能传、传完自动复制链接;大文件传到一半断了能接着传;中文文件名不乱码;偶尔有私密文件,能加个口令再分享。上游 bepasty 的存储、权限和预览框架很扎实,但界面是英文桌面风格,浏览器上传不能续传,中文文件名会被过滤掉。于是在它上面改。

适合:家里或办公室有一台常开的机器、想要一个自己掌控的“传文件 / 贴文字”小站的人。不适合直接暴露到公网(见文末“安全与限制”)。

哪些是上游的,哪些是我们改的

上游 bepasty 由 Thomas Waldmann 等人自 2014 年起维护(本派生基于 2026-07-29 的上游 master)。下面这些是上游原有的:文件系统存储(.meta + .data)、过期时间、权限模型(read/create/modify/delete/list/admin)、Pygments 代码高亮、图片 / 音视频 / PDF / asciinema 预览、多文件合集、REST API、命令行清理工具。

服务端我们加了 20 个提交(约 7300 行增、1000 行删),分几类:

界面

手机上的上传页:保留时长、加密开关、选文件或粘贴文字

传输

文件名与预览

Markdown 文件详情页,渲染预览

可选功能(默认关闭或可关)

命令行客户端(2 个提交):分块上传复用同一个 HTTP 连接(keep-alive);管道输入用 1 字节预读判断最后一块,正好是 1 MiB 整数倍的输入也能正确结束;上传失败返回非零退出码;兼容新旧 python-magic,以及没有 pwd 模块的平台;中文等非 ASCII 文件名按 UTF-8 发送。它不支持浏览器端加密和续传,走的是普通 REST 上传。

架构

安装和使用

服务端(需要 Python ≥ 3.11):

git clone https://github.com/erniu96/bepasty-server
python3 -m venv venv && venv/bin/pip install ./bepasty-server
cat > bepasty.conf <<'EOF'
STORAGE_FILESYSTEM_DIRECTORY = '/srv/bepasty/storage'
EOF
BEPASTY_CONFIG=$PWD/bepasty.conf venv/bin/bepasty-server --host 0.0.0.0 --port 5000
# 生产:BEPASTY_CONFIG=... gunicorn --bind 0.0.0.0:5000 bepasty.wsgi

然后用手机或电脑浏览器打开 http://<这台机器的 IP>:5000/。要用加密功能,需要在前面放一个 HTTPS 反代(Web Crypto 只在 HTTPS 或 localhost 下可用)。

命令行客户端:

git clone https://github.com/erniu96/bepasty-client-cli
cd bepasty-client-cli && python3 -m venv venv && venv/bin/pip install -r requirements.txt
PYTHON=venv/bin/python bash command.txt -u http://<服务器>:5000 report.pdf
tar c logs | PYTHON=venv/bin/python bash command.txt -u http://<服务器>:5000 -n logs.tar -L 1d

-L 设保留时长(30min、2d、1w、f 永久),-p 传口令(关闭免密码模式时)。客户端每块读 1 MiB、Base64 后请求体约 1.33 MiB,反代的请求体上限要放到 2 MiB 左右。

怎么验证过

这些测试覆盖的是协议和逻辑;加密大文件的 Service Worker 保存路径、iPhone Safari 上的原生保存,还没有在真机上逐一验收,不同浏览器的行为可能不同。

安全与已知限制