Why I wrote this
After I got one app working on MinIO, I thought I understood the self-hosted storage problem.
That confidence lasted exactly until the next deployment.
The new constraint looked similar: no S3, no managed object storage, media-heavy app, private/generated files, FastAPI backend, browser-facing URLs, and enough user uploads that "just put it in Postgres" would be a crime.
MinIO was the obvious first thought because it had already worked. It is S3-compatible, easy to run, and the boto3 migration story is basically one endpoint_url. But by this point I was also thinking about the enterprise side of the decision. MinIO is still open source, but serious enterprise packaging, support, and newer commercial product positioning live behind MinIO's paid AIStor/subscription world. For a client-owned deployment where the whole premise was "we want control and predictable cost", I wanted to at least look at the other serious self-hosted option.






