EU storage VPS: data residency and cost
EU storage VPS pricing starts with one division: monthly price over usable terabytes. Then check the residency claim, the processing agreement and the disks.
What an EU storage VPS costs per terabyte per month
An EU storage VPS is sold by the terabyte, so the number that decides the purchase is one division: the monthly price divided by the usable capacity. Small plans land in the tens of euros per terabyte per month. Large capacity plans built on spinning disks land near a few euros per terabyte per month. Run that division on every plan you are looking at before you read a single feature list.
The block below is a worked example. The prices are round figures picked to show the method. They are not any provider's current price, and any real figure printed on a page like this one ages within months. Replace them with the prices on the order form in front of you.
The data behind this chart
[
{
"label": "1 TB NVMe VPS",
"monthly_eur": 40,
"capacity_tb": 1,
"eur_per_tb": 40
},
{
"label": "2 TB HDD plan",
"monthly_eur": 12,
"capacity_tb": 2,
"eur_per_tb": 6
},
{
"label": "8 TB HDD plan",
"monthly_eur": 30,
"capacity_tb": 8,
"eur_per_tb": 3.75
},
{
"label": "16 TB HDD plan",
"monthly_eur": 50,
"capacity_tb": 16,
"eur_per_tb": 3.13
}
]The small flash plan in that example works out at 40 euros per terabyte per month. The largest capacity plan works out at 3.13 euros per terabyte, from a monthly price of 50 euros for 16 TB. The distance between those two ends is more than an order of magnitude, and that distance is the entire reason capacity plans exist as a separate product. If your ratio sits near the top row, you are paying flash prices to store cold data.
Two habits keep the comparison honest. Divide by the capacity the filesystem reports, not the capacity on the banner. Compare the same billing period, because a monthly price and a price that assumes a yearly commitment are different products.
Why the headline capacity price is for spinning disks
A plan that sells terabytes cheaply is backed by hard disk drives (HDD). That media is the only one whose cost per terabyte allows the price. The NVMe (non-volatile memory express) storage under your application server is a different product, priced closer to the top row above. Both are sold as a VPS, and the difference between a storage VPS and a regular VPS is mostly this one choice of media and what it does to latency.
The data behind this chart
[
{
"label": "7200 rpm HDD",
"random_4k_iops": 150,
"sequential_mb_s": 180
},
{
"label": "SATA SSD",
"random_4k_iops": "50,000",
"sequential_mb_s": 500
},
{
"label": "NVMe SSD",
"random_4k_iops": "200,000",
"sequential_mb_s": 3000
}
]Those are typical published figures for the media, given as an order of magnitude rather than a promise about any plan. A 7200 rpm drive serves around 150 random 4k operations per second, because every request that misses cache waits for the head to move and for the platter to turn under it. That wait is measured in milliseconds. An NVMe drive has no moving part in the path and serves around 200,000 of the same operations, with waits measured in microseconds. Sequential work is much closer: the same spinning disk streams about 180 MB per second, which is enough to fill a backup window overnight.
So the rule is short. Spinning capacity is good at large files written and read in order. It is bad at many small operations scattered across the disk. Every design decision further down this page follows from that one sentence.
How to check what you are actually getting
lsblk -d -o NAME,ROTA,SIZE,MODEL
df -h /mnt/store
df -i /mnt/storeROTA reads 1 for a rotational device. Do not trust a 0 on a VPS: the disk reaches the guest through a virtio driver, and virtual block devices commonly report 0 whatever the media underneath them is. The flag is a hint. A measurement is proof.
df -h also settles the capacity argument. A plan sold as 8 TB reports about 7.3 TiB, because the seller counts in powers of 1000 while df counts in powers of 1024. Add filesystem overhead and the reserved blocks ext4 keeps for root, and the number you should divide the price by is lower again. Working out how much capacity you actually need gets easier once you read the same units the invoice implies.
The fio commands to measure a plan before you trust it
Install fio, then run one random read test and one sequential write test against a file on the mounted storage. Both write real data, so point them at a scratch path with room to spare, and delete the file afterwards.
sudo apt update && sudo apt install -y fio
fio --name=randread --filename=/mnt/store/fio.test --size=1G --bs=4k \
--rw=randread --ioengine=libaio --direct=1 --iodepth=32 \
--runtime=60 --time_based --group_reporting
fio --name=seqwrite --filename=/mnt/store/fio.test --size=4G --bs=1M \
--rw=write --ioengine=libaio --direct=1 --iodepth=8 --group_reporting
rm -f /mnt/store/fio.testRead the IOPS= field from the random read run and the bw= field from the sequential write run. A capacity plan that returns a few hundred random IOPS and a few hundred MB per second sequential is behaving like the spinning disks it is sold as. If the space is presented as a network filesystem rather than a block device, use --ioengine=psync, because libaio is for local block devices and will either fail or fall back.
What else moves the euros per terabyte
The division is the start. Five things move the real total, and every one of them is checkable before you pay.
- VAT. German and EU hosts often display net prices for business customers. As of September 2026 the standard German rate is 19 percent, so a buyer who cannot reclaim it pays a visibly higher figure than the banner.
- Setup fee. Some capacity plans charge one, usually the larger ones. Spread it over the term you honestly expect to stay.
- Minimum term and notice period. A yearly commitment lowers the monthly figure and fixes your exit at the same time.
- Traffic. Capacity plans include an allowance and then throttle or bill for the rest. The day you restore everything is the day you learn which.
- Extras that are the same storage twice. Provider snapshots of a backup target add little if you already keep two independent restic repositories in different places.
Add all of it into a total for 24 months, divide by 24, then divide by the terabytes df -h reports. That is a number you can defend in a budget meeting. What a VPS costs in general uses the same method, and cheap terabytes compared across storage VPS, block storage and object storage applies it to the other two ways of buying the same bytes.
What "EU data centre" means in practice
It means the machine holding your bytes sits in a building in a named EU country. That is all it means. It is a fact about a building, so ask for it as a fact: which country, and which company operates the facility. A provider who will not name the country is not selling you residency.
The moment the data belongs to your customers, the arrangement has names in law. You are the controller. Your host is the processor. Article 28 of the GDPR (general data protection regulation) requires a written contract between the two. German contracts call that document the Auftragsverarbeitungsvertrag, shortened to AVV, and it is the same instrument an English contract calls a DPA (data processing agreement). It has to set out the subject matter and duration, the categories of data, the security measures, the rules for engaging subprocessors, and what happens to the data when the contract ends.
The documented location is the part buyers skip. A location claim on a pricing page can change without anyone telling you. The same claim written into the AVV or its annex is a term of the contract, and it is also what fills the transfer column of your own Article 30 record of processing activities. Ask for that annex before you sign, not after an auditor asks you for it.
Subprocessors are the second gap. A host rarely owns every layer. The building may belong to a colocation operator, remote hands may be contractors, the support desk may sit in another country, and the monitoring or ticketing tool may be a hosted service somewhere else. Each of those is a subprocessor if it can reach personal data. Ask for the current list and for the notice period before that list changes.
Access from outside the European Economic Area (EEA) is the third. Data resting in Frankfurt can still be read by an engineer logging in from elsewhere, and under Chapter V of the GDPR that access counts as a transfer. Transfers rest on an adequacy decision or on standard contractual clauses (SCC). The EU-US Data Privacy Framework, adopted in July 2023, provides adequacy for certified US organisations, and it has faced legal challenge since it was adopted, so a contract leaning on it deserves a review date rather than an assumption. None of this is legal advice. It is the list of questions your own counsel will ask you first.
Client-side encryption changes what the provider can read, and it does not end the relationship. restic and Borg encrypt before anything leaves your machine, so the host stores ciphertext and holds no key. The host still processes your account details, your network addresses, the sizes of your backups and the times they run, and it still owns whether the data is available at all. Keep the AVV.
Why "EU company" and "EU data centre" are not the same claim
These are two independent facts, and a pricing page often blurs them into one badge. A company registered in Berlin can rent capacity in a facility outside the EU. A company headquartered in the United States can run a data centre in Frankfurt with local staff and local suppliers. Both sentences can be true at once, and neither one implies the other.
They matter for different reasons. The location of the disks decides which country's rules apply to the machine, and it decides your latency. The registration and ownership of the company decide which legal system can compel that company, including through a parent in another country. Ask the two questions separately, and ask for both answers in writing. The split travels: residency for a Canadian VPS turns on exactly the same distinction between where the hardware sits and who controls it.
What to ask before you send customer backups
- Which country and city holds the data at rest, and is that written into the contract or only on the website?
- Which legal entity signs the AVV, and where is that entity registered?
- Who are the current subprocessors, and how much notice do I get before that list changes?
- Can staff outside the EEA access the systems for support, under what controls, and is the access logged?
- Where do your own backups and replicas of my volume go? A replica in another region moves the data.
- What happens to the disks when I cancel or a payment fails? Ask for the deletion process and the notice you get before it runs.
The wider checklist for choosing a storage VPS covers the technical half of this conversation. Those six questions are the half a lawyer asks about later.
Cold data: what HDD capacity is good at
Backup archives are the ideal workload for spinning capacity. They are written once, read rarely, and read in long sequential runs when a restore happens. Using a VPS as an offsite backup target is the usual reason to buy terabytes at all, and a self-hosted photo library and its restores behaves the same way.
restic and Borg both split files into content-defined chunks and pack those chunks into larger files. A backup run reads your source data and appends new packs, which is mostly sequential and suits a disk well. Maintenance is where the media shows itself. restic forget --prune rewrites pack files to drop unreferenced blobs, and restic check --read-data-subset reads packs back to verify them. Borg's prune followed by compact does the same job. Those passes are latency bound rather than throughput bound, so a maintenance run that takes minutes against NVMe can take hours against an HDD-backed target holding the same data.
restic -r sftp:user@storage.example.net:/srv/restic init
restic -r sftp:user@storage.example.net:/srv/restic backup /srv/data
restic -r sftp:user@storage.example.net:/srv/restic check --read-data-subset=5%
restic -r sftp:user@storage.example.net:/srv/restic forget \
--keep-daily 7 --keep-weekly 4 --keep-monthly 6 --pruneTwo settings save hours. Run the prune on a schedule, weekly or monthly, instead of after every backup, because each prune rewrites packs that the next one may rewrite again. Leave restic's cache on local fast storage, which is the default under ~/.cache/restic, and never point RESTIC_CACHE_DIR at the remote mount. A cache on the slow side of the link removes the whole reason the cache exists, so every run reads the index across the network again.
Borg is the same shape with different verbs:
borg init --encryption=repokey-blake2 ssh://user@storage.example.net/./repo
borg create --stats --compression zstd,3 \
'ssh://user@storage.example.net/./repo::{hostname}-{now}' /srv/data
borg prune --keep-daily=7 --keep-weekly=4 ssh://user@storage.example.net/./repo
borg compact ssh://user@storage.example.net/./repoA database is the opposite workload. It issues many small random reads and calls fsync on commit. On a rotational device each fsync waits for a physical seek, so commit latency moves from microseconds to milliseconds, and a workload that was comfortable on NVMe becomes a queue. The database still works. It gets slow in the way that looks to users like the application hanging. Keep the live database on NVMe and put its dumps and its old backups on the capacity plan.
The network path matters as much as the media. Capacity plans usually present the space over SSH and SFTP, NFS, SMB or WebDAV, so every operation carries the round trip between your server and the storage box on top of the disk time. Measure it before you design around it:
mtr -rwc 20 storage.example.netA few milliseconds between two machines in the same country is fine for backups. A round trip across an ocean turns a maintenance pass over thousands of small objects into an overnight job. That is a second, practical reason to keep the storage in the same region as the servers it serves, next to the residency reason.
Failure modes and the exact strings you will see
The repository is locked. restic stops with repository is already locked exclusively by PID followed by the process and host that hold it. A previous run was killed, or a prune is still going. Confirm nothing is running, then clear it with restic unlock. Borg prints Failed to create/acquire the lock with the repository path and (timeout), and borg break-lock clears that one after the same check.
No space left on device while df -h shows free space. The filesystem is out of inodes rather than bytes. df -i shows IUse% at 100. ext4 fixes the inode count when the filesystem is created, so the repair is a reformat with a smaller bytes-per-inode ratio (mkfs.ext4 -i 16384) or a move to XFS, which allocates inodes as it goes. Repositories full of small files reach this limit long before they fill the disk.
Backups that got slower every month. Check whether prune has ever run. An unpruned repository keeps every unreferenced blob, so each check reads more data than the last and the traffic allowance drains faster. Then check for shaping: a transfer that starts fast and settles at a flat rate is a traffic policy, not a disk.
The restore nobody timed. Run one on purpose with restic restore latest --target /tmp/restore-test --include /etc and time it. Then divide the repository size by the sequential rate you measured with fio to get an honest order of magnitude for a full restore. If the answer is days, decide today whether days is acceptable, because the middle of an incident is a bad moment to find out.
FAQ
How much should an EU storage VPS cost per terabyte per month?
Work it out instead of looking it up, because published figures age fast. Take the monthly price, add any setup fee spread across the term you expect to stay, add VAT if you cannot reclaim it, then divide by the terabytes df -h actually reports. Capacity plans on spinning disks land in the low single digits of euros per terabyte per month, and flash-backed plans land an order of magnitude above that. A capacity plan priced like flash is either not spinning disks or not competitive.
Is an EU data centre enough for GDPR compliance?
No. The location of the building is one input. You also need a written processing agreement under Article 28 with the entity that holds the data, the processing locations named inside that agreement rather than on a web page, the current subprocessor list, and a clear answer on whether support staff outside the EEA can reach the systems. A machine in Frankfurt administered from outside the EEA still involves a transfer under Chapter V, which needs its own basis such as standard contractual clauses.
Does client-side encryption let me skip the processing agreement?
No, although it changes what a breach can expose. restic and Borg encrypt on your machine, so the provider stores ciphertext and holds no key. The provider still processes your account data and network addresses, still sees the size and timing of every backup, and still owns availability. Keep the agreement, and treat the encryption as the control that limits the damage rather than as a replacement for the contract.
Can I run a database on an HDD-backed storage VPS?
You can, and it will disappoint you under load. A database commits with fsync, and on a rotational disk each of those waits for a physical seek, so commit latency is measured in milliseconds instead of microseconds. Queries that read small rows at random behave the same way. Put the live database on NVMe and use the capacity plan for its dumps and its older backups.