数字下载:持久化修复及历史订单自动交付

2026年9月13日

今天我们修复了一个导致部分数字下载文件在服务器更新后丢失的 bug —— 同样重要的是,我们确保卖家(重新)上传文件的瞬间,买家就能自动获得访问权限。

发生了什么

一些买家在 我的下载 中点击下载按钮时看到 “file not found on disk”(磁盘上找不到文件)——尽管他们的订单已付款且下载条目存在。

技术原因

我们的游戏服务在每个区域 VPS 上的 Docker 容器中运行。上传的下载文件会写入 /var/lib/erleuchtung/shop-downloads —— 这本应是主机服务器上的持久文件夹,挂载到容器内部。

这个挂载在我们的开发配置中存在,但在更新代理安装到 VPS 节点的部署 compose 文件中缺失了。结果,上传的文件被存储在容器自身的文件系统层中。每当更新重建容器时,该层就会被丢弃 —— 文件消失,而数据库记录(存储在 PostgreSQL 中)保留了下来。

结果是:一个有效的下载条目指向了一个不再存在的文件。

我们修复了什么

  • 所有节点的持久存储。 下载目录现在已正确挂载到所有区域服务器(US、IN、EU2、SG 以及我们的 MAAS 预发布节点)的主机存储上。上传的文件可以在更新和容器重建后存活。
  • 上传时自动回填。 以前,下载权限只在付款时授予 —— 且仅针对当时存在的文件。现在,当卖家向产品上传文件时,它会自动授予该产品的所有已付款订单买家,并附带即时通知。
  • 自愈下载列表。 打开「我的下载」现在会修复您所有已付款订单缺失的权限 —— 旧订单会自动恢复。
  • 发货时授予。 当卖家将订单标记为已发货/已交付时,附加文件会立即授予 —— 数字商品在交付时即应提供。

卖家需要做什么

在此修复之前上传并在更新中丢失的文件无法恢复 —— 它们只存在于已被丢弃的容器层中。

如果您之前上传过文件: 打开您的产品,删除过期的下载条目,然后重新上传文件。在您上传的那一刻,所有历史买家将自动恢复访问权限 —— 无需手动操作。

关于透明度的说明

你们中一些人收到的「已发货」通知邮件提到了可下载文件,但实际上从未附加过任何文件 —— 那段文字是卖家的发货备注,而非文件交付。从此版本开始,「我的下载」中的下载按钮是唯一可信的依据:如果文件列在那里,它就存在于服务器上并且可以下载。

感谢大家的耐心等待 —— 特别感谢迅速报告问题的社区成员。

— Erleuchtung 团队