Why We Chose BunnyCDN as Ciphera's CDN
本文为原文前 6,000 字符的节选翻译,完整内容请查看原文。
Why We Chose BunnyCDN as Ciphera’s CDN
CDN 会终止您的 TLS 连接,位于每位访客的请求路径中,并能看到您页面发出的每一个资源请求。大多数工程团队在选择 CDN 时主要考虑价格和延迟。但对于一家隐私公司而言,这些只是次要问题——首要问题是管辖权:谁在操作负责解密每个请求的服务器?哪些法院有权强制要求他们提供数据?我们为 ciphera.net 和我们的产品前端完成了这一决策过程,选择了 Bunny,并且在生产环境中运行了足够长的时间,从而积累了基于事实的观点。本文包含了我们使用的检查清单、实际的设置方案,以及我们在运行过程中学到的四点经验——其中包括一个值得阅读的尴尬数字,以免您重蹈覆辙。简而言之,我们选择 Bunny 是因为其位于欧盟管辖区(斯洛文尼亚),承诺根据 GDPR 数据处理协议(DPA)进行匿名化日志记录,定价透明(欧洲地区为 $0.01/GB),且性能表现优异(119 个接入点,全球平均延迟约 24 毫秒)。我们的设置:Bunny 拉取区域(Pull Zones)位于 Bunny 自身存储的前端,提供路径键控的不可变资源,同时在瑞士的对象存储中保留每份文件的副本。我们的网站在 2026 年 8 月 15 日至 9 月 12 日期间迁移到了 Bunny Magic Containers。经验教训:CDN 缓存会以您意想不到的方式合并内容,请务必测量真实的缓存命中率,将安全规则推送到边缘,并严格界定绝不离开源站的数据范围。2026 年 10 月 18 日更新:我们的网站在 2026 年 8 月 15 日至 9 月 12 日期间迁移到了 Bunny Magic Containers,设置部分现已说明了由此带来的变化。2026 年 7 月 19 日更新:根据我们当前的生产设置进行了重写,所有网络和定价数据均已于当日在 bunny.net 上重新核实。
Why a CDN Is a Privacy Decision
The CDN’s entire job is to stand between your users and your servers. That means it observes every request — URL, IP, headers — for every visitor, on every page. You can architect so it holds nothing sensitive (more on that below), but you cannot architect away the fact that it sees traffic. Whoever operates it is inside your trust boundary whether you like it or not. The asymmetry is easy to miss because static assets feel harmless. An icon request is just an icon request — until you notice that every one arrives with an IP address, a user agent, and a referer header naming the exact page being read. Aggregate those across a browsing session and a CDN’s logs reconstruct visitor behavior about as well as an analytics script would. A company that won’t run invasive analytics on its own pages has no business ignoring the same data accumulating in a vendor’s log pipeline. That makes jurisdiction the first filter. A US-headquartered CDN operates under the CLOUD Act wherever its edge nodes physically sit — the compulsion follows the company, not the server. Our vendor policy is explicit and ranked: residency, then privacy, then security, then robustness. Applied here, that ruled out the default answers (Cloudflare, CloudFront, Fastly) before performance was even discussed — not because they’re bad at CDN-ing, but because they move the request path into a legal system we’re deliberately building away from. Ciphera is a Belgian company; our data is stored in Switzerland; the CDN needed to be run by a European company.
为什么 CDN 是一个隐私决策
CDN 的全部工作就是站在您的用户和服务器之间。这意味着它会观察每位访客在每个页面上的每一个请求——包括 URL、IP 地址和请求头。您可以进行架构设计以确保它不持有任何敏感信息(下文会有更多说明),但您无法改变它能看到流量这一事实。无论您是否愿意,操作 CDN 的人都在您的信任边界之内。这种不对称性很容易被忽视,因为静态资源看起来是无害的。一个图标请求仅仅是一个图标请求——直到您注意到每个请求都带有 IP 地址、用户代理(User Agent)和指明所阅读页面的 Referer 请求头。将这些信息在整个浏览会话中汇总起来,CDN 的日志就能像分析脚本一样准确地重构访客行为。一家不在自己页面上运行侵入式分析的公司,绝不应该忽视供应商日志管道中积累的相同数据。这使得管辖权成为第一道筛选标准。总部位于美国的 CDN 无论其边缘节点物理位置在哪里,都受《云法案》(CLOUD Act)管辖——强制力跟随的是公司,而不是服务器。我们的供应商政策明确且有优先级:驻地、隐私、安全,最后是稳健性。应用到这里,我们在讨论性能之前就排除了默认选项(Cloudflare、CloudFront、Fastly)——这并不是因为它们 CDN 做得不好,而是因为它们将请求路径引入了一个我们刻意避开的法律体系。Ciphera 是一家比利时公司;我们的数据存储在瑞士;因此 CDN 必须由一家欧洲公司运营。
The Checklist We Used
Five criteria, in the order we applied them: EU jurisdiction. Bunny is Slovenian, so the edge is operated by an EU company under GDPR. Its network is global (119 PoPs, see the last item), so the jurisdiction we rely on is the operator’s, and the nodes sit wherever Bunny places them. Logging you can live with. Bunny’s GDPR commitments include anonymizing personally identifiable data in logging, with a signed DPA available in the panel. “We anonymize” from an EU company under GDPR enforcement is a materially different promise than the same words from elsewhere. Content-agnostic serving. The CDN must do its job without interpreting the bytes. For our asset zones we treat the CDN as untrusted infrastructure on principle: it caches and moves opaque objects, whether those are PNGs or encrypted blobs. Any CDN feature that requires inspecting or transforming content gets extra scrutiny before we enable it. The websites that now run on Bunny’s platform are the exception, as the setup section below explains. Transparent pricing. $0.01/GB for European and North American traffic on the standard network, volume tiers from $0.005/GB, and a $1 monthly minimum — all public on the pricing page, no sales call required. (All figures re-checked 19-07-2026.) Performance, last. 119 PoPs, 250+ Tbps network capacity, ~24 ms average global latency (bunny.net/network). Comfortably more than a content site needs — but it was the fifth question, not the first. The order is the point. Plenty of CDNs pass criterion five. Very few pass one and two first.
我们使用的检查清单
我们按以下顺序应用了五个标准:欧盟管辖权。Bunny 是斯洛文尼亚公司,因此其边缘节点由一家受 GDPR 约束的欧盟公司运营。其网络是全球性的(119 个接入点,见最后一条),因此我们依赖的是运营商的管辖权,而节点位于 Bunny 放置它们的任何地方。可接受的日志记录。Bunny 的 GDPR 承诺包括在日志记录中对个人身份信息进行匿名化处理,并在控制面板中提供已签署的 DPA。在 GDPR 执行下,一家欧盟公司承诺“我们进行匿名化”与来自其他地方的相同承诺有着本质区别。内容无关的服务。CDN 必须在不解析字节的情况下完成其工作。对于我们的资源区域,我们原则上将 CDN 视为不可信的基础设施:它缓存并传输不透明的对象,无论是 PNG 还是加密的二进制大对象(Blob)。任何需要检查或转换内容的 CDN 功能在启用前都会受到额外审查。正如以下设置部分所述,现在运行在 Bunny 平台上的网站属于例外。透明的定价。标准网络下欧洲和北美流量为 $0.01/GB,大容量层级低至 $0.005/GB,每月最低消费 $1——所有信息均在定价页面公开,无需销售电话。(所有数据已于 2026 年 7 月 19 日重新核实。)性能,最后考虑。119 个接入点,250+ Tbps 网络容量,全球平均延迟约 24 毫秒(bunny.net/network)。这远超内容网站的需求——但这是第五个问题,而不是第一个。顺序才是重点。很多 CDN 都能通过第五个标准,但很少有 CDN 能首先通过第一和第二个标准。
What Our Setup Actually Looks Like
The architecture is deliberately boring: Origin: all static assets — product illustrations, icons, blog OG cards — live in Bunny Edge Storage, and every upload is also written to object storage in Switzerland, so Bunny never holds the only copy. Edge: Bunny pull zones (fifteen of them on 19 July 2026, across our sites and services) front that storage at cdn.ciphera.net. The copy in Switzerland holds every file, so swapping CDN providers for these asset zones would mean pointing the new CDN at it, not a migration. The websites are different: ciphera.net, docs, help and status moved onto Bunny Magic Containers (about 42 regions) between 15 August and 12 September 2026, and the Pulse tracker and API are served through Bunny’s edge, where TLS ends. Moving the websites would be a rebuild. Assets are path-keyed and immutable. Every object uploads with Cache-Control: public, max-age=31536000, immutable and is never edited in place — a changed image gets a new path. Edges can cache for a year with zero staleness risk, and there’s no revalidation traffic to leak anything about visitors. Assets are pre-sized at upload. No on-the-fly transformation service sits in the pipe.
我们的实际设置方案
该架构刻意保持简单:源站:所有静态资源——产品插图、图标、博客 OG 卡片——都存储在 Bunny Edge Storage 中,并且每次上传也会写入瑞士的对象存储,因此 Bunny 从未持有唯一副本。边缘:Bunny 拉取区域(截至 2026 年 7 月 19 日,在我们的网站和服务中共有 15 个)在 cdn.ciphera.net 处作为该存储的前端。瑞士的副本保存了所有文件,因此为这些资源区域更换 CDN 供应商意味着只需将新 CDN 指向该处,而无需进行迁移。网站的情况则不同:ciphera.net、docs、help 和 status 在 2026 年 8 月 15 日至 9 月 12 日期间迁移到了 Bunny Magic Containers(约 42 个区域),而 Pulse 追踪器和 API 则通过 Bunny 的边缘节点提供服务,TLS 连接在此终止。迁移网站需要进行重建。资源采用路径键控且不可变。每个对象上传时都带有 Cache-Control: public, max-age=31536000, immutable 属性,且从不在原处编辑——更改后的图像会获得一个新的路径。边缘节点可以缓存一年而没有陈旧风险,并且没有重新验证流量会泄露有关访客的任何信息。资源在上传时已预先调整大小。管道中没有即时转换服务。