特性 单文件 / 零依赖 分享链接管理 WebDAV 直连 分片上传 能力清单 获取与安装 部署与环境变量 HTTP 接口 部署注意事项
Go · 零第三方库 · 无运行时依赖 内置 WebDAV · 分块上传 · 分享链接

把文件服务塞进一个可执行文件。

目录设置、上传、删除、带 token 的限时限次分享链接——全部编译进同一个二进制。前端经 //go:embed 打进程序里,拷到服务器上 chmod +x 就能跑。

8 个平台产物 · linux amd64 / arm64 / armv7 / armv5 / 386 / mipsle · windows / darwin

bash — install-remote.sh
# 一条命令安装:识别架构 → 下载 → 放行防火墙 → 注册 systemd $ curl -fsSL https://raw.githubusercontent.com/Zlion-Y/fileserver/main/install-remote.sh \ -o install-remote.sh $ sudo bash install-remote.sh --dry-run ▸ 检测架构 linux/amd64 ▸ 目标版本 latest release ▸ 安装路径 /usr/local/bin/fileserver ▸ 数据目录 /var/lib/fileserver $ sudo FS_USER=admin FS_PASS=你的密码 bash install-remote.sh 已注册 systemd:fileserver.service 服务已启动 → http://192.168.5.20:16666 日志:journalctl -u fileserver -f

配置位于 /etc/fileserver.env,改完 systemctl restart fileserver 生效

可与现有生态直接搭配

核心能力

为自建场景写的文件服务,不做多余的事。

没有数据库、没有消息队列、没有外部配置中心。一个二进制、一个数据目录、一个文件根目录,就是全部依赖面。

单文件分发

Go 实现,零第三方库。scp 一个文件过去,chmod +x,直接运行。不需要装运行时,不需要解压目录树。

限时限次分享

一键生成带 token 的直链。有效期、下载次数、访问密码、Referer 防盗链、自定义尾段别名,逐条独立控制。

流式大文件上传

multipart 逐 part 直写目标目录,不经系统临时盘。≥8MB 自动分片断点续传,中断后只补缺失分片。

WebDAV 直连

/dav/ 挂到文件根目录,Class 1 全动词。播放器与文件管理器可以直连流式播放,支持 Range。

一键自更新

服务端代理查询 GitHub Release,自动匹配架构下载、校验、原子替换并重启。连不上 GitHub 时可手动上传更新包。

回收站保护

删除先进回收站(同盘原子 rename),可逐条或批量恢复。超过保留天数自动清理,设为 0 则永久保留。

单文件 · 零依赖

没有配置文件树,也没有依赖地狱。

前端静态资源经 //go:embed 编译进二进制,路由、模板、图标、PWA manifest 全在里面。部署动作退化成一次文件拷贝。

1 个文件

二进制自带全部前端资源,不需要额外的 dist 目录或静态站点挂载。

0 个第三方库

仅使用 Go 标准库。没有间接依赖,也就没有供应链更新焦虑。

8 个平台产物

覆盖 armv5 这类老设备,也覆盖 amd64 与 arm64 的主流服务器。

2 个目录

一个文件根目录,一个数据目录(config.json / shares.json / sessions.json)。

进程模型直白到可以画在一张纸上

单进程 HTTP 服务,文件读写直接落到本地磁盘,元数据落 JSON。没有中间层,出问题时 journalctl -u fileserver -f 就是全部可观测面。

# 一个二进制,跑起来只需要三个参数 $ sudo curl -fsSL -o /usr/local/bin/fileserver \ https://github.com/Zlion-Y/fileserver/releases/latest/download/fileserver_linux_amd64 $ sudo chmod +x /usr/local/bin/fileserver $ sudo /usr/local/bin/fileserver --port 16666 --dir /data/files \ --data-dir /var/lib/fileserver --user admin --pass 你的密码 fileserver listening on 0.0.0.0:16666 root dir → /data/files data dir → /var/lib/fileserver # 也可以交给一键脚本,它会识别 amd64 / arm64 / armv7 / armv5 / mipsle / 386 $ sudo FS_USER=admin FS_PASS=你的密码 bash install-remote.sh
功能深潜 · 分享链接

每条链接都有自己的访问边界。

分享不是一个开关,而是一组可以逐条配置的策略:多久失效、能被下几次、要不要密码、允不允许外站引用、尾段好不好看。

有效期与次数,精确到条

