Quick answer
How do I host my own S3-compatible object storage on a rented server?
To host your own S3-compatible object storage on a rented server, run Garage, SeaweedFS, Ceph RGW or MinIO built from source on one many-drive machine, then pick where redundancy lives: erasure coding in the object store or ZFS RAIDZ2 underneath. MinIO's repository was archived on 25 April 2026. Basalthold Hold 100 has 100 TB for $377.05, crypto only, no KYC.
What does one rented machine give an object store?
| Machine | Storage dedicated servers: a whole physical machine built around a bank of hard drives, rented to one customer, with root access to every drive |
|---|---|
| Drives at delivery | The operating system sits on its own SSD (two mirrored SSDs on the larger holds); the data drives arrive blank and unpartitioned, so you can build ZFS, an mdadm array or a set of independent disks. If you want the team to prepare a RAID 6 or RAID 10 array before delivery, say so to support before the server is handed over |
| Hold 100 | Intel Xeon Silver 4210R (10 cores / 20 threads), 128 GB DDR4 ECC, 10 × 10 TB hard drives (100 TB raw) plus 2 × 480 GB SSD for the system, mirrored, 1 Gbit/s port with 120 TB of traffic per 30 days, 1 IPv4 and an IPv6 /64 |
| Hold 160 | AMD EPYC 7302P (16 cores / 32 threads), 128 GB DDR4 ECC, 10 × 16 TB hard drives (160 TB raw) plus 2 × 480 GB SSD for the system, mirrored, 1 Gbit/s port with 200 TB of traffic per 30 days, 1 IPv4 and an IPv6 /64 |
| Systems | Debian 13, Debian 12, Ubuntu 24.04 LTS, AlmaLinux 10, Rocky Linux 10, Proxmox VE 9 and Proxmox Backup Server 4 |
| Encryption | You can encrypt every data drive with LUKS or ZFS native encryption; the keys stay with you and nobody on the team ever asks for them |
| Network | Every server has a 1 Gbit/s port with a monthly traffic allowance (Hold 24 40 TB, Hold 40 60 TB, Hold 100 120 TB, Hold 160 200 TB), one dedicated IPv4 address and an IPv6 /64; going past the allowance never triggers an automatic bill |
| Price per 30 days | Hold 24 $110.99, Hold 40 $201.09, Hold 100 $377.05, Hold 160 $561.39 |
| Payment | Crypto only: BTC, USDT, USDC, ETH, SOL, LTC. No KYC: no ID, no selfie, no documents, no card and no phone number, at any point |
Which S3 server should I run on one machine?
Pick the S3 server by the features your clients need, then size the machine. Versions below are the latest stable releases on the projects' own pages, read on 2 November 2026.
Four S3 servers on one machine (read 2026-11-02)
| Server | Latest release | Licence | Redundancy on one machine | Versioning / object lock |
|---|---|---|---|---|
| Garage | v2.5.0, 24 October 2026 | AGPLv3, written in Rust | None from Garage with replication_factor = 1: put ZFS or mdadm under it | No / no |
| SeaweedFS | 4.52, 2 November 2026 | Apache 2.0, written in Go | Replication, or Reed-Solomon 10+4 erasure coding on sealed volumes | Yes / yes |
| Ceph RGW | Ceph 21.2.0 "Umbrella", 28 October 2026 | LGPL 2.1 or 3, written in C++ | Replicated or erasure-coded pools; one OSD per drive | Yes / yes |
| MinIO community edition | RELEASE.2025-10-15T17-29-55Z, source only | AGPLv3; repository archived in April 2026 | Erasure coding across the drives | Yes / yes |
Garage's S3 compatibility page lists versioning and object lock as missing. Ceph documents object lock in its RGW bucket operations.
- Garage is the lightest: its site asks for 1 GB of RAM. Without versioning or object lock, it suits sync targets and app storage more than locked backups.
- SeaweedFS documents versioning, object lock and erasure coding, all under Apache 2.0. Its project page says it is built for billions of files, and its erasure coding works per volume.
- Ceph RGW is the choice when you plan to grow to several machines. On one host it is heavy: Ceph's own docs call single-host clusters generally not suitable for production.
- MinIO still runs, but its free edition gets no more updates; see the best alternative to MinIO.
Erasure coding or ZFS: where should redundancy live?
Put redundancy in one layer only. Erasure coding on top of RAIDZ2 pays for parity twice and gains little on a single machine.
Design A: separate disks, erasure coding in the object store. MinIO, SeaweedFS and Ceph each split objects into data and parity shards across the drives. A failed drive costs only the shards on it, and the store heals object by object.
Design B: a ZFS pool, no redundancy in the object store. Build RAIDZ2, then run Garage with one replica or SeaweedFS without replication. ZFS checksums every block, repairs from parity, and gives you snapshots and compression on the whole pool.
Our view: on one rented machine, Design B is simpler to run and easier to rescue. One zpool status shows the health of every drive. ZFS snapshots also guard against a deleted bucket. Design A wins when you want per-object healing or plan to add machines later.
Garage needs Design B. Its quick start says a single-node layout gives no redundancy at all. With one copy, Garage's checksums can detect a bad block but cannot rebuild it.
How much usable space does each layout leave?
Usable space depends on how many drives hold parity. OpenZFS gives the RAIDZ rule: N disks with P parity hold about (N − P) × the disk size. MinIO's default parity is EC:4 for sets of 8 drives or more and EC:2 for 5 or fewer. SeaweedFS's 10+4 code stores about 1.4 times the data.
Usable capacity per hold, before filesystem overhead
| Hold | Drives | ZFS layout → usable | MinIO default parity → usable | SeaweedFS 10+4 → usable |
|---|---|---|---|---|
| Hold 24 | 2 × 12 TB HDD | Mirror → 12 TB | 1 data + 1 parity → 12 TB | — |
| Hold 40 | 4 × 10 TB HDD | RAIDZ2 → 20 TB (RAIDZ1 → 30 TB) | EC:2 → 20 TB | — |
| Hold 100 | 10 × 10 TB HDD | RAIDZ2 → 80 TB | EC:4 → 60 TB | about 71 TB |
| Hold 160 | 10 × 16 TB HDD | RAIDZ2 → 128 TB | EC:4 → 96 TB | about 114 TB |
Calculations from the drive counts, with 1 TB = 10^12 bytes as drives are sold. MinIO parity can be lowered: EC:2 on 10 drives keeps 80%, the same as RAIDZ2. Two-drive holds have no room for a 10+4 code.
RAIDZ2 on ten drives survives two failures, and so does MinIO at EC:2. The default EC:4 survives four, at the cost of 20 more points of raw space. Large drives take long to rebuild, so read how long a RAIDZ2 rebuild takes with large drives before you choose single parity.
How long does the first upload take?
At 1 Gbit/s, the best case is 125 MB per second. Filling Hold 100 after RAIDZ2 (80 TB) takes at least 7.4 days. Filling Hold 160 (128 TB) takes at least 11.9 days.
These are line-rate calculations, not measurements: real transfers run slower. Each hold's monthly allowance is larger than one full fill: Every server has a 1 Gbit/s port with a monthly traffic allowance (Hold 24 40 TB, Hold 40 60 TB, Hold 100 120 TB, Hold 160 200 TB), one dedicated IPv4 address and an IPv6 /64; going past the allowance never triggers an automatic bill. Plan a big migration in parallel streams, for example with rclone copy --transfers 16.
How do I set up Garage on a ZFS pool?
This is Design B on Hold 100: ten data drives in RAIDZ2, metadata on the mirrored system SSDs. Garage's deployment guide puts metadata on SSD and data on hard drives. Replace the device names and secrets with your own.
# 1. RAIDZ2 pool on the ten blank data drives (use /dev/disk/by-id names)
zpool create -o ashift=12 tank raidz2 /dev/disk/by-id/ata-HDD1 /dev/disk/by-id/ata-HDD2 ... /dev/disk/by-id/ata-HDD10
zfs create -o compression=lz4 -o atime=off tank/garage
# 2. /etc/garage.toml (metadata on the system SSD, data on the pool)
metadata_dir = "/var/lib/garage/meta"
data_dir = "/tank/garage"
db_engine = "sqlite"
replication_factor = 1
rpc_bind_addr = "[::]:3901"
rpc_public_addr = "127.0.0.1:3901"
rpc_secret = "<openssl rand -hex 32>"
[s3_api]
s3_region = "garage"
api_bind_addr = "[::]:3900"
[admin]
api_bind_addr = "127.0.0.1:3903"
admin_token = "<openssl rand -base64 32>"
# 3. Layout, bucket and key
garage status
garage layout assign -z dc1 -c 70T NODE_ID # NODE_ID from garage status; leave headroom
garage layout apply --version 1
garage bucket create backups
garage key create backup-key
garage bucket allow --read --write --owner backups --key backup-keyGarage answers S3 calls on port 3900 over plain HTTP, so put a TLS proxy such as Caddy or nginx in front. Close 3901 and 3903 to the internet. Garage has no object lock, so ZFS snapshots do that job. The method is on how to make backups immutable on your own server.
Is a rented server cheaper than cloud object storage?
Per terabyte, the ten-drive holds cost less than Backblaze B2 or Wasabi, and the server bills no egress or API calls. Hold 100 costs $3.77/TB per raw TB and Hold 160 $3.50/TB. As of 2 November 2026, Backblaze B2 lists $6.95 per TB a month and Wasabi $7.99.
Raw is not usable, though. RAIDZ2 on ten drives keeps 80%, so each usable TB costs a quarter more than each raw TB. Both ten-drive holds stay below B2 even then. On a two-drive hold a mirror halves the space, and the cloud wins. The cloud also keeps your data in more than one place, which one server does not. The full sum, with egress, is on is a rented storage server cheaper than Backblaze B2 or Wasabi. Every hold is on the Basalthold pricing page.
Self-hosted S3: quick answers
Can I run S3-compatible storage on a single rented server?
Yes. Garage, SeaweedFS and MinIO all run on one machine, and Ceph RGW can with its single-host settings. Protect the data with RAIDZ2 underneath or erasure coding across the drives, never with nothing. One server is still one place, so keep a second copy elsewhere.
How much RAM does a self-hosted S3 server need?
Garage asks for 1 GB. Ceph is the hungry one: its docs recommend at least 6 GiB per hard-drive OSD, so ten drives want about 60 GiB. ZFS also uses RAM as cache; see how much RAM ZFS needs. Hold 100 and Hold 160 carry 128 GB DDR4 ECC.
Which self-hosted S3 server supports object lock for backups?
SeaweedFS, Ceph RGW and MinIO document object lock; Garage does not. Object lock keeps an object version from being deleted until its retention date. With Garage, protect backups with ZFS snapshots or an append-only backup tool instead.
Can I encrypt the drives under my object store?
Yes. You can encrypt every data drive with LUKS or ZFS native encryption; the keys stay with you and nobody on the team ever asks for them. A remote reboot then needs a way to enter the key; unlocking LUKS remotely shows one.
Is MinIO still free to self-host?
The community code stays under AGPLv3, but its repository was archived in April 2026 and gets no updates. MinIO now points community users to AIStor Free, a single-node edition under a free licence that limits redistribution and resale.
Sources (18)
- Garage releases (v2.5.0) — Deuxfleurs (read 2026-11-02)
- Garage home page (hardware requirements) — Deuxfleurs (read 2026-11-02)
- Garage quick start — Deuxfleurs (read 2026-11-02)
- Garage: S3 compatibility status — Deuxfleurs (read 2026-11-02)
- Garage: deployment on a cluster — Deuxfleurs (read 2026-11-02)
- SeaweedFS release 4.52 — SeaweedFS (read 2026-11-02)
- SeaweedFS: erasure coding for warm storage — SeaweedFS (read 2026-11-02)
- SeaweedFS: Amazon S3 API — SeaweedFS (read 2026-11-02)
- v21.2.0 Umbrella released — Ceph (read 2026-11-02)
- Deploying a new Ceph cluster (single-host defaults) — Ceph documentation (read 2026-11-02)
- CPU and memory sizing — Ceph documentation (read 2026-11-02)
- RGW bucket operations (object lock) — Ceph documentation (read 2026-11-02)
- MinIO repository (archived) — MinIO (read 2026-11-02)
- MinIO erasure code quickstart guide — MinIO (read 2026-11-02)
- MinIO storage class (default parity) — MinIO (read 2026-11-02)
- MinIO object lock and immutability guide — MinIO (read 2026-11-02)
- SeaweedFS repository (description, licence) — SeaweedFS (read 2026-11-02)
- RAIDZ — OpenZFS documentation (read 2026-11-02)
Rent the drives for your own S3
Hold 100: 10 × 10 TB HDD for $377.05. Hold 160: 10 × 16 TB HDD for $561.39. Blank data drives and root over SSH. Crypto payment, no KYC.
- DomaineGoat LLC, registered in Panama
- Prices surveyed across 23 storage sellers, 2 November 2026
- No KYC, no documents
- Your encryption keys stay yours