Object storage is foundational to modern applications — user uploads, backups, static assets, data lakes, and ML datasets all end up in an S3-compatible store. The choice between managed cloud storage (GCP Cloud Storage, AWS S3, DigitalOcean Spaces) and self-hosted MinIO is more nuanced than it first appears. I've used both at Commsult Indonesia: GCS for client production workloads, DigitalOcean Spaces for media storage, and MinIO for an internal data pipeline where we needed S3-compatible storage without cloud egress costs. In 2025, MinIO's licensing change adds an important wrinkle to this decision.
GCP Cloud Storage, AWS S3, and DigitalOcean Spaces are S3-compatible (or GCS-compatible) managed object storage services. Zero infrastructure management — no servers to provision, no RAID configurations, no disk replacements. Storage is durable by default (11 nines of durability via multi-zone replication). Scaling is automatic and infinite — you don't plan capacity. IAM integration is built-in. The trade-offs: egress costs (GCS charges $0.08/GB from Asia region to internet; S3 charges $0.09/GB), and you're locked into the provider's API and pricing.
For an Indonesian/Singapore-based deployment, both GCP Cloud Storage and DigitalOcean Spaces have relevant region choices. GCS has asia-southeast1 (Singapore) and a growing presence. DigitalOcean Spaces has a Singapore endpoint. GCS wins on features: storage class lifecycle management, object versioning, bucket lock for compliance, signed URLs, pub/sub notifications on object changes, and BigQuery integration for analytics over stored data. DigitalOcean Spaces wins on simplicity and cost predictability: $21/month for 250GB + 1TB transfer, with no egress charges within that 1TB allowance — a significant advantage for media-heavy applications.
MinIO is an open-source, high-performance object storage system that implements the S3 API completely. You deploy it on any server — a DigitalOcean Droplet, a bare metal server, a Kubernetes cluster. Any application built for AWS S3 works with MinIO without code changes. Performance is excellent: MinIO benchmarks show 325 GiB/s throughput for reads on NVMe storage. The use case sweet spot: data pipelines, ML training data, large backup archives, and hybrid scenarios where data needs to live on-premises or in a specific jurisdiction.
From my experience: MinIO makes most sense for internal data workflows where you need S3 API compatibility without cloud egress costs. Our internal data pipeline moves 200-300GB of log data per day through object storage for batch processing. Running this on GCS would cost $17-25/day in egress alone. Running on MinIO on a DigitalOcean Droplet with 500GB block storage costs $50/month total — no egress charges because everything stays within the same datacenter. The math is obvious for high-volume internal workflows.
MinIO changed its licensing strategy in 2021, moving the community edition to the AGPL-3.0 license. This creates legal complications for commercial use: AGPL requires that modifications to MinIO be open-sourced if the modified version is used to provide a service to users. For most internal deployments (where MinIO is not exposed as a service to external users), AGPL compliance is manageable. For SaaS products that expose MinIO as a storage service, AGPL requires open-sourcing your service layer or purchasing a commercial license. The MinIO Community Edition is no longer maintained with new security patches — commercial use requires the MinIO subscription.
┌────────────────────────────────────────────────────────┐
│ Object Storage Option Comparison │
├────────────────┬───────────────┬───────────────────────┤
│ GCS/S3 │ DO Spaces │ MinIO (self-hosted) │
├────────────────┼───────────────┼───────────────────────┤
│ $0.02/GB/mo │ $21/250GB/mo │ ~$0.10/GB block store │
│ $0.08/GB egress│ 1TB incl. │ $0 egress (internal) │
│ Zero ops │ Zero ops │ Full ops required │
│ 11 nines │ High durability│ Single node = SPOF │
│ Full features │ S3-compatible │ S3-compatible API │
├────────────────┴───────────────┴───────────────────────┤
│ R2 (Cloudflare): $0.015/GB/mo + $0 egress (managed) │
└────────────────────────────────────────────────────────┘Managed cloud storage has zero operational overhead — no servers to patch, no disks to replace, no capacity planning. MinIO requires: server provisioning, disk management (consider erasure coding for data durability with multiple nodes), Nginx proxy configuration for HTTPS, regular updates, and monitoring for disk health and space. A single-node MinIO deployment on a DigitalOcean Droplet is simple to manage but has a single point of failure — if the Droplet has a hardware issue, your storage is unavailable. Distributed MinIO (4+ nodes) provides high availability but significantly increases operational complexity for a small team.
I deployed MinIO on a single DigitalOcean Droplet for a client data archive. The Droplet's block storage volume was attached as MinIO's data directory. Six months later, the Droplet required maintenance that caused a 4-hour outage — the block storage volume couldn't be detached and reattached to a new Droplet in the same time window. Critical data was unavailable for 4 hours during business hours. For business-critical data, use managed cloud storage (GCS or Spaces) or deploy MinIO with at least 4 nodes in an erasure-coded configuration. Single-node MinIO is appropriate only for non-critical internal workloads with separate backup strategies.
Low-volume storage (<100GB, <10GB/month egress): managed cloud storage wins easily — the cost is negligible ($2-5/month) and operational overhead is zero. High-volume internal workflows (100GB-1TB, high throughput, no external egress): MinIO on a dedicated server often wins — fixed infrastructure cost versus variable egress charges. High-volume external-facing storage (images, videos served to users): managed storage + Cloudflare CDN wins — CDN eliminates egress costs, and managed storage's reliability and global reach outweigh MinIO's cost advantage. Compliance or data sovereignty (data must stay on specific hardware in Indonesia): MinIO on bare metal or colocation may be the only option.
# Start MinIO with Docker (single node, dev/internal use)
docker run -d -p 9000:9000 -p 9001:9001 -v /mnt/data:/data -e "MINIO_ROOT_USER=admin" -e "MINIO_ROOT_PASSWORD=change_me_in_prod" --name minio quay.io/minio/minio server /data --console-address ":9001"
# Configure Nginx reverse proxy for MinIO (HTTPS)
# /etc/nginx/conf.d/minio.conf
# server {
# listen 443 ssl;
# server_name storage.internal.example.com;
# location / { proxy_pass http://localhost:9000; }
# }
# Use MinIO Client (mc) to manage buckets
mc alias set myminio https://storage.internal.example.com admin change_me_in_prod
mc mb myminio/data-pipeline
mc cp ./dataset.parquet myminio/data-pipeline/2025/For client production applications at Commsult Indonesia, I default to GCS or DigitalOcean Spaces. Zero operational overhead, enterprise-grade reliability, and the cost is predictable within the project budget. For internal data pipelines, analytics preprocessing, and large backup archives where everything stays within the same datacenter, MinIO on a dedicated Droplet or Compute Engine VM is the right call — cost savings are significant and operational overhead is acceptable for internal tools. The MinIO licensing issue has caused me to evaluate alternatives: SeaweedFS and rclone for specific use cases, and Cloudflare R2 (S3-compatible, zero egress fees, managed) as a strong middle-ground option.
Cloudflare R2 is an S3-compatible managed object storage with zero egress fees. It's managed (no servers), S3-compatible (works with any S3 SDK), and the pricing model ($0.015/GB/month for storage, $0 for egress) eliminates the biggest pain point of AWS S3 and GCS. For applications where egress costs are the primary concern, R2 is often the most cost-effective managed option. The trade-off: fewer features than GCS (no object lifecycle policies, limited metadata filtering), and Cloudflare as a provider has less of a track record for object storage reliability than AWS or GCP. For new projects where egress cost is a concern and advanced GCS features aren't needed, R2 is worth evaluating seriously.