主要观点:作者一直渴望能轻松与不安全设备共享文件,尝试过多种解决方案但都不理想,最近朋友找到更好的折衷方案,即使用 rclone、Nginx 和 Kubernetes 构建文件共享服务。
关键信息:
- 需求:旅行时需从邮箱打印文档,不想在打印店电脑登录邮箱,而是将文件下载到手机等设备再上传到公共电脑,需要一个能方便从手机等设备上传文件的私有服务器,且能在受限网络连接下工作(如酒店 WiFi),需要 HTTP 支持文件上传编辑,WebDAV 可满足需求但服务器端支持不佳,rclone 较适合但需 Nginx 配合。
- 架构:在服务器上有/data 目录,通过 WebDAV 提供认证读写访问,/data/pub 提供未认证公共访问,将 rclone 和 Nginx 放在一个容器中以 Kubernetes pod 运行,/data 卷为 Persistent Volume 可迁移节点减少服务中断,让 Kubernetes 终止 HTTPS 连接。
- 构建容器:使用 Nix 构建容器,包含创建 Nginx 运行所需目录、包含 fakeNss 包、启动 rclone 和 Nginx 等脚本,Nginx 配置包括设置端点、设置用户认证等,通过.gitlab-ci.yml 处理环境变量。
- 部署在 Kubernetes:使用 kubectl 的 Kustomize 将所有配置放入专用命名空间,通过 StatefulSet 运行容器 pod,Service 前端访问,Longhorn PersistentVolume 后端存储,使用 Ingress 暴露服务并配置最大上传大小。
重要细节: - Nginx 的 DAV 模块工作在表面水平,若仔细观察行为不稳定。
- 容器启动脚本中启动 rclone 和 Nginx 为两个 Bash 任务并等待 rclone 终止。
- Nginx 配置中/public 端点从/data/pub 提供文件,/priv 端点作为 rclone 进程的代理并进行用户认证,访问/data/pub/file1 通过/pub/file1 ,写入通过/priv/pub/file1 。
- 处理 Nginx 认证配置时,将用户名和密码以环境变量形式提交到容器,在 CI 中覆盖,通过.gitlab-ci.yml 处理。
- Kubernetes 部署中使用 StatefulSet 确保卷在 pod 重启或替换时正确分离,Ingress 中配置最大上传大小为 200M 。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。