目录设置、上传、删除、带 token 的限时限次分享链接——全部编译进同一个二进制。前端经 //go:embed 打进程序里,拷到服务器上 chmod +x 就能跑。
8 个平台产物 · linux amd64 / arm64 / armv7 / armv5 / 386 / mipsle · windows / darwin
配置位于 /etc/fileserver.env,改完 systemctl restart fileserver 生效
可与现有生态直接搭配
没有数据库、没有消息队列、没有外部配置中心。一个二进制、一个数据目录、一个文件根目录,就是全部依赖面。
Go 实现,零第三方库。scp 一个文件过去,chmod +x,直接运行。不需要装运行时,不需要解压目录树。
一键生成带 token 的直链。有效期、下载次数、访问密码、Referer 防盗链、自定义尾段别名,逐条独立控制。
multipart 逐 part 直写目标目录,不经系统临时盘。≥8MB 自动分片断点续传,中断后只补缺失分片。
把 /dav/ 挂到文件根目录,Class 1 全动词。播放器与文件管理器可以直连流式播放,支持 Range。
服务端代理查询 GitHub Release,自动匹配架构下载、校验、原子替换并重启。连不上 GitHub 时可手动上传更新包。
删除先进回收站(同盘原子 rename),可逐条或批量恢复。超过保留天数自动清理,设为 0 则永久保留。
前端静态资源经 //go:embed 编译进二进制,路由、模板、图标、PWA manifest 全在里面。部署动作退化成一次文件拷贝。
二进制自带全部前端资源,不需要额外的 dist 目录或静态站点挂载。
仅使用 Go 标准库。没有间接依赖,也就没有供应链更新焦虑。
覆盖 armv5 这类老设备,也覆盖 amd64 与 arm64 的主流服务器。
一个文件根目录,一个数据目录(config.json / shares.json / sessions.json)。
单进程 HTTP 服务,文件读写直接落到本地磁盘,元数据落 JSON。没有中间层,出问题时 journalctl -u fileserver -f 就是全部可观测面。
分享不是一个开关,而是一组可以逐条配置的策略:多久失效、能被下几次、要不要密码、允不允许外站引用、尾段好不好看。
有效期可选 1 小时到 30 天、永久,或指定一个自定义时刻;下载次数可选 1 / 5 / 20 / 不限,也可手填。每条分享互不影响。
/s/发布会-materials,中英文 / 数字 / - / _ 均可用每条分享在条目内保存最近 50 次访问,记录 IP、UA、成功或失败以及失败原因;同时提供最近 30 天的下载 / 失败趋势图,由客户端 canvas 绘制。
把 /dav/ 挂到文件根目录,认证与管理端一致,响应内联 Content-Type 并支持 Range,因此可以边拉边播、拖动进度。
| 动词 | 用途 | 状态 |
|---|---|---|
| PROPFIND | 列目录、取属性 | 支持 |
| GET / HEAD | 读取与元信息,内联 Content-Type + Range | 支持 |
| PUT | 写入文件 | 支持 |
| MKCOL | 建目录 | 支持 |
| DELETE | 删除 | 支持 |
| MOVE | 移动 / 重命名 | 支持 |
| PROPPATCH | 写属性 | 支持 |
| LOCK / UNLOCK | 资源锁定(Class 2) | 未实现 |
未实现 LOCK / UNLOCK,因此不是 Class 2;Windows 的“映射网络驱动器”依赖 Class 2 的锁定语义,无法直接挂载。播放器与移动端文件管理器不受影响。
multipart 逐 part 边读边写,服务器不需要为一次上传预留等量临时空间。大文件自动分片,中断之后只补缺失的那几片。
multipart 的每个 part 直接写进目标目录,不落系统临时盘。磁盘占用与文件体积一一对应。
单文件 ≥8MB 自动切分。上传失败后重试只补缺失分片,不必从头再来。
支持拖拽多个文件,也支持拖入整个文件夹按目录结构上传。
超过 MAX_UPLOAD_MB 时立即中断、删除半成品并返回 413,不留残缺文件。
同名文件不覆盖:以追加 (1)、(2) 后缀的方式排他创建,并发上传落到不同文件名。
下面这些不是路线图,是当前版本已经跑在服务上的行为。
/dav/ 挂载根目录,Class 1 全动词/ 快捷键聚焦搜索../ 无法逃逸//go:embed 编译进二进制,无外部静态目录服务器上一键脚本最省事,想自己控制就用 Release 二进制、本机编译或 Docker。
自动识别架构(amd64 / arm64 / armv7 / armv5 / mipsle / 386),从 Release 下载、放行防火墙、注册 systemd 开机自启。先跑一次 --dry-run 可以只预览不落盘。
8 个平台产物已在 Release 里备好,直接取当前架构对应的文件即可。下面的三行以 linux_amd64 为例。
需要本机装有 Go 工具链。build.sh 会交叉编译并把产物收进 dist-go/。
多阶段构建,数据落在 ./files 与 ./data。默认只监听 127.0.0.1:16666,由 Nginx / Caddy 反代对外。
启动参数 --port --host --dir --data-dir --user --pass --trust-proxy --max-upload-mb --log 与同名环境变量一一对应;一键脚本写入的配置在 /etc/fileserver.env。
默认监听
配置生效方式
完整环境变量
| 变量 | 默认值 | 说明 |
|---|---|---|
| PORT | 8080(脚本 16666) | 监听端口 |
| HOST | 0.0.0.0 | 监听地址 |
| ROOT_DIR | 无 | 预设文件根目录,设置后无需网页首次配置 |
| DATA_DIR | ./data | 存 config.json / shares.json / sessions.json,必须持久化 |
| TRUST_PROXY | 0 | 置于反代之后必须设为 1,否则分享链接会生成成 http://127.0.0.1:16666/...;开启后仅环回 / 内网来源才采信 X-Forwarded-For |
| AUTH_USER / AUTH_PASS | 无 | 管理端账号密码,公网部署必须设置 |
| SESSION_DAYS | 7 | 登录会话有效期(天) |
| TIDY_HOURS | 72 | 分享过期后记录保留时长(小时) |
| TRASH_DAYS | 7 | 回收站保留天数,0 = 永久保留 |
| SEARCH_LIMIT | 200 | 全盘搜索最多返回条数,上限 1000 |
| MAX_UPLOAD_MB | 0 | 单文件大小上限(MB),0 = 不限 |
| LOG | 1 | 访问日志开关 |
全部 POST 严格解码 JSON:字段名拼错、出现未知字段一律返回 400 并回显原因。把 expireSeconds 写成 expireHours 不会静默变成一个永久链接。
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /api/state | 初始化状态与快捷目录 |
| POST | /api/config | 设置 / 修改根目录 |
| GET | /api/browse?path= | 服务端目录树,选目录用 |
| GET | /api/list?path= | 文件列表,含 offset / limit / sort / filter / size;带 limit 时返回 total 与 hasMore |
| POST | /api/mkdir?path= | 新建文件夹 |
| POST | /api/upload?path= | multipart 上传,字段名 files |
| DELETE | /api/item?path= | 删除文件或目录(进回收站) |
| GET | /api/download?path= | 下载文件,支持 Range |
| POST | /api/zip | 多选打包流式 ZIP,请求体 {"paths":["a.txt","dir"]} |
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /api/share | 创建分享:path / expireSeconds / maxDownloads / scheme / host |
| GET | /api/shares | 分享列表 |
| DELETE | /api/share?token= | 撤销分享 |
| GET | /s/:token | 分享下载,文件夹返回流式 ZIP |
| GET | /api/trash | 回收站列表 |
| POST | /api/trash/restore | 恢复条目 |
| POST | /api/trash/purge | 彻底删除条目 |
| POST | /api/trash/clear | 清空回收站 |
| GET | /api/version | 含 goos / goarch 与 Release 直链 |
| POST | /api/selfupdate | 一键自更新,或手动上传更新包(multipart 字段 file,上限 256MB) |
| GET | /api/selfupdate | 查询更新任务状态 |
| 任意 | /dav/* | WebDAV 挂载根目录 |
| GET | /healthz | 健康检查 |
分享记录写在 DATA_DIR 下的 shares.json。容器重建时若该目录没有挂载持久卷,已有的分享链接会全部失效。
否则生成的链接会变成 http://127.0.0.1:16666/...。开启后仅当直连来源为环回 / 内网地址时才采信 X-Forwarded-For,端口直接暴露公网时伪造 XFF 无效。
client_max_body_size 设置 0,并关闭 proxy_buffering,否则大文件上传会被中间层截断或缓冲进磁盘。
AUTH_USER / AUTH_PASS 未设置时管理端不设防,任何人都能改根目录、上传或删除文件。
服务端需要能代理访问 GitHub Release。内网环境直连不通时,改用管理端手动上传更新包。
删除会进入 <根目录>/.trash/,保留期内可在回收站页恢复;执行彻底删除后不可恢复。
从 armv5 到 amd64 的 8 个平台产物已经备好,前端资源全部嵌在二进制里,不需要额外的运行时目录。
安装脚本与全部平台产物见 Release 页面