NODED.CLOUD/Blog/Self-Hosted S3: Running MinIO on a Dedicated Server

Self-Hosted S3: Running MinIO on a Dedicated Server

22 Aug 2026 · Mario Marin

A practical guide to self-hosting MinIO on a dedicated server: how to size NVMe against erasure coding overhead, why owned EU hardware kills per-GB egress fees, and how bucket data stays under EU jurisdiction.

\n

If you've priced out object storage on a public cloud lately, you've seen the line item that never stops growing: egress. Retrieval fees, per-GB transfer charges, API request costs — they compound quietly until someone finally asks \"why don't we just run our own S3?\" This is the practical answer to that question: how to self-host MinIO on a dedicated server, how much NVMe to actually provision for a given bucket size, and why doing it on owned EU hardware changes both the bill and the compliance conversation.

\n\n

Why Self-Host MinIO Instead of Renting Object Storage

\n

MinIO gives you an S3-API-compatible object store you run yourself — same PUT/GET/multipart semantics your applications and CI pipelines already speak, just pointed at an endpoint you control. For teams comfortable with S3 SDKs, moving to a self-hosted, s3 compatible storage self-hosted deployment usually means changing an endpoint URL and access keys, not rewriting application code.

\n

The case for self-hosting MinIO on a dedicated server comes down to three things: cost predictability, performance, and control. On rented object storage, your bill scales with retrieval volume — the more your application reads from the bucket, the more you pay, which punishes exactly the workloads (media delivery, backup restores, analytics reads) that object storage is supposed to make easy. Running MinIO on your own iron removes that variable entirely.

\n\n

Sizing NVMe for Your Bucket: The Real Math

\n

The most common sizing mistake is provisioning drives for the raw bucket size alone. MinIO's erasure coding needs headroom above your usable capacity target — that headroom is the single biggest variable in a sizing plan. Account for these before you order hardware:

\n
    \n
  • Erasure coding parity — MinIO distributes data and parity shards across drives so the cluster survives disk and node failures. Depending on the parity level you choose (commonly expressed as EC:N), usable capacity is a fraction of raw capacity — more parity shards means more resilience but less usable space per terabyte purchased.
  • \n
  • Metadata and inline small objects — buckets with large object counts (millions of small files) carry proportionally more metadata overhead than a bucket with the same total bytes in fewer, larger objects.
  • \n
  • Compaction and versioning — if you enable object versioning or lifecycle transitions, old versions occupy space until they expire. Size for your retention policy, not just your current live dataset.
  • \n
  • Growth buffer — object storage tends to grow monotonically (backups, logs, media archives rarely shrink). Sizing to 100% of today's need means a re-provisioning project in six months.
  • \n
\n

A practical rule of thumb we use when a team asks us to size a MinIO node: take your projected raw bucket size at 12 months, divide by your target usable ratio after erasure coding, then add a growth buffer on top of that. The result is your minimum raw NVMe capacity — round up to the next drive configuration your dedicated server chassis supports.

\n\n

Erasure Coding and Drive Layout Choices

\n

MinIO's erasure coding operates per "erasure set" — a group of drives within a node or across nodes in a distributed deployment. On a single dedicated server, you're choosing a drive layout that trades usable capacity against fault tolerance: more drives in the set generally means better usable-to-raw efficiency, while fewer drives with higher parity means the node tolerates more simultaneous drive failures before data loss risk appears.

\n

NVMe matters here more than spinning disk ever did, because erasure coding math is I/O-and-CPU intensive. A dedicated server with enough cores to handle that reconstruction workload without becoming the bottleneck is worth prioritizing over squeezing out marginally cheaper storage. Our dedicated server lineup scales up to 256 cores / 512 threads with up to 1TB NVMe on the top configuration, which gives plenty of headroom for erasure coding, TLS termination, and concurrent client connections without object throughput becoming CPU-bound.

\n\n

Network and Egress: Where the Savings Actually Show Up

\n

Object storage is only as useful as your ability to get data in and out of it, and this is where self-hosted math diverges hardest from public cloud. Our dedicated servers run port speeds from 1 to 200 Gbps symmetric with no egress or per-retrieval fee — you provision the port, you use it, and the bill doesn't move based on how often an application reads from a bucket. That's the line item public cloud object storage turns into a growth tax for backup restores, media serving, and analytics-heavy workloads.

\n

This also matters for teams running a private object storage server behind application servers on the same network — internal traffic between compute and storage never touches a metered path at all when both sides sit in the same facility.

\n\n

EU Jurisdiction and Data Residency

\n