有效期可选 1 小时到 30 天、永久,或指定一个自定义时刻;下载次数可选 1 / 5 / 20 / 不限,也可手填。每条分享互不影响。

  • 分享密码 PBKDF2 哈希校验,AES-GCM 加密存储,管理端可查看与复制
  • 自定义别名:/s/发布会-materials,中英文 / 数字 / - / _ 均可用
  • Referer 防盗链按分享独立开关,不写成全局策略
  • 分享文件夹走流式打包 ZIP,边压缩边传输,不占服务器磁盘
  • 二维码纯前端生成,不借助任何外部服务
分享链接管理 左侧为分享编辑表单,右侧为二维码与访问记录摘要。 新建分享 /s/发布会-materials 有效期 24 小时 永久 自定义时刻… 下载次数 1 5 20 不限 · 访问密码 · 防盗链 生成链接 扫码即下 最近 30 天下载

每条分享都留访问记录

每条分享在条目内保存最近 50 次访问,记录 IP、UA、成功或失败以及失败原因;同时提供最近 30 天的下载 / 失败趋势图,由客户端 canvas 绘制。

  • 按 全部 / 有效 / 已过期 / 带密码 / 直链 筛选,支持批量撤销
  • 条目内快速编辑有效期与次数,无需重建链接
  • 后台每小时清理过期分享,保留时长与开关可在网页配置
  • 创建接口严格解码 JSON:把 expireSeconds 写成 expireHours 会直接 400,不会静默变成永久链接
分享列表与访问记录 表格每行一条分享,展开后显示最近的访问 IP 与用户代理。 全部 · 有效 · 已过期 · 带密码 · 直链 全部 有效 已过期 带密码 /s/发布会-materials 24h · 20 次 · 密码 有效 /s/beta-build 7d · 不限 · 防盗链 有效 /s/blueprints.zip 1h · 1 次 · 直链 已过期 访问记录 · 最近 50 次 192.168.5.20 · Safari · 成功 10.0.0.7 · curl · 失败 · 次数已用尽 203.0.113.9 · Chrome · 失败 · Referer 校验不通过
功能深潜 · WebDAV

播放器直连,不需要下载到本地。

/dav/ 挂到文件根目录,认证与管理端一致,响应内联 Content-Type 并支持 Range,因此可以边拉边播、拖动进度。

WebDAV Class 1 · 已实现动词
动词用途状态
PROPFIND列目录、取属性支持
GET / HEAD读取与元信息,内联 Content-Type + Range支持
PUT写入文件支持
MKCOL建目录支持
DELETE删除支持
MOVE移动 / 重命名支持
PROPPATCH写属性支持
LOCK / UNLOCK资源锁定(Class 2)未实现
# 挂载地址 http://<主机>:<端口>/dav/ # 认证方式与管理端一致(登录会话或 Basic) # 响应内联 Content-Type,支持 Range,可流式播放
Salt Player foobar2000 移动端文件管理器

两处已知边界

未实现 LOCK / UNLOCK,因此不是 Class 2;Windows 的“映射网络驱动器”依赖 Class 2 的锁定语义,无法直接挂载。播放器与移动端文件管理器不受影响。

功能深潜 · 上传

字节直接落到目标目录,不经临时盘。

multipart 逐 part 边读边写,服务器不需要为一次上传预留等量临时空间。大文件自动分片,中断之后只补缺失的那几片。

流式写入

multipart 的每个 part 直接写进目标目录,不落系统临时盘。磁盘占用与文件体积一一对应。


分片断点续传

单文件 ≥8MB 自动切分。上传失败后重试只补缺失分片,不必从头再来。


拖拽与文件夹

支持拖拽多个文件,也支持拖入整个文件夹按目录结构上传。


超限即断

超过 MAX_UPLOAD_MB 时立即中断、删除半成品并返回 413,不留残缺文件。

同名文件不覆盖:以追加 (1)、(2) 后缀的方式排他创建,并发上传落到不同文件名。

分片上传进度 展示一个 3.2GB 文件的整体进度条,以及 12 个分片的完成状态网格。 backup-2026.tar.zst 3.2 GB · 分片 8 MB · 已用 412 / 412 87% · 断点续传已恢复 3 个缺失分片 分片状态 落盘路径 /data/files/backup/backup-2026.tar.zst 中转路径 无(multipart 逐 part 直写,不占临时盘)
完整能力清单

按模块摊开,逐条可查。

下面这些不是路线图,是当前版本已经跑在服务上的行为。

上传与文件管理

