{"id":1879,"date":"2026-09-05T09:36:19","date_gmt":"2026-09-05T04:06:19","guid":{"rendered":"https:\/\/cpanelfree.com\/blog\/how-to-setup-minio-s3-compatible-object-storage-vps\/"},"modified":"2026-09-05T12:58:55","modified_gmt":"2026-09-05T07:28:55","slug":"how-to-setup-minio-s3-compatible-object-storage-vps","status":"publish","type":"post","link":"https:\/\/cpanelfree.com\/blog\/how-to-setup-minio-s3-compatible-object-storage-vps\/","title":{"rendered":"How to Set Up MinIO S3-Compatible Object Storage on Ubuntu VPS with TLS"},"content":{"rendered":"<h2>Why Self-Host S3-Compatible Storage with MinIO?<\/h2>\n<p>Modern cloud-native applications decouple compute from file storage. Storing user media uploads, PDF documents, database backups, and machine learning models in AWS S3 or Google Cloud Storage is standard practice. However, enterprise cloud providers charge steep monthly storage rates ($0.023\/GB) and aggressive egress bandwidth fees ($0.09\/GB) that quickly become exorbitant for media-heavy platforms.<\/p>\n<p><strong>MinIO<\/strong> is a high-performance, open-source S3-compatible object storage server written in Go. Capable of saturating 10GbE network interfaces with read\/write throughput exceeding 10 GB\/sec, self-hosting MinIO on an NVMe Cloud VPS provides 100% S3 API compatibility with existing SDKs (AWS SDK, Boto3, Strapi, Next.js) at zero egress bandwidth costs.<\/p>\n<p>In this technical implementation guide, we will install MinIO as a systemd service on Ubuntu 24.04\/22.04 LTS, secure storage with Let&#8217;s Encrypt TLS certificates, configure the MinIO Web Console, and manage buckets with the MinIO Client (<code>mc<\/code>) utility.<\/p>\n<h2>Step 1: Installing MinIO Server Binary on Ubuntu VPS<\/h2>\n<p>Download the official pre-compiled Linux deb package for MinIO:<\/p>\n<pre><code># Download latest MinIO Debian package\ncd \/tmp\nwget https:\/\/dl.min.io\/server\/minio\/release\/linux-amd64\/archive\/minio_20240803043323.0.0_amd64.deb\n\n# Install package\nsudo dpkg -i minio_20240803043323.0.0_amd64.deb\n\n# Verify installation\nminio --version<\/code><\/pre>\n<h2>Step 2: Creating Dedicated User &amp; Data Storage Directory<\/h2>\n<pre><code># Create system user and group\nsudo useradd -r minio-user -s \/sbin\/nologin\nsudo groupadd minio-user\n\n# Create persistent storage directories\nsudo mkdir -p \/mnt\/data \/etc\/minio\nsudo chown -R minio-user:minio-user \/mnt\/data \/etc\/minio<\/code><\/pre>\n<h2>Step 3: Configuring MinIO Environment Variables<\/h2>\n<p>Create the configuration file at <code>\/etc\/default\/minio<\/code> with strong cryptographic credentials:<\/p>\n<pre><code># Storage Volume Path\nMINIO_VOLUMES=\"\/mnt\/data\"\n\n# API and Web Console Listening Addresses\nMINIO_OPTS=\"--address 127.0.0.1:9000 --console-address 127.0.0.1:9001\"\n\n# Root Administrator Credentials (Minimum 8 chars)\nMINIO_ROOT_USER=\"minio_admin_user\"\nMINIO_ROOT_PASSWORD=\"UltraSecureMinioPassword2026!\"\n\n# Public Base Server URL\nMINIO_SERVER_URL=\"https:\/\/s3.example.com\"\nMINIO_BROWSER_REDIRECT_URL=\"https:\/\/console-s3.example.com\"<\/code><\/pre>\n<p>Enable and start the MinIO systemd service:<\/p>\n<pre><code>sudo systemctl enable --now minio\nsudo systemctl status minio --no-pager<\/code><\/pre>\n<h2>Step 4: Nginx Reverse Proxy with TLS for S3 API &amp; Web Console<\/h2>\n<p>Create <code>\/etc\/nginx\/sites-available\/minio.conf<\/code> to route API traffic and Console management:<\/p>\n<pre><code># 1. MinIO S3 API Endpoint (s3.example.com)\nserver {\n    listen 80;\n    server_name s3.example.com;\n    client_max_body_size 1000M;\n\n    location \/ {\n        proxy_pass http:\/\/127.0.0.1:9000;\n        proxy_set_header Host $http_host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto $scheme;\n        proxy_connect_timeout 300;\n        proxy_http_version 1.1;\n        chunked_transfer_encoding off;\n    }\n}\n\n# 2. MinIO Web Console GUI (console-s3.example.com)\nserver {\n    listen 80;\n    server_name console-s3.example.com;\n\n    location \/ {\n        proxy_pass http:\/\/127.0.0.1:9001;\n        proxy_http_version 1.1;\n        proxy_set_header Upgrade $http_upgrade;\n        proxy_set_header Connection \"upgrade\";\n        proxy_set_header Host $http_host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto $scheme;\n    }\n}<\/code><\/pre>\n<p>Enable the site and issue SSL certificates:<\/p>\n<pre><code>sudo ln -s \/etc\/nginx\/sites-available\/minio.conf \/etc\/nginx\/sites-enabled\/\nsudo nginx -t &amp;&amp; sudo systemctl reload nginx\nsudo certbot --nginx -d s3.example.com -d console-s3.example.com<\/code><\/pre>\n<h2>Step 5: Managing Buckets with MinIO Client (mc)<\/h2>\n<pre><code># Download and install mc client\ncurl https:\/\/dl.min.io\/client\/mc\/release\/linux-amd64\/mc -o \/usr\/local\/bin\/mc\nchmod +x \/usr\/local\/bin\/mc\n\n# Configure local alias\nmc alias set local https:\/\/s3.example.com minio_admin_user UltraSecureMinioPassword2026!\n\n# Create a public bucket for website uploads\nmc mb local\/media-uploads\nmc anonymous set download local\/media-uploads<\/code><\/pre>\n<h2>MinIO vs AWS S3 Cost and Performance Matrix<\/h2>\n<table style=\"width: 100%;border-collapse: collapse;margin: 20px 0;border: 1px solid #334155\">\n<thead>\n<tr style=\"background-color: #0f172a;color: #38bdf8\">\n<th style=\"padding: 12px;border: 1px solid #334155\">Metric \/ Feature<\/th>\n<th style=\"padding: 12px;border: 1px solid #334155\">Self-Hosted MinIO on NVMe VPS<\/th>\n<th style=\"padding: 12px;border: 1px solid #334155\">AWS S3 Standard<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr style=\"background-color: #1e293b;color: #f8fafc\">\n<td style=\"padding: 10px;border: 1px solid #334155\"><strong>Egress Bandwidth Cost<\/strong><\/td>\n<td style=\"padding: 10px;border: 1px solid #334155\"><strong>$0.00 \/ Unmetered<\/strong><\/td>\n<td style=\"padding: 10px;border: 1px solid #334155\">$0.09 per GB transferred<\/td>\n<\/tr>\n<tr style=\"background-color: #0f172a;color: #f8fafc\">\n<td style=\"padding: 10px;border: 1px solid #334155\"><strong>Read\/Write Throughput<\/strong><\/td>\n<td style=\"padding: 10px;border: 1px solid #334155\"><strong>Direct NVMe Bus (&gt; 1,000 MB\/s)<\/strong><\/td>\n<td style=\"padding: 10px;border: 1px solid #334155\">Network-throttled API requests<\/td>\n<\/tr>\n<tr style=\"background-color: #1e293b;color: #f8fafc\">\n<td style=\"padding: 10px;border: 1px solid #334155\"><strong>API Compatibility<\/strong><\/td>\n<td style=\"padding: 10px;border: 1px solid #334155\"><strong>100% S3 Compliant (v4 signatures)<\/strong><\/td>\n<td style=\"padding: 10px;border: 1px solid #334155\">Native AWS S3 API<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Configuring Bucket Lifecycle Policies &amp; Auto-Expiration<\/h2>\n<p>Avoid accumulating terabytes of temporary log files or old database backup archives by defining automated bucket lifecycle retention policies using the MinIO Client (<code>mc<\/code>):<\/p>\n<pre><code># Create lifecycle rule: Auto-delete files older than 30 days in 'backups' bucket\nmc ilm add --expiry-days 30 local\/backups\n\n# Inspect active lifecycle rules\nmc ilm ls local\/backups<\/code><\/pre>\n<h2>Enabling Server-Side Encryption (SSE-S3) for Compliance<\/h2>\n<p>Protect sensitive financial documents or client backups with automated AES-256 server-side encryption:<\/p>\n<pre><code># Enable automatic encryption on bucket\nmc encrypt set sse-s3 local\/secure-documents\n\n# Verify encryption configuration\nmc encrypt info local\/secure-documents<\/code><\/pre>\n<h2>Connecting MinIO to WordPress with Offload Media Plugin<\/h2>\n<p>Seamlessly offload WordPress media library uploads to MinIO by installing the WP Offload Media or Media Cloud plugin, specifying your custom endpoint (<code>https:\/\/s3.example.com<\/code>) and IAM credentials. All image thumbnails are served directly from MinIO NVMe storage!<\/p>\n<h2>Configuring MinIO Prometheus Metrics &amp; Grafana Dashboards<\/h2>\n<p>MinIO exports comprehensive real-time storage metrics\u2014including active S3 read\/write IOPS, network transfer rates, bucket capacity utilization, and API error codes\u2014via native Prometheus endpoints:<\/p>\n<pre><code># Scrape MinIO metrics in Prometheus configuration (\/etc\/prometheus\/prometheus.yml)\nscrape_configs:\n  - job_name: 'minio'\n    bearer_token: 'YourMinioMetricsJwtToken'\n    metrics_path: '\/minio\/v2\/metrics\/cluster'\n    static_configs:\n      - targets: ['127.0.0.1:9000']<\/code><\/pre>\n<h2>Setting Up Multi-Site Active-Active Bucket Replication<\/h2>\n<p>For disaster recovery across multiple geographic regions, MinIO supports automated, asynchronous bucket-to-bucket replication over HTTPS:<\/p>\n<pre><code># Configure replication target between two MinIO instances\nmc admin bucket remote add local\/media-uploads https:\/\/minio-backup.example.com\/media-uploads   --service \"replication\" --access-key \"KEY\" --secret-key \"SECRET\"\n\n# Enable bidirectional site replication\nmc replicate add local\/media-uploads --priority \"1\"<\/code><\/pre>\n<div style=\"background-color: #0f172a;border-left: 4px solid #38bdf8;padding: 18px 24px;margin: 30px 0;border-radius: 8px\">\n<h3 style=\"color: #38bdf8;margin-top: 0\">Recommended Related Technical Guides<\/h3>\n<ul style=\"margin-bottom: 0;color: #cbd5e1\">\n<li><a href=\"https:\/\/cpanelfree.com\/blog\/how-to-host-strapi-headless-cms-linux-vps-postgresql-pm2\/\" style=\"color: #38bdf8;text-decoration: underline\">Connecting Strapi Media Library to S3 Object Storage<\/a><\/li>\n<li><a href=\"https:\/\/cpanelfree.com\/blog\/how-to-setup-free-ssl-certificate-lets-encrypt-certbot-apache-nginx\/\" style=\"color: #38bdf8;text-decoration: underline\">Setting Up Free Let&#8217;s Encrypt SSL Certificates with Certbot<\/a><\/li>\n<li><a href=\"https:\/\/cpanelfree.com\/blog\/top-10-essential-linux-terminal-commands-webmasters-2026\/\" style=\"color: #38bdf8;text-decoration: underline\">Top 10 Essential Linux Terminal Commands for Webmasters<\/a><\/li>\n<\/ul>\n<\/div>\n<div style=\"background: linear-gradient(135deg, #0284c7 0%, #0369a1 100%);color: #ffffff;padding: 28px;border-radius: 12px;margin: 35px 0;text-align: center\">\n<h3 style=\"color: #ffffff;margin-top: 0;font-size: 22px\">Deploy High-Speed S3 Object Storage on CpanelFree<\/h3>\n<p style=\"color: #e0f2fe;font-size: 15px;max-width: 650px;margin: 0 auto 18px auto\">Scale your media files and backups with pure NVMe storage arrays, unmetered bandwidth, and 100% free hosting and VPS options.<\/p>\n<p>  <a href=\"https:\/\/cpanelfree.com\/\" style=\"background-color: #ffffff;color: #0284c7;font-weight: 700;padding: 12px 28px;border-radius: 8px;text-decoration: none;display: inline-block\">Get Free Cloud Hosting Today &rarr;<\/a>\n<\/div>\n<div style=\"border-left: 4px solid #38bdf8;border-radius: 8px;padding: 20px;margin: 30px 0\">\n<h3 style=\"margin-top: 0;color: #38bdf8;font-size: 18px;display: flex;align-items: center\">\n        <span style=\"margin-right: 8px\">\ud83d\udd17<\/span> Recommended Related Technical Guides:<br \/>\n    <\/h3>\n<ul style=\"margin: 10px 0 0 0;padding-left: 20px;line-height: 1.8\">\n<li><a href=\"https:\/\/cpanelfree.com\/blog\/how-to-host-website-free-forever-guide\/\" style=\"color: #38bdf8;text-decoration: none;font-weight: 600\">How to Host a Website for Free Forever: Complete Beginner Guide (2026)<\/a><\/li>\n<li><a href=\"https:\/\/cpanelfree.com\/blog\/free-wordpress-hosting-softaculous-installer\/\" style=\"color: #38bdf8;text-decoration: none;font-weight: 600\">Top 5 Free WordPress Hosting Services with 1-Click Softaculous Installer<\/a><\/li>\n<li><a href=\"https:\/\/cpanelfree.com\/blog\/how-to-backup-linux-vps-to-cloud-storage-s3-rclone\/\" style=\"color: #38bdf8;text-decoration: none;font-weight: 600\">How to Automatically Backup Your Linux VPS to Cloud Storage (S3 \/ Rclone Guide)<\/a><\/li>\n<li><a href=\"https:\/\/cpanelfree.com\/blog\/how-to-configure-mailcow-dockerized-email-server-ubuntu-vps\/\" style=\"color: #38bdf8;text-decoration: none;font-weight: 600\">How to Configure Mailcow: Dockerized Email Server on Ubuntu VPS (2026)<\/a><\/li>\n<li><a href=\"https:\/\/cpanelfree.com\/#plans\" style=\"color: #10b981;text-decoration: none;font-weight: 600\">Explore $0 Free cPanel Web Hosting Plans (NVMe SSD, AutoSSL)<\/a><\/li>\n<\/ul>\n<\/div>\n<div style=\"background: linear-gradient(135deg, rgba(6, 182, 212, 0.15) 0%, rgba(59, 130, 246, 0.15) 100%);border-radius: 12px;padding: 25px;margin: 30px 0;text-align: center\">\n<h3 style=\"color: #38bdf8;margin-top: 0;font-size: 20px\">Deploy Fast, Reliable Web Hosting on CpanelFree<\/h3>\n<p style=\"color: #94a3b8;font-size: 14px;line-height: 1.6;max-width: 600px;margin: 0 auto 15px\">\n        Get genuine cPanel control, unmetered NVMe SSD storage, and free AutoSSL at $0 cost forever.\n    <\/p>\n<p>    <a href=\"https:\/\/cpanelfree.com\/#plans\" style=\"display: inline-block;background: linear-gradient(135deg, #0284c7 0%, #0369a1 100%);color: #ffffff;padding: 10px 22px;border-radius: 6px;text-decoration: none;font-weight: bold;font-size: 14px\">Claim Free Hosting Account<\/a>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Why Self-Host S3-Compatible Storage with MinIO? Modern cloud-native applications decouple compute from file storage. Storing user media uploads, PDF documents, database backups, and machine learning models in AWS S3 or Google Cloud Storage is standard practice. However, enterprise cloud providers charge steep monthly storage rates ($0.023\/GB) and aggressive egress bandwidth fees ($0.09\/GB) that quickly become [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2506,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[166],"tags":[],"class_list":["post-1879","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-developer-stacks"],"_links":{"self":[{"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/posts\/1879","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/comments?post=1879"}],"version-history":[{"count":3,"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/posts\/1879\/revisions"}],"predecessor-version":[{"id":2306,"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/posts\/1879\/revisions\/2306"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/media\/2506"}],"wp:attachment":[{"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/media?parent=1879"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/categories?post=1879"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/tags?post=1879"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}