Skip to content

PutFS

A simple PUT and DELETE API over a plain directory hierarchy. Wired together with optimized nginx and a well-tuned ZFS, a few lines of async Python outperform MinIO at scale.

And we didn't even port to Rust.

Why

MinIO became AIStor. The upgrade path is $96,000 per year. The alternatives – Ceph, SeaweedFS, Garage – are solid open source projects, but each solves a different problem than "I have a server, I need to store and retrieve files over HTTP."

For most web applications, we just need that HTTP endpoint. Fast. That's PutFS.

This repository (and PutFS itself) is not a full-stack storage application, but the documentation of our ongoing research on how to replace self-hosted MinIO for OpenAleph, plus a collection of useful configurations and tweaks that might be interesting for other projects facing similar challenges. Read more about the rationales behind all of this1.

How

How PutFS works

A thin Starlette process handles writes. Nginx serves reads directly from disk via the kernel's sendfile – Python is never involved in the read path. There is no metadata database, no custom format, no distributed consensus.

Systems like MinIO reinvent what the kernel and filesystem already do – their own metadata stores, caching layers, and storage formats. Every read and write passes through layers of abstraction. PutFS skips all of that.

Features

By delegating to existing tools, we get a full feature set similar to MinIO/RustFS for free:

  • Auth – nginx map-based keys with path/method scoping, or auth_request to anything.
  • Replication – zrepl, rsync, rclone, plus smart load balancers.
  • Versioning – Snapshots via ZFS/btrfs/LVM.
  • Storage tiering – Make a HDD pool feel like SSD.
  • Presigned URLs – nginx secure_link, IP-bound, method-bound, even better than S3.
  • Encryption – ZFS native encryption or LUKS.

And even more

Advantages

  • No vendor lock-in: plain files on disk. ls works. rsync works. If PutFS disappears, our data doesn't.
  • Small attack surface: ~100 lines of Python, hidden behind nginx auth. Everything else provided by the filesystem, OS/kernel or battle-tested UNIX tooling. Audited by millions of deployments out there everyday.

S3 compat

But can it speak S3?

For our use case, patching the storage connector to work with PutFS over plain HTTP is the better solution. But we wrote a minimal compatibility layer for S3 so that awscli, boto3 and similar tooling can work as well, but thats more an experiment than a production use recommendation.

License

Apache 2.0. because reasons. Use it, modify it, do whatever with it. Even run it as a managed service if you can suffer the absence of good sleep.


  1. After building PutFS we stumbled upon a similar idea by pretix.eu