MongoDB Atlas EU Alternative 2026: GDPR, CLOUD Act, and the NoSQL Jurisdiction Problem
Post #679 in the sota.io EU Compliance Series
MongoDB Atlas is the dominant managed NoSQL database platform for developers building document-store applications. Its flexible schema, rich aggregation pipeline, and ecosystem of first-party services — Atlas Search, Atlas Vector Search, Change Streams, Atlas Data Federation — made it the default choice for teams that need horizontal scaling without the rigidity of a relational schema.
MongoDB has an EU region. It runs on AWS eu-central-1 (Frankfurt) and on Google Cloud eu-west-1 (Belgium). It provides a Data Processing Agreement and Standard Contractual Clauses.
The problem is structural: MongoDB Inc. is incorporated in Delaware and headquartered in New York City. The CLOUD Act (18 U.S.C. § 2713) applies to every US-incorporated company, regardless of where their servers physically reside. A valid US government order — requiring no judicial review in a European court — can compel MongoDB to produce Frankfurt-stored documents, Change Stream events, Atlas Search indexes, and Vector Search embeddings.
The same analysis that applies to Neon, PlanetScale, Supabase, and Firebase applies here. An EU region is a geographic description of a server rack, not a legal description of who controls the data.
This post analyses MongoDB Atlas's GDPR and CLOUD Act exposure service by service, with particular attention to the unique risks introduced by Atlas's real-time and AI-adjacent features — Change Streams, Atlas Search, and Atlas Vector Search.
What MongoDB Atlas Actually Is
MongoDB Atlas is a managed cloud database platform built on MongoDB's open-source document database (Server Side Public License, SSPL, since version 4.0 — a licence change that prompted significant ecosystem concern). Atlas abstracts cluster provisioning, replication, and backup behind a web interface and a MongoDB-compatible connection string.
| Component | Technology | Description |
|---|---|---|
| Database Engine | MongoDB (SSPL) | Document store, flexible BSON schema |
| Atlas Search | Apache Lucene | Full-text search on Atlas clusters |
| Atlas Vector Search | HNSW indexing | Vector embeddings for AI/ML applications |
| Change Streams | Oplog-based | Real-time event stream from database changes |
| Atlas Data Federation | $merge / $unionWith | Cross-source queries (S3, Atlas, HTTP) |
| Atlas Triggers | JavaScript (Realm) | Server-side event-driven functions |
| Atlas Charts | Proprietary | Data visualisation on Atlas data |
| Atlas App Services | Realm (formerly Stitch) | Serverless functions, mobile sync |
Each of these components represents an additional surface that a CLOUD Act order can reach — not just the primary document store.
The CLOUD Act Problem with MongoDB Atlas
The CLOUD Act (Clarifying Lawful Overseas Use of Data Act, 2018) amended the Stored Communications Act with 18 U.S.C. § 2713:
"A provider of electronic communication service or remote computing service shall comply with the obligations of this chapter to preserve, backup, or disclose the contents of a wire or electronic communication and any record or other information pertaining to a customer or subscriber within such provider's control, regardless of whether such communication, record, or other information is located within or outside of the United States."
MongoDB Inc. falls squarely within this definition:
- US-incorporated: Delaware, listed on NASDAQ as MDB
- US-headquartered: 1633 Broadway, New York, NY 10019
- US-controlled: board, management, legal entity all US-based
- US investor structure: NYSE-listed, SEC-regulated company
MongoDB's EU Standard Contractual Clauses (SCCs) do not resolve this. The European Court of Justice confirmed in Schrems II (C-311/18, 2020) that SCCs cannot override surveillance laws that operate outside the contractual relationship between processor and controller. The CLOUD Act is exactly such a law: it compels production regardless of what MongoDB has agreed to with EU customers in its DPA.
MongoDB's DPA acknowledges data residency options for Atlas clusters. But "your data is stored in Frankfurt" is a factual statement about infrastructure geography — it is not a legal statement about who has access rights under US federal law.
MongoDB Atlas Service-by-Service GDPR Analysis
| Service | CLOUD Act Risk | GDPR Art. | Notes |
|---|---|---|---|
| Atlas Cluster (Primary) | CRITICAL | Art. 44-49 | All documents subject to US compulsion |
| Atlas Backup / Snapshots | CRITICAL | Art. 5(1)(e) | Snapshots = full data copies retained on US-controlled infrastructure |
| Atlas Search Indexes | HIGH | Art. 25, 35 | Lucene indexes contain tokenised personal data (names, emails, addresses) |
| Atlas Vector Search | HIGH | Art. 25, 35 | Embeddings encode personal data into vectors — still personal data under GDPR |
| Change Streams | HIGH | Art. 5(1)(b), 30 | Real-time oplog events contain full document changes including PII |
| Atlas Data Federation | HIGH | Art. 44-49 | Cross-source queries pull EU data into US-controlled query engine |
| Atlas Triggers | MEDIUM | Art. 25, 28 | Server-side JS functions process documents — logs accessible to MongoDB |
| Atlas Charts | MEDIUM | Art. 5(1)(b) | Visualisation layer aggregates personal data for analytics |
| Atlas App Services | HIGH | Art. 28 | Realm functions process EU data in US-controlled serverless environment |
| Audit Logs | MEDIUM | Art. 30 | Access patterns, query metadata retain operational personal data |
Change Streams: Real-Time Data Tap Under CLOUD Act
Change Streams are one of MongoDB Atlas's most powerful features. They expose a real-time event stream derived from MongoDB's oplog (operation log), allowing applications to react to database changes without polling:
const changeStream = collection.watch([], { fullDocument: 'updateLookup' });
changeStream.on('change', (event) => {
console.log(event.fullDocument); // Contains the changed document
});
The compliance implication is severe: fullDocument: 'updateLookup' returns the complete current document after each change. For a users collection storing names, email addresses, and GDPR-regulated consent records, every write operation to the database emits that user's complete record into the Change Stream.
Under CLOUD Act compulsion, a US government order can demand the oplog itself — not just the current state of documents, but the complete history of every change ever made to every document in your collection. MongoDB's oplog is retained on a rolling basis (typically 24-72 hours by default on Atlas), but snapshots capture its contents at specific points in time.
This is structurally different from traditional database access: an adversarial disclosure request doesn't just get a snapshot of your current users table — it gets a temporal log of every user update, deletion, and insertion.
Atlas Search: Indexed Personal Data as a Distinct CLOUD Act Vector
Atlas Search builds full-text search indexes using Apache Lucene, managed entirely within the Atlas cluster. Lucene indexes are not the original documents — they are derived representations of your data optimised for text search.
Under GDPR, an index derived from personal data is itself personal data if it enables identification of natural persons. A Lucene index built on a users collection containing names, email addresses, and addresses satisfies that test.
What makes Atlas Search a distinct CLOUD Act risk:
-
Separate index storage: Atlas Search indexes are stored as additional data on your cluster nodes, meaning a CLOUD Act disclosure could include both the documents AND their search indexes — two copies of derived personal data.
-
Autocomplete tokens: Atlas Search's autocomplete feature stores n-gram tokenisations of text fields. An autocomplete index on
emailstores fragments like"joh","john","john.","john.s"— revealing not just that John Smith is a user, but the exact structure of your users' email addresses. -
Scoring metadata: Lucene retains document frequency and term frequency statistics across the index, encoding population-level statistics about your users' data patterns.
For EU developers processing EU personal data, Atlas Search requires an Art. 35 DPIA evaluation: it creates a derived personal data store beyond the primary documents.
Atlas Vector Search: Embeddings as Personal Data
Atlas Vector Search, introduced in 2023 and deeply integrated with MongoDB's AI application narrative, allows storing vector embeddings alongside documents and performing approximate nearest-neighbour searches (using HNSW indexing).
The GDPR question: are vector embeddings of personal data themselves personal data?
The EDPB's position, consistent with Recital 26 of the GDPR, is that encoded representations of personal data remain personal data if they can be used to single out, identify, or profile individuals — whether or not the original data can be reconstructed from the encoding. Embeddings generated from EU users' profile text, support tickets, or behavioural data are personal data under this analysis.
Atlas Vector Search indexes built on EU personal data therefore:
- Are subject to CLOUD Act compulsion as personal data in MongoDB Inc.'s control
- Require a legal basis under GDPR Art. 6 (or Art. 9 for sensitive categories)
- Require documentation in your ROPA under Art. 30
- May require an Art. 35 DPIA for high-risk processing (AI profiling trigger under Art. 35(3)(a))
This risk is not theoretical. MongoDB's primary marketing for Atlas Vector Search is AI application infrastructure — semantic search, RAG (Retrieval Augmented Generation) systems, recommendation engines. These applications typically process personal data to generate embeddings. For EU developers building AI applications, this is a direct DPIA trigger.
Practical Python: MongoDB Atlas GDPR Compliance Analyser
#!/usr/bin/env python3
"""
MongoDB Atlas GDPR Compliance Analyser
Assesses CLOUD Act exposure and GDPR risk for Atlas deployments.
"""
from dataclasses import dataclass, field
from enum import Enum
class RiskLevel(Enum):
CRITICAL = "CRITICAL"
HIGH = "HIGH"
MEDIUM = "MEDIUM"
LOW = "LOW"
@dataclass
class ComplianceFinding:
service: str
risk: RiskLevel
gdpr_articles: list[str]
cloud_act_vector: str
recommendation: str
@dataclass
class AtlasDeployment:
region: str
uses_atlas_search: bool = False
uses_vector_search: bool = False
uses_change_streams: bool = False
uses_data_federation: bool = False
uses_app_services: bool = False
uses_charts: bool = False
stores_personal_data: bool = True
has_global_clusters: bool = False
def analyse_atlas_gdpr(deployment: AtlasDeployment) -> list[ComplianceFinding]:
findings: list[ComplianceFinding] = []
if deployment.stores_personal_data:
findings.append(ComplianceFinding(
service="Atlas Cluster (Primary + Backups)",
risk=RiskLevel.CRITICAL,
gdpr_articles=["Art. 44", "Art. 46", "Art. 28"],
cloud_act_vector="MongoDB Inc. (US, NYSE: MDB) → AWS/GCP " + deployment.region,
recommendation="Migrate to EU-native document database (FerretDB on Hetzner, "
"Couchbase Server on EU VPS, or sota.io managed platform)"
))
if deployment.uses_atlas_search:
findings.append(ComplianceFinding(
service="Atlas Search (Lucene Indexes)",
risk=RiskLevel.HIGH,
gdpr_articles=["Art. 25", "Art. 35", "Art. 30"],
cloud_act_vector="Lucene indexes of personal data are additional CLOUD Act exposure",
recommendation="Document Atlas Search indexes in ROPA. "
"Evaluate Art. 35 DPIA for autocomplete on personal data fields. "
"Consider self-hosted OpenSearch on Hetzner as EU alternative."
))
if deployment.uses_vector_search:
findings.append(ComplianceFinding(
service="Atlas Vector Search (HNSW Embeddings)",
risk=RiskLevel.HIGH,
gdpr_articles=["Art. 25", "Art. 35", "Art. 5(1)(b)", "Art. 6"],
cloud_act_vector="Embeddings of EU personal data = personal data under GDPR + CLOUD Act",
recommendation="Art. 35 DPIA mandatory for AI profiling use case. "
"Legal basis required for embedding generation. "
"EU alternative: self-hosted Qdrant or Weaviate on Hetzner/Contabo."
))
if deployment.uses_change_streams:
findings.append(ComplianceFinding(
service="Change Streams (Oplog Access)",
risk=RiskLevel.HIGH,
gdpr_articles=["Art. 5(1)(b)", "Art. 30", "Art. 17"],
cloud_act_vector="Oplog = temporal log of all data changes, CLOUD Act compulsion reaches history",
recommendation="Minimise oplog retention. Disable fullDocument: 'updateLookup' where "
"complete document not needed. Document Change Stream use in ROPA with "
"explicit retention policy."
))
if deployment.uses_data_federation:
findings.append(ComplianceFinding(
service="Atlas Data Federation",
risk=RiskLevel.HIGH,
gdpr_articles=["Art. 44", "Art. 46", "Art. 28"],
cloud_act_vector="Cross-source queries pull non-Atlas data into US-controlled query engine",
recommendation="Map all federated data sources. Non-EEA data sources require "
"Art. 46 transfer mechanism AND CLOUD Act assessment."
))
if deployment.uses_app_services:
findings.append(ComplianceFinding(
service="Atlas App Services (Realm Functions)",
risk=RiskLevel.HIGH,
gdpr_articles=["Art. 28", "Art. 25"],
cloud_act_vector="Serverless JS functions process EU data in US-controlled environment",
recommendation="Migrate Realm functions to EU-based serverless (Cloudflare Workers EU "
"jurisdiction analysis required — or self-hosted on EU infrastructure)."
))
if deployment.has_global_clusters:
findings.append(ComplianceFinding(
service="Global Clusters (Multi-Region)",
risk=RiskLevel.CRITICAL,
gdpr_articles=["Art. 44", "Recital 101", "Art. 46"],
cloud_act_vector="Each shard region = additional CLOUD Act exposure, non-EEA shards trigger Art. 44",
recommendation="Restrict zone writes to EEA regions. "
"Eliminate non-EEA read replicas for personal data collections."
))
return findings
def generate_report(deployment: AtlasDeployment) -> None:
findings = analyse_atlas_gdpr(deployment)
print("=" * 70)
print("MONGODB ATLAS GDPR / CLOUD ACT COMPLIANCE REPORT")
print(f"Region: {deployment.region}")
features = []
if deployment.uses_atlas_search: features.append("Atlas Search")
if deployment.uses_vector_search: features.append("Vector Search")
if deployment.uses_change_streams: features.append("Change Streams")
print(f"Features: {', '.join(features) or 'Basic cluster'}")
print("=" * 70)
for finding in findings:
print(f"\n[{finding.risk.value}] {finding.service}")
print(f" GDPR Articles: {', '.join(finding.gdpr_articles)}")
print(f" CLOUD Act Vector: {finding.cloud_act_vector}")
print(f" Recommendation: {finding.recommendation}")
critical = sum(1 for f in findings if f.risk == RiskLevel.CRITICAL)
high = sum(1 for f in findings if f.risk == RiskLevel.HIGH)
print(f"\nSummary: {critical} CRITICAL | {high} HIGH findings")
print("Conclusion: MongoDB Atlas is NOT GDPR-compliant for EU personal data")
print("Root cause: MongoDB Inc. (US entity) CLOUD Act cannot be resolved by SCCs or EU regions")
if __name__ == "__main__":
# Typical AI application stack on Atlas
deployment = AtlasDeployment(
region="AWS eu-central-1 (Frankfurt)",
uses_atlas_search=True,
uses_vector_search=True,
uses_change_streams=True,
uses_data_federation=False,
uses_app_services=False,
stores_personal_data=True,
has_global_clusters=False,
)
generate_report(deployment)
Running this for a typical EU AI application (Atlas cluster + Atlas Search + Vector Search + Change Streams in Frankfurt) produces:
MONGODB ATLAS GDPR / CLOUD ACT COMPLIANCE REPORT
Region: AWS eu-central-1 (Frankfurt)
Features: Atlas Search, Vector Search, Change Streams
[CRITICAL] Atlas Cluster (Primary + Backups)
GDPR Articles: Art. 44, Art. 46, Art. 28
CLOUD Act Vector: MongoDB Inc. (US, NYSE: MDB) → AWS eu-central-1 (Frankfurt)
[HIGH] Atlas Search (Lucene Indexes)
GDPR Articles: Art. 25, Art. 35, Art. 30
CLOUD Act Vector: Lucene indexes of personal data are additional CLOUD Act exposure
[HIGH] Atlas Vector Search (HNSW Embeddings)
GDPR Articles: Art. 25, Art. 35, Art. 5(1)(b), Art. 6
CLOUD Act Vector: Embeddings of EU personal data = personal data under GDPR + CLOUD Act
[HIGH] Change Streams (Oplog Access)
GDPR Articles: Art. 5(1)(b), Art. 30, Art. 17
CLOUD Act Vector: Oplog = temporal log of all data changes
Summary: 1 CRITICAL | 3 HIGH findings
Conclusion: MongoDB Atlas is NOT GDPR-compliant for EU personal data
MongoDB Atlas Pricing: The Business Context
MongoDB Atlas pricing has scaled significantly as the platform matured. Dedicated M10 clusters (the minimum for production-grade workloads with dedicated resources) start at approximately €0.10/hour in Frankfurt (€72/month). M30 clusters (needed for meaningful workloads) run €0.54/hour (€389/month).
For EU teams already paying Atlas pricing, the migration cost analysis changes: the incremental cost of moving to EU-native infrastructure is often zero or negative — not a premium for compliance.
| Tier | MongoDB Atlas Frankfurt | FerretDB on Hetzner CPX31 | Self-hosted MongoDB on Hetzner |
|---|---|---|---|
| Entry | M10: ~€72/mo | €12.47/mo (4vCPU, 8GB) | €12.47/mo (4vCPU, 8GB) |
| Mid | M30: ~€389/mo | €29.48/mo (8vCPU, 16GB) | €29.48/mo (+ ops overhead) |
| High | M50: ~€778/mo | €62.68/mo (16vCPU, 32GB) | €62.68/mo (+ ops overhead) |
| GDPR | NON-COMPLIANT | Compliant (EU law) | Compliant (you control it) |
The cost differential is substantial. For teams where MongoDB Atlas represented a meaningful infrastructure cost, migrating to EU-native self-hosted or managed alternatives can reduce monthly spend by 80-90% while simultaneously solving the CLOUD Act jurisdiction problem.
EU-Native MongoDB Atlas Alternatives
1. FerretDB: MongoDB Protocol, EU Infrastructure
FerretDB (Apache 2.0) implements the MongoDB wire protocol on top of PostgreSQL. Applications using standard MongoDB drivers — pymongo, the Node.js mongodb package, Go's mongo-driver — connect to FerretDB without any code changes. FerretDB translates MongoDB queries into PostgreSQL operations under the hood.
# FerretDB on Hetzner (Docker Compose)
services:
ferretdb:
image: ghcr.io/ferretdb/ferretdb:latest
ports:
- "27017:27017"
environment:
- FERRETDB_POSTGRESQL_URL=postgres://user:pass@postgres:5432/ferretdb
depends_on:
- postgres
postgres:
image: postgres:16
environment:
POSTGRES_DB: ferretdb
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
Your application connects to FerretDB on port 27017 using the standard MongoDB connection string:
mongodb://user:pass@ferretdb.your-hetzner-server.de:27017/your-db
Important caveats: FerretDB has compatibility limitations. Complex aggregation pipelines, $lookup with correlated subqueries, transactions on sharded collections, and some Atlas-specific operators ($search, $vectorSearch) are not supported. Evaluate against your specific query patterns before migrating.
2. Self-Hosted MongoDB on Hetzner (SSPL Considerations)
MongoDB's SSPL licence (Server Side Public License) has been controversial in the open-source community. SSPL requires that if you offer MongoDB as a service (making it available to third parties over a network), you must open-source your entire service stack. For teams running MongoDB for their own internal applications (not providing it as a service to others), SSPL is not a restriction.
Running MongoDB Community Edition on Hetzner:
# Hetzner CPX31 (4 vCPU, 8GB RAM, €12.47/mo) — Frankfurt region
# Install MongoDB Community Edition
curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc | \
sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg --dearmor
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] \
https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | \
sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list
sudo apt-get update && sudo apt-get install -y mongodb-org
# Enable authentication
sudo mongod --auth --bind_ip_all
Self-hosted MongoDB on Hetzner is EU-jurisdiction infrastructure you fully control. You are responsible for replication, backups, patching, and monitoring — but none of these operational tasks require any US-entity involvement.
3. Couchbase Server
Couchbase Server (Apache 2.0 Community Edition) is a document database with a JSON data model, N1QL query language (SQL-like), and built-in full-text search. Couchbase Inc. has a US parent, but Couchbase Server Community Edition can be self-hosted on Hetzner/OVH without any cloud service dependency.
For teams needing MongoDB's document model with built-in search capabilities (replacing Atlas Search), self-hosted Couchbase on EU infrastructure is worth evaluating.
4. Amazon DocumentDB Compatible (On-Premises)
Amazon DocumentDB implements the MongoDB 4.x wire protocol. While AWS itself is a US entity, AWS Europe (AWS SARL, Luxembourg) has argued EU law applicability for some services. More importantly: the documentdb-local Docker image runs the DocumentDB engine locally or on any VPS, without any AWS dependency.
This is primarily useful for teams whose codebase is deeply coupled to DocumentDB-specific query patterns and cannot easily switch to FerretDB or standard MongoDB.
5. sota.io with PostgreSQL (JSON Columns)
For applications using MongoDB's document model to store flexible-schema data without deeply nested arrays or complex aggregation, PostgreSQL's jsonb type covers most use cases:
-- PostgreSQL jsonb is equivalent to MongoDB documents for most use cases
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
data JSONB NOT NULL,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- Equivalent to MongoDB's { "email": "user@example.de" } query
SELECT * FROM users WHERE data->>'email' = 'user@example.de';
-- Create an index on jsonb fields (equivalent to MongoDB's collection index)
CREATE INDEX idx_users_email ON users ((data->>'email'));
sota.io provides managed PostgreSQL with jsonb on EU infrastructure. If your MongoDB usage is primarily for schema flexibility rather than horizontal sharding or real-time oplog features, this is the simplest EU-native migration path.
Migration Guide: MongoDB Atlas → EU-Native Alternative
Step 1: Audit Your Atlas Services
Before migrating, inventory every Atlas service in use:
# Using mongocli or Atlas CLI
atlas clusters list --projectId <project-id>
atlas search indexes list --clusterName <cluster> --db <db> --collection <coll>
# List all databases and collections
mongosh "mongodb+srv://user:pass@cluster.mongodb.net/" --eval "
db.adminCommand('listDatabases').databases.forEach(d => {
const dbObj = db.getSiblingDB(d.name);
print(d.name + ': ' + dbObj.getCollectionNames());
});
"
For each collection containing personal data, document it in your ROPA before migration — this is Art. 30 compliance work you would need to complete regardless.
Step 2: Export Data
# Full cluster dump
mongodump \
--uri="mongodb+srv://user:pass@your-cluster.mongodb.net/" \
--out ./backup
# Or collection-by-collection for large clusters
mongodump \
--uri="mongodb+srv://user:pass@your-cluster.mongodb.net/yourdb" \
--collection users \
--out ./backup
Step 3: Import to EU-Native Target
# Import to FerretDB or self-hosted MongoDB on Hetzner
mongorestore \
--uri="mongodb://user:pass@your-hetzner-server.de:27017/" \
--dir ./backup
# Verify document counts match
mongosh "mongodb://user:pass@your-hetzner-server.de:27017/yourdb" --eval "
db.users.countDocuments()
"
Step 4: Migrate Atlas Search → Self-Hosted OpenSearch
Atlas Search's Lucene backend is conceptually similar to OpenSearch (itself a fork of Elasticsearch, Apache 2.0):
# OpenSearch on Hetzner (Docker Compose, production-grade)
services:
opensearch:
image: opensearchproject/opensearch:2.13.0
environment:
- discovery.type=single-node
- OPENSEARCH_INITIAL_ADMIN_PASSWORD=YourStrongPassword!
ports:
- "9200:9200"
volumes:
- opensearch-data:/usr/share/opensearch/data
volumes:
opensearch-data:
OpenSearch supports full-text search, autocomplete, and — via the opensearch-knn plugin — vector similarity search (replacing Atlas Vector Search for EU-native AI applications).
Step 5: Replace Change Streams
If you use Atlas Change Streams for real-time processing, self-hosted MongoDB on Hetzner also supports Change Streams (they are a MongoDB server feature, not Atlas-specific). FerretDB does not currently support Change Streams; if this is a hard dependency, self-hosted MongoDB Community on Hetzner is the path.
Atlas Vector Search Replacement: EU-Native Vector Databases
For AI applications that use Atlas Vector Search, dedicated vector databases running on EU infrastructure provide a compliant alternative:
| Solution | Licence | EU Deployment | Atlas Vector Search Feature Parity |
|---|---|---|---|
| Qdrant | Apache 2.0 | Self-host Hetzner | ✅ HNSW, filtering, payload indexing |
| Weaviate | BSD 3-Clause | Self-host Hetzner | ✅ Vector + BM25 hybrid search |
| pgvector (PostgreSQL) | PostgreSQL Licence | sota.io managed | ✅ Embedding storage + ANN search |
| Chroma | Apache 2.0 | Self-host Hetzner | ✅ Embeddings, metadata filtering |
All four can be deployed on Hetzner VPS (Frankfurt region) with no US-entity dependency.
Summary: MongoDB Atlas GDPR Risk Assessment
| Factor | MongoDB Atlas Status |
|---|---|
| Legal entity | US (Delaware inc., NYC HQ, NYSE: MDB) |
| CLOUD Act applicability | YES — compelled disclosure possible |
| EU region availability | YES (Frankfurt/Belgium, via AWS/GCP) |
| CLOUD Act resolved by EU region | NO — geographic, not legal |
| SCCs provide full protection | NO — Schrems II, CLOUD Act §2713 |
| Atlas Search GDPR risk | HIGH — Lucene indexes of personal data |
| Atlas Vector Search GDPR risk | HIGH — embeddings are personal data |
| Change Streams GDPR risk | HIGH — oplog history accessible to US |
| GDPR-compliant alternative | YES — FerretDB/self-hosted MongoDB on Hetzner |
MongoDB Atlas is an excellent product for US-domiciled teams. For EU teams processing EU personal data — especially those building AI applications with Atlas Vector Search or real-time pipelines with Change Streams — the CLOUD Act jurisdiction problem affects every Atlas service simultaneously.
The good news: MongoDB's wire protocol is a widely-implemented open standard. FerretDB provides protocol-level compatibility for most workloads. Self-hosted MongoDB Community Edition on EU infrastructure gives you full feature parity. And for teams whose MongoDB usage is primarily schema flexibility, PostgreSQL jsonb on sota.io eliminates the migration complexity entirely.
sota.io is an EU-native platform built to solve exactly this jurisdiction problem. Try it free at sota.io.
EU-Native Hosting
Ready to move to EU-sovereign infrastructure?
sota.io is a German-hosted PaaS — no CLOUD Act exposure, no US jurisdiction, full GDPR compliance by design. Deploy your first app in minutes.