Machine room

The European archive cabinet

The site decides where its data lives.

Cloudflare’s network answers from the data centre nearest the guest, anywhere in the world. But where data is stored, the customer can decide. The site’s archive cabinet has four stores locked to the EU: a Durable Object, a D1 database, a KV namespace and an R2 bucket. Next to them stands a Durable Object without a lock. The map and the cards below measure where they answer from while you look at the page. Put a seal in the cabinet and see where it ends up. The seal stores only the time and the data centre, nothing about you.

The four layers of control

The jurisdiction decides where data is stored. That is what the cabinet shows, and anyone can use it. The rest requires Cloudflare’s Data Localization Suite on the Enterprise plan.

All plans

Jurisdictions

D1, KV, R2, Durable Objects and Workflows can be locked to eu, us or fedramp. Data runs and is stored only there, even when the guest is on the other side of the world. The lock is set at creation and cannot be changed afterwards.

Enterprise

Regional Services

Decides where the edge may decrypt and process traffic. Without it, a guest’s connection may be opened in the nearest data centre, whatever the country.

Enterprise

Customer Metadata Boundary

Keeps logs and analytics in the EU or the US, so metadata about the traffic stays in the region too.

Enterprise

Geo Key Manager

Decides in which countries the site’s private TLS keys may exist.

Why it matters: the law

Many believe the GDPR requires data to be in the EU. It does not, directly. But the rules make compliance much easier when data stays in the EU, and some sectors require more.

GDPR · chapter V

Transfers to third countries

Personal data may be processed outside the EU, but only with a legal basis for the transfer: a decision that the country protects data adequately (article 45), or for example the EU standard contractual clauses with an assessment of the receiving country (article 46). If data stays in the EU, there is no transfer to document.

Schrems II · 2020

When the framework falls

In 2020 the EU Court of Justice struck down the Privacy Shield between the EU and the US, because US authorities could access data about Europeans. The current EU–US Data Privacy Framework from 2023 is valid, but still contested. Data that lives in the EU does not depend on such a framework holding.

Data Act · NIS2 · DORA

More than personal data

The EU Data Act requires cloud providers to protect non-personal data too against unlawful access by authorities outside the EU. NIS2 and, for the financial sector, DORA set requirements for security and supplier management. None of them requires EU location directly, but location is often part of the answer.

Contracts and sectors

When the customer requires it

Public authorities, health and finance often require data to be in the EU or in Denmark, in their tenders and data processing agreements. A jurisdiction that cannot be changed afterwards is a concrete answer.

One thing location does not solve: Cloudflare is an American company. How much that weighs depends on the data, the risk assessment and the contracts. That is why the Enterprise layers and the data processing agreement exist. This text is an explanation, not legal advice.

What cannot be locked

The Worker itself runs in the data centre nearest the guest. Placement can move it closer to the data, but not lock it in. The site’s other stores (the database, KV and R2 behind the other pages) were created without a jurisdiction. The measurements show that they live in western Europe today, but that is chance, not a promise.

How to do it yourself

# 1. Create the stores with a jurisdiction (can only be set at creation)
npx wrangler d1 create wi24rd-eu-skab --jurisdiction=eu
npx wrangler kv namespace create wi24rd-eu-skab --jurisdiction=eu
npx wrangler r2 bucket create wi24rd-eu-skab --jurisdiction=eu

# 2. wrangler.toml: R2 needs the jurisdiction in the binding
[[r2_buckets]]
binding = "EU_R2"
bucket_name = "wi24rd-eu-skab"
jurisdiction = "eu"

// 3. Durable Objects: choose the jurisdiction when getting the object
const stub = env.SKAB.jurisdiction("eu").getByName("skabet");
// … and inside the object: this.ctx.id.jurisdiction === "eu"

Raw measurements as JSON: /api/maskine/eu/skab. Sources: D1 · R2 · KV · Durable Objects · Data Localization Suite

The family: The defences·The crawlers·The speed·Denmark right now·The archive cabinet·The door·The infrastructure map·The audit·Back to the machine room

Have a useful idea?

Feature requests, bug reports and questions are welcome. Every message gets a personal reply.