Where the bucket physically lives determines which legal framework governs the data inside it. Running MinIO on hardware in our EU datacenters keeps bucket contents under EU jurisdiction — a materially different position than storing data with a provider whose object storage backend may span jurisdictions you don't control or even know about. For regulated data or contractual data-residency commitments, that's often the deciding factor over raw price — and it's also the simplest way to satisfy GDPR-aligned handling requirements without bolting on extra compliance tooling.

\n\n

From VPS Testbed to Dedicated Production

\n

You don't need a full dedicated server to learn MinIO's operational quirks. A single-node MinIO instance on our VPS hosting — NVMe-backed, 1 Gbps unmetered — is a reasonable place to validate bucket policies, lifecycle rules, and application integration before committing to dedicated capacity. Once access patterns and retention policy are known quantities, move the real dataset to a dedicated server sized against the math above; skipping that step and guessing at dedicated sizing from a spreadsheet is how teams end up re-provisioning within a quarter.

\n\n

How Noded Can Help

\n

We size MinIO deployments on our own dedicated hardware regularly, and the questions are always the same: how many drives, what parity level, and what happens when a node needs more capacity later. Our dedicated servers give you the NVMe density and core count to run erasure coding without becoming the bottleneck, symmetric port speeds up to 200 Gbps with no egress fees, and EU-based facilities if jurisdiction matters for your data. Every dedicated server ships with free 1 Tbps DDoS protection, so a storage endpoint exposed to application traffic isn't a soft target. If you want a second opinion on drive layout or parity level before you order, we're happy to walk through the numbers against our current dedicated server configurations.

\n\n

FAQ

\n

How much NVMe do I need to self-host MinIO for a 10TB bucket?

\n

Start from your projected 12-month bucket size, divide by your target usable-to-raw ratio after erasure coding parity, then add a growth buffer. For a 10TB live dataset, that typically means provisioning well above 10TB of raw NVMe once parity, metadata, and headroom are accounted for — the exact multiplier depends on the erasure set layout and parity level you choose.

\n

Is MinIO fully S3-API compatible?

\n

Yes. MinIO implements the S3 API surface that most application SDKs and tools rely on for object PUT/GET, multipart uploads, bucket policies, and versioning, which is why it's a common drop-in for teams standardizing on s3 compatible storage self-hosted rather than a proprietary interface.

\n

Can I run MinIO on a VPS instead of a dedicated server?

\n

You can, and it's a sound way to test minio vps hosting for smaller workloads or as a staging environment. For production datasets where drive count, parity level, and sustained I/O throughput matter, a dedicated server gives you direct control over the physical drive layout that a shared VPS environment doesn't.

\n

Does self-hosting MinIO actually save money over cloud object storage?

\n

The savings show up primarily on the egress and retrieval side — cloud object storage bills per-GB for data leaving the bucket, while a dedicated server's bandwidth is a fixed port speed with no per-retrieval charge. Whether the total cost comes out lower depends on your retrieval volume; read-heavy workloads see the biggest shift.

\n

What happens if a drive fails in a self-hosted MinIO deployment?

\n

MinIO's erasure coding is designed to tolerate a configurable number of drive failures within an erasure set without data loss, reconstructing missing shards from parity. This is exactly why parity level is a sizing decision, not an afterthought — more parity means better fault tolerance at the cost of usable capacity.

\n

← All posts

Related services

Run this on NODED.CLOUD.

Keep reading

More from the NOC.

26 Aug 2026·Mario Marin

Self-Hosted Docker Registry on a VPS

A setup and sizing guide for running Docker Distribution or Harbor as a private registry on a VPS, matched to image storage volume and CI pull frequency to avoid Docker Hub's rate limits and per-seat pricing.

Read post
21 Aug 2026·Mario Marin

BYOIP: Running Your Own IP Block on Our Network

A step-by-step BYOIP guide for network operators who already hold their own IPv4/IPv6 block and want to announce it from AS60982 instead of leasing new space, covering LOA and RIPE paperwork, BGP session setup, and which dedicated server tier to pair it with.

Read post
17 Aug 2026·Mario Marin

Dedicated IP for Email Deliverability

A shared sending IP means someone else's spam habits become your bounce problem. Here is how we warm up a dedicated IP, set the PTR record, and keep a self-hosted mail server out of the junk folder.

Read post
14 Aug 2026·Mario Marin

Archiving Twitch VODs on a Storage VPS

Twitch VODs expire fast: as little as 7 days by default, up to 60 for Partners. Here's how we set up an automated pull-and-archive pipeline onto a storage VPS so your back catalog of streams and clips never disappears.

Read post

Like the way we run things? Spin up a server in 60 seconds.