跳到正文
← 全部文章

运行你自己的 tapeshelf

tapeshelf 以 AGPL-3.0 许可证开源,tapeshelf.com 背后的应用,就是你将来可以在自己服务器上运行的那个。公开代码仓库和安装指南还没有发布。在那之前,先介绍一下运行自己的实例会是什么样子,方便你判断它是否适合你,并提前规划服务器。

一套栈

一个实例就是一套 Docker Compose 栈:

browser ──HTTPS──► Caddy ─── 网页应用、安全响应头
                     └── /api, /ws ──► api ──► Postgres, Redis
                                       worker (ffmpeg) ──► Postgres, Redis
browser ──► S3 兼容存储:上传、视频分片、图片
  • Caddy 提供网页应用,并转发 API 和 WebSocket 流量。它会自动申请和续期 Let’s Encrypt 证书。如果你已经在用反向代理,也可以把 Caddy 放在它后面,不启用 TLS。
  • api 负责应用的所有功能:账号、片架、权限检查、请求和交换、限时链接,以及发放视频密钥。
  • worker 是同一套代码,作为第二个进程启动,所在镜像里带有 ffmpeg。它负责清理和转换上传的视频,加密用于播放的副本,生成帧和预览,渲染编辑结果,以及发送邮件和通知。
  • Postgres 存放数据。Redis 存放任务队列和短时缓存。
  • 每次启动都会运行一次性的 migrate 容器。它执行数据库迁移,按你的设置创建管理员账号,并配置存储桶:图片可公开读取但不能列出内容,清理被放弃的上传的规则,以及针对你的域名的 CORS。
  • backup 服务每天把数据库导出到你的存储桶一次,保留最近的 14 份。

视频从不经过 API。浏览器直接上传到存储,也直接从存储读取分片播放,所以存储需要一个浏览器能访问到的独立地址。这是唯一需要花点心思的地方。你可以让 tapeshelf 使用你已有的 S3 兼容服务,也可以在同一套栈里运行存储。

你需要准备什么

  • 一台装有 Docker 和 Compose 插件的 Linux 服务器。两个 CPU 核心和 4 GB 内存是比较合理的最低配置。
  • 给 worker 临时文件用的磁盘空间:每个并行处理的视频,大约需要最大视频体积的两倍半。
  • 一个指向服务器的域名,并开放 80 和 443 端口。
  • 一个用于发邮件的 SMTP 账号:确认邮件、重置密码和通知。
  • 可选:你自己的 Google OAuth 客户端,用于“使用 Google 登录”;以及 Cloudflare Turnstile 密钥,用于重复注册和新游客的人机验证。

转换视频是最吃资源的部分。最高 1080p、再通过几项检查的 H.264 视频只需重新封装,几秒钟就好。在一台双核的小服务器上,完整转码一个视频所需的时间和视频本身的时长差不多,有时更久。上传的人能实时看到进度,同时可以继续使用网站。

绝不能丢的机密

所有设置都放在一个环境变量文件里:数据库密码、会话密钥、存储凭据、SMTP,以及主密钥,每个视频的加密密钥都由它推导出来。详见tapeshelf 如何加密视频。在生产模式下,如果用的还是示例文件里的值,API 会拒绝启动。

主密钥一生成,就马上把它存进密码管理器。一旦丢失,所有已上传的视频都再也无法播放,恢复数据库也没用。两步验证用的身份验证器应用验证码也会失效,因为它们的密钥是用主密钥加密保存的。

和 tapeshelf.com 有什么不同

自托管实例没有套餐,也没有付费。没有 Free 和 Pro,没有“套餐”标签页,没有升级提示,下载前也没有等待页面。具体来说:

  • 除非你设定,否则没有限制。默认情况下,视频大小和片架大小都没有上限。作为管理员,你可以设定单个视频的上限和单个片架的上限,对所有人都一样。
  • 下载立即开始,全速进行,直接从存储下载。
  • tapeshelf.com 上属于 Pro 的功能,所有人都能用。包括视频编辑器、隐藏主页和限时链接的密码。已删除的视频可以在 90 天内恢复。
  • 防滥用措施保留。每日请求上限(默认 30 个视频,可以调整)和 API 频率限制用来保护服务器,所以会保留。
  • 你的名字,你的规则。实例有自己的名称和联系邮箱,并根据你提供的文件显示你的服务条款和隐私政策。访客首先看到的是一个简单的登录页面。

其他部分都是同一个应用:带合集和分类的片架、可续传的上传、16 帧预览、加密播放、请求和多轮交换、与游客的交换、限时链接、好友和聊天、两步验证(管理员必须开启)、通知、支持 20 种语言的应用、举报,以及管理后台。

要记住,每个实例都是一座独立的岛。实例上的人只能彼此分享和交换,不能和 tapeshelf.com 或其他实例上的账号往来。

更新和备份

更新就是拉取新版本,然后重启这套栈。迁移会在启动时执行,正在处理的视频会重新开始处理。不过在大版本更新前,还是先备份一下。

每天的数据库导出会自动存到你的存储桶里。视频本来就在存储里,它们的密钥来自主密钥。所以要保管好的就是三样东西:存储桶、数据库导出,以及那一个密钥。

许可证,一段话说清

你可以运行 tapeshelf,研究它,修改它。如果你修改了它,并让其他人通过网络使用你修改后的版本,AGPL 要求你向他们提供该版本的源代码。如果不做修改,只给自己、家人或朋友使用,只需要把许可证随附在一起即可。

什么时候

我们很快会发布代码仓库、现成的容器镜像,以及涵盖存储、邮件、备份和故障排查的安装指南。发布当天,自托管页面和这个博客都会告诉大家,订阅 RSS 是最不容易错过的方式。在此之前,想试用应用,最快的方式是 tapeshelf.com,详情见价格页面。