如何搭建自己的文件传输服务?一条Docker命令部署transfer.sh完整教程
【免费下载链接】transfer.shEasy and fast file sharing from the command-line.项目地址: https://gitcode.com/gh_mirrors/tr/transfer.sh
transfer.sh 是一款用 Go 语言编写的轻量级文件传输服务,让你在自己的服务器上实现"命令行传文件":curl一行命令上传,立刻拿到分享链接,无需注册账号、无需数据库。本教程将带你用一条 Docker 命令完成 transfer.sh 的自托管部署,几分钟内拥有私有化的文件分享站点。
transfer.sh 是什么?为什么值得自建?
公共的临时文件分享网站虽然好用,但文件存在别人服务器上,既不可控也不安全。transfer.sh 的设计初衷就是让你自己掌控传输服务:
- ⚡极速上手:纯命令行操作,一条
curl即可上传 - 📦四种存储后端:本地文件系统(local)、Amazon S3、Google Drive、Storj,代码见 server/storage/
- 🔒服务端加密:支持 AES256 密码加密,文件下载时自动解密
- ⏰灵活控制:可限制下载次数、设置自动过期天数
- 🛡️安全特性:IP 黑白名单、上传认证、限流,实现参考 server/ip_filter.go 与 server/server.go
- 🐳官方 Docker 镜像:一键部署,源码入口见 main.go 与 cmd/cmd.go
一条Docker命令部署transfer.sh
部署只需要一台安装了 Docker 的 Linux 服务器。官方镜像内置了默认监听端口8080(可在 Dockerfile 中确认),执行以下命令即可启动:
docker run --publish 8080:8080 dutchcoders/transfer.sh:latest --provider local --basedir /tmp/命令参数说明:
| 参数 | 含义 |
|---|---|
--publish 8080:8080 | 把容器 8080 端口映射到宿主机 |
--provider local | 使用本地文件系统作为存储后端 |
--basedir /tmp/ | 文件实际存放的目录 |
💡推荐:官方提供了
-noroot标签的镜像(以 UID/GID 5000 的普通用户运行),可缩小攻击面,生产环境建议使用:docker run --publish 8080:8080 dutchcoders/transfer.sh:latest-noroot --provider local --basedir /tmp/
镜像标签(tag)速查:
| 标签 | 说明 |
|---|---|
vX.Y.Z | 正式版本构建,生产环境首选 |
nightly | 每天午夜定时构建 |
edge | main 分支每次提交后构建 |
latest | 最新 CI 构建(可能包含未发布内容,不建议用于 WatchTower 等自动更新工具) |
三步验证你的文件传输服务
第 1 步:上传文件
在任意能访问服务器的机器上执行(把地址换成你的服务器 IP 或域名):
curl -v --upload-file ./hello.txt http://你的服务器IP:8080/hello.txt第 2 步:获取下载链接
命令成功后,终端会输出一个形如下面的链接:
http://你的服务器IP:8080/AbC123/hello.txt任何人拿到这个链接都可以下载文件,这就是你的文件分享链接。
第 3 步:删除文件
上传响应头里有一个X-Url-Delete字段,里面是带删除令牌的专用 URL。用DELETE请求即可删除文件:
curl -X DELETE http://你的服务器IP:8080/hello.txt/AbC123/hello.txt/PDw0NHPcqU实用配置:过期时间、下载次数与服务端加密
transfer.sh 支持通过 HTTP 请求头精细控制每个文件的"生命周期":
限制下载次数(Max-Downloads):
curl --upload-file ./hello.txt http://你的服务器IP:8080/hello.txt -H "Max-Downloads: 1"设置 1 天后自动删除(Max-Days):
curl --upload-file ./hello.txt http://你的服务器IP:8080/hello.txt -H "Max-Days: 1"服务端加密(X-Encrypt-Password)——只在自己的服务器上才值得用这个功能:
curl --upload-file ./hello.txt http://你的服务器IP:8080/hello.txt -H "X-Encrypt-Password: mysecret"下载时带上X-Decrypt-Password: mysecret请求头,服务端会自动解密后返回明文。完整用法示例可参考 examples.md。
进阶部署:持久化存储与 S3 后端
让文件重启后不丢失
上面示例中--basedir /tmp/里的文件会随容器删除而丢失。生产环境建议挂载数据卷,并配置自动清理策略:
docker run -d --name transfersh \ -p 8080:8080 \ -v /data/transfersh:/files \ dutchcoders/transfer.sh:latest-noroot \ --provider local --basedir /files \ --purge-days 3 --purge-interval 6--purge-days 3:文件保存 3 天后自动清除(对应PURGE_DAYS环境变量)--purge-interval 6:每 6 小时执行一次清理
接入 S3 兼容存储
如果文件量较大,可以把存储后端换成 S3(也兼容 MinIO 等自建对象存储),实现代码见 server/storage/s3.go:
docker run --publish 8080:8080 dutchcoders/transfer.sh:latest-noroot \ --provider s3 \ --aws-access-key YOUR_KEY --aws-secret-key YOUR_SECRET \ --bucket my-bucket --s3-region us-east-1使用 MinIO 时额外加上--s3-path-style参数。此外还支持 Google Drive 与 Storj 后端,参数说明全部在 README.md 的参数表中。
关键配置项速查
| 参数(环境变量) | 作用 |
|---|---|
PURGE_DAYS | 文件自动清除的天数 |
MAX_UPLOAD_SIZE | 最大上传大小(KB) |
RATE_LIMIT | 每分钟请求数限制 |
IP_WHITELIST/IP_BLACKLIST | IP 黑白名单 |
HTTP_AUTH_USER/HTTP_AUTH_PASS | 上传时强制 Basic 认证 |
FORCE_HTTPS+TLS_CERT_FILE | 强制 HTTPS(建议反代或配置证书) |
完整参数列表见 README.md。
用 shell 别名加速日常传输
把下面这行加入~/.bashrc,以后传输文件只需要transfer 文件名:
transfer() { curl --progress-bar --upload-file "$1" http://你的服务器IP:8080/$(basename "$1"); echo; }更多花样玩法(批量打包上传、加密备份数据库、邮件发送链接等)都整理在 examples.md 中;如果想把 transfer.sh 作为系统服务常驻运行,仓库还附带了 init 脚本模板 extras/transfersh。
常见问题排查
问:浏览器打不开http://服务器IP:8080?先确认防火墙/安全组放行了 8080 端口;容器内用docker logs查看服务是否报错。
问:容器重启后文件没了?说明没有挂载数据卷,请参照上面"持久化存储"一节加-v参数。
问:想要正式稳定版本?把镜像标签从latest换成具体的版本号,如dutchcoders/transfer.sh:vX.Y.Z。
至此,你已经拥有一套完全私有的文件传输服务:一条 Docker 命令部署、curl 一行命令上传、链接即分享。接下来可以按需开启加密与认证,把它变成团队内部的"私人网盘入口"。
【免费下载链接】transfer.shEasy and fast file sharing from the command-line.项目地址: https://gitcode.com/gh_mirrors/tr/transfer.sh
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考