# 用 Go + Cloudflare R2 自建移动应用分发站,支持 APK / IPA 及大文件上传
闲着没事想搭个自己用的文件分享站,各种云盘要么限速要么强制登录,干脆自己撸一个。
本来只是想上传普通文件,后来顺手把 Android APK 和 iOS IPA 也支持进去了,
图片、视频、文档这些格式也一并加上,就成了现在这个「云传」。
## 技术栈
- Go + Gin:后端主框架,路由清晰,性能够用
- SQLite + GORM:元数据存储,单文件、零运维,够用就好
- Cloudflare R2:对象存储,S3 兼容接口,无出站流量费用
部署用 Docker Compose,SQLite 文件挂载到 named volume,R2 配置通过环境变量注入,
敏感信息不入库。
## 几个值得一提的细节
大文件上传:R2 的 PutObject 对大文件容易超时,超过 100MB 的文件自动切换
S3 分片上传,每片 128MB,3 路并发,实测稳定。
下载加速:配置了 R2 公共域名(R2_PUBLIC_URL)后,下载直接 302 跳转到
Cloudflare CDN 边缘节点,绕开服务器带宽瓶颈;没配就走 24 小时预签名 URL,中断可续传。
文件安全:上传时双重校验——先白名单扩展名,再读取文件头的 magic bytes 验证内容
是否对得上,防止改后缀伪装上传。APK 额外用 apkparser 解析包名、版本号和图标;
IPA 同样作为独立类型处理,自动提取 Info.plist 中的 Bundle ID 和版本信息。
下载密码:bcrypt 存储,暴力破解有 IP + 短码维度的频率限制。验证通过后颁发
HMAC-SHA256 签名 cookie,10 分钟有效,每次进下载页都强制重新输入。
短链:随机生成 base62 短码,碰撞重试 5 次,直接拼 {BaseURL}/d/{code} 作为
分发链接,上传完即时生成二维码。
## 功能概览
- 登录用户上传文件,生成短链 + 二维码
- 支持 Android APK / iOS IPA / 图片 / 视频 / 文档 / 压缩包
- 下载页公开访问,支持密码保护
- APK / IPA 自动展示包名、版本历史列表
- 管理后台统一管理文件和用户,新用户由管理员创建
整体代码量不大,Go 的标准分层写下来比较舒服,有类似需求的可以参考,如果你也有类似的折腾经历,欢迎评论区聊聊。