01
  • 服务端目录树选择器,设好 ROOT_DIR 后跳过首次配置
  • 拖拽多文件上传,也支持拖入整个文件夹保持目录结构
  • ≥8MB 自动分片断点续传,失败只补缺失分片
  • multipart 逐 part 直写目标目录,不经系统临时盘
  • 同名文件追加 (1)、(2) 后缀,排他创建,并发不覆盖
  • 重命名即输入含子目录的完整相对路径
  • 全盘递归搜索,结果条数由 SEARCH_LIMIT 控制(上限 1000)
  • 分页拉取(每页 500 项)+ 前端虚拟滚动,万级目录只渲染可见行
  • 排序 / 类型 / 大小筛选全部服务端化
  • 多选打包流式 ZIP 下载,边压缩边传输不占磁盘
  • 大小显示、HTTP Range 断点续传

分享与统计

02
  • 有效期 1 小时 ~ 30 天 / 永久 / 自定义时刻
  • 下载次数 1 / 5 / 20 / 不限 / 自定义
  • 分享密码 PBKDF2 哈希校验,AES-GCM 加密存储
  • 自定义别名尾段,中英文 / 数字 / - / _ 可用
  • Referer 防盗链,按分享独立开关
  • 分享文件夹以流式打包 ZIP 下发
  • 二维码纯前端生成,不请求外部服务
  • 按 全部 / 有效 / 已过期 / 带密码 / 直链 筛选,支持批量撤销
  • 每条分享记录最近 50 次访问(IP / UA / 成败 / 失败原因)
  • 最近 30 天下载与失败趋势图,canvas 客户端绘制
  • 后台每小时清理过期分享,保留时长与开关可网页配置

协议与集成

03
  • WebDAV /dav/ 挂载根目录,Class 1 全动词
  • WebDAV 响应内联 Content-Type + Range,播放器流式播放
  • Basic 认证兼容 curl 与各类脚本
  • 协议自动识别,也可强制 HTTP / HTTPS
  • 一律严格 JSON 解码:字段拼错或出现未知字段即 400 并回显原因
  • PWA manifest + SVG 图标,可添加到主屏幕
  • 深色模式、偏好记忆、/ 快捷键聚焦搜索
  • 图片相册缩略图网格;音视频在线播放支持拖动
  • 文本文件预览,超过 2MB 只显示开头
  • GET /healthz 健康检查

安全与会话

04
  • 登录页 + HttpOnly Cookie 会话,默认 7 天(SESSION_DAYS 可调)
  • 查看活跃会话(IP / 登录时间),可踢出其他会话
  • 网页直接修改管理员密码
  • 同 IP 5 分钟内失败满 10 次即封禁 15 分钟
  • 路径参数做根目录越权校验,../ 无法逃逸
  • 反代场景 TRUST_PROXY=1 后,仅环回 / 内网来源才采信 X-Forwarded-For
  • 删除进回收站(同盘原子 rename),可逐条或批量恢复
  • 回收站超保留天数自动清理,TRASH_DAYS=0 表示永久保留
  • 超过 MAX_UPLOAD_MB 立即中断、删除半成品并返回 413
  • 页脚显示磁盘已用 / 剩余,日志开关可控

更新与运维

05
  • 一键自更新:服务端代理查询 GitHub Release
  • 自动匹配当前架构下载二进制,校验后原子替换并重启
  • 服务器连不上 GitHub 时,可手动上传更新包(字段名 file,上限 256MB)
  • GET /api/selfupdate 查询更新任务状态
  • GET /api/version 返回 goos / goarch 与 Release 直链
  • 命令行参数与环境变量同名,命令行优先
  • 访问日志开关 LOG,配合 TRUST_PROXY 防伪造

构建与分发

06
  • 8 平台产物:linux amd64 / arm64 / armv7 / armv5 / 386 / mipsle
  • windows_amd64.exe 与 darwin_arm64
  • 前端经 //go:embed 编译进二进制,无外部静态目录
  • bash build.sh 一次编译全部平台到 dist-go/
  • bash build.sh linux/amd64 linux/arm/5 只编译指定平台
  • Docker 多阶段构建,数据落 ./files 与 ./data
  • 一键脚本自动放行防火墙并注册 systemd
  • 零第三方库,仅依赖 Go 标准库
获取与安装

四种路径,任选其一。

服务器上一键脚本最省事,想自己控制就用 Release 二进制、本机编译或 Docker。

自动识别架构(amd64 / arm64 / armv7 / armv5 / mipsle / 386),从 Release 下载、放行防火墙、注册 systemd 开机自启。先跑一次 --dry-run 可以只预览不落盘。

# 1. 下载脚本 curl -fsSL https://raw.githubusercontent.com/Zlion-Y/fileserver/main/install-remote.sh -o install-remote.sh # 2. 预演,只看它会做什么 sudo bash install-remote.sh --dry-run # 3. 正式安装 sudo FS_USER=admin FS_PASS=你的密码 bash install-remote.sh
DIR=/mnt/disk/share PORT=9000 VERSION=latest --uninstall 配置 /etc/fileserver.env 日志 journalctl -u fileserver -f

8 个平台产物已在 Release 里备好,直接取当前架构对应的文件即可。下面的三行以 linux_amd64 为例。

# 产物清单 fileserver_linux_amd64 fileserver_linux_arm64 fileserver_linux_armv7 fileserver_linux_armv5 fileserver_linux_386 fileserver_linux_mipsle fileserver_windows_amd64.exe fileserver_darwin_arm64 # 手动部署三行 sudo curl -fsSL -o /usr/local/bin/fileserver \ https://github.com/Zlion-Y/fileserver/releases/latest/download/fileserver_linux_amd64 sudo chmod +x /usr/local/bin/fileserver sudo /usr/local/bin/fileserver --port 16666 --dir /data/files \ --data-dir /var/lib/fileserver --user admin --pass 你的密码

需要本机装有 Go 工具链。build.sh 会交叉编译并把产物收进 dist-go/。

# 全平台编译 → dist-go/ bash build.sh # 只编译指定平台 bash build.sh linux/amd64 linux/arm/5

多阶段构建,数据落在 ./files 与 ./data。默认只监听 127.0.0.1:16666,由 Nginx / Caddy 反代对外。

# 准备配置 cp .env.example .env # 启动 docker compose up -d
./files → ROOT_DIR ./data → DATA_DIR 127.0.0.1:16666
部署与配置

命令行参数与环境变量同名,命令行优先。

启动参数 --port --host --dir --data-dir --user --pass --trust-proxy --max-upload-mb --log 与同名环境变量一一对应;一键脚本写入的配置在 /etc/fileserver.env

默认监听

# 程序默认 0.0.0.0:8080 # 部署脚本默认(仅本机,由反代对外) 127.0.0.1:16666

配置生效方式

# 改配置 sudo vi /etc/fileserver.env sudo systemctl restart fileserver # 看日志 journalctl -u fileserver -f

完整环境变量

同名命令行参数优先于环境变量
变量默认值说明
PORT8080(脚本 16666)监听端口
HOST0.0.0.0监听地址
ROOT_DIR预设文件根目录,设置后无需网页首次配置
DATA_DIR./data存 config.json / shares.json / sessions.json,必须持久化
TRUST_PROXY0置于反代之后必须设为 1,否则分享链接会生成成 http://127.0.0.1:16666/...;开启后仅环回 / 内网来源才采信 X-Forwarded-For
AUTH_USER / AUTH_PASS管理端账号密码,公网部署必须设置
SESSION_DAYS7登录会话有效期(天)
TIDY_HOURS72分享过期后记录保留时长(小时)
TRASH_DAYS7回收站保留天数,0 = 永久保留
SEARCH_LIMIT200全盘搜索最多返回条数,上限 1000
MAX_UPLOAD_MB0单文件大小上限(MB),0 = 不限
LOG1访问日志开关
HTTP 接口

所有界面操作都走同一套接口。

全部 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健康检查
部署注意事项

上生产前请核对这几条。

shares.json 必须持久化

分享记录写在 DATA_DIR 下的 shares.json。容器重建时若该目录没有挂载持久卷,已有的分享链接会全部失效。

反代必开 TRUST_PROXY=1

否则生成的链接会变成 http://127.0.0.1:16666/...。开启后仅当直连来源为环回 / 内网地址时才采信 X-Forwarded-For,端口直接暴露公网时伪造 XFF 无效。

Nginx 需放开两处

client_max_body_size 设置 0,并关闭 proxy_buffering,否则大文件上传会被中间层截断或缓冲进磁盘。

公网部署必须设账号密码

AUTH_USER / AUTH_PASS 未设置时管理端不设防,任何人都能改根目录、上传或删除文件。

自更新依赖 GitHub 可达

服务端需要能代理访问 GitHub Release。内网环境直连不通时,改用管理端手动上传更新包。

删除是先进回收站的

删除会进入 <根目录>/.trash/,保留期内可在回收站页恢复;执行彻底删除后不可恢复。

零第三方库 · 无运行时依赖

一个文件,拷过去就能用。

从 armv5 到 amd64 的 8 个平台产物已经备好,前端资源全部嵌在二进制里,不需要额外的运行时目录。

安装脚本与全部平台产物见 Release 页面