Install and configure MinIO object storage with SSL and clustering

Intermediate 45 min Apr 01, 2026 40 views
Ubuntu 24.04 Ubuntu 22.04 Debian 12 AlmaLinux 9 Rocky Linux 9 Fedora 41

Set up MinIO as a distributed S3-compatible object storage cluster with SSL/TLS encryption and production-grade security. This tutorial covers installation, clustering, access policies, and monitoring for high-availability storage infrastructure.

Prerequisites

  • Root or sudo access
  • At least 4GB RAM per node
  • Minimum 2 CPU cores
  • Dedicated storage disks recommended

What this solves

MinIO provides S3-compatible object storage for applications needing scalable file storage, backup systems, or data lakes. This tutorial sets up a production-grade MinIO cluster with SSL/TLS encryption, distributed storage across multiple nodes, and proper access controls for enterprise workloads.

Step-by-step installation

Update system packages

Start by updating your package manager to ensure you get the latest security patches and dependencies.

sudo apt update && sudo apt upgrade -y
sudo apt install -y wget curl unzip
sudo dnf update -y
sudo dnf install -y wget curl unzip

Create MinIO user and directories

Create a dedicated system user for MinIO and set up the required directory structure with proper permissions.

sudo useradd -r -s /bin/false minio-user
sudo mkdir -p /opt/minio/bin
sudo mkdir -p /opt/minio/data
sudo mkdir -p /etc/minio
sudo chown minio-user:minio-user /opt/minio/data
sudo chmod 755 /opt/minio/data

Download and install MinIO server

Download the latest MinIO server binary and MinIO client (mc) for administration tasks.

cd /tmp
wget https://dl.min.io/server/minio/release/linux-amd64/minio
wget https://dl.min.io/client/mc/release/linux-amd64/mc
sudo cp minio /opt/minio/bin/
sudo cp mc /usr/local/bin/
sudo chmod +x /opt/minio/bin/minio
sudo chmod +x /usr/local/bin/mc
sudo chown minio-user:minio-user /opt/minio/bin/minio

Generate SSL certificates

Create SSL certificates for secure HTTPS communication. Use Let's Encrypt for production or generate self-signed certificates for testing.

sudo mkdir -p /opt/minio/certs
sudo openssl req -new -newkey rsa:2048 -days 365 -nodes -x509 \
  -subj "/C=US/ST=State/L=City/O=Organization/CN=minio.example.com" \
  -keyout /tmp/private.key -out /tmp/public.crt
sudo mv /tmp/private.key /opt/minio/certs/
sudo mv /tmp/public.crt /opt/minio/certs/
sudo chown -R minio-user:minio-user /opt/minio/certs
sudo chmod 600 /opt/minio/certs/private.key
sudo chmod 644 /opt/minio/certs/public.crt
Note: For production environments, use proper SSL certificates from a trusted CA or Let's Encrypt instead of self-signed certificates.

Configure MinIO environment

Create the MinIO configuration file with access credentials and server settings. Use strong passwords for production deployments.

MINIO_ROOT_USER=minioadmin
MINIO_ROOT_PASSWORD=StrongPassword123!
MINIO_VOLUMES="https://minio-{1...4}.example.com/opt/minio/data"
MINIO_SERVER_URL="https://minio.example.com:9000"
MINIO_BROWSER_REDIRECT_URL="https://minio-console.example.com:9001"
MINIO_OPTS="--certs-dir /opt/minio/certs --console-address :9001"
sudo chown minio-user:minio-user /etc/minio/minio.conf
sudo chmod 600 /etc/minio/minio.conf

Create systemd service

Set up MinIO as a systemd service for automatic startup and process management.

[Unit]
Description=MinIO Object Storage Server
Documentation=https://docs.min.io
Wants=network-online.target
After=network-online.target

[Service]
Type=notify
User=minio-user
Group=minio-user
EnvironmentFile=-/etc/minio/minio.conf
ExecStart=/opt/minio/bin/minio server $MINIO_OPTS $MINIO_VOLUMES
Restart=always
LimitNOFILE=65536
TimeoutStopSec=infinity
SendSIGKILL=no

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable minio

Configure firewall rules

Open the required ports for MinIO server (9000) and web console (9001) communication.

sudo ufw allow 9000/tcp comment 'MinIO Server'
sudo ufw allow 9001/tcp comment 'MinIO Console'
sudo ufw reload
sudo firewall-cmd --permanent --add-port=9000/tcp
sudo firewall-cmd --permanent --add-port=9001/tcp
sudo firewall-cmd --reload

Set up distributed clustering

Configure multiple MinIO nodes for high availability. Repeat the installation on each node, then update the cluster configuration.

203.0.113.10 minio-1.example.com
203.0.113.11 minio-2.example.com
203.0.113.12 minio-3.example.com
203.0.113.13 minio-4.example.com
sudo systemctl start minio
sudo systemctl status minio
Warning: All nodes in a MinIO cluster must have the same access credentials and be started simultaneously for initial setup.

Configure MinIO client

Set up the MinIO client (mc) to manage your cluster, create buckets, and configure policies.

mc alias set mycluster https://minio.example.com:9000 minioadmin StrongPassword123! --insecure
mc admin info mycluster
mc mb mycluster/test-bucket
mc ls mycluster

Create access policies and users

Set up granular access controls with custom policies for different user roles and applications.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::test-bucket/*",
        "arn:aws:s3:::test-bucket"
      ]
    }
  ]
}
mc admin policy create mycluster readonly-policy /tmp/readonly-policy.json
mc admin user add mycluster testuser TestPassword123!
mc admin policy attach mycluster readonly-policy --user testuser
mc admin user list mycluster

Configure load balancer

Set up a load balancer to distribute traffic across your MinIO cluster nodes for high availability.

upstream minio_servers {
    server minio-1.example.com:9000;
    server minio-2.example.com:9000;
    server minio-3.example.com:9000;
    server minio-4.example.com:9000;
}

server {
    listen 443 ssl http2;
    server_name minio.example.com;

    ssl_certificate /opt/minio/certs/public.crt;
    ssl_certificate_key /opt/minio/certs/private.key;

    client_max_body_size 1000M;

    location / {
        proxy_pass http://minio_servers;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_connect_timeout 300;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        chunked_transfer_encoding off;
    }
}

For more advanced load balancing options, check out our HAProxy tutorial.

Set up monitoring and alerts

Configure MinIO metrics export for monitoring with Prometheus and Grafana dashboards.

mc admin config set mycluster api requests_max=1600 requests_deadline=10s
mc admin config set mycluster heal bitrotscan=on max_sleep=1s max_io=10
mc admin prometheus generate mycluster
mc admin prometheus metrics mycluster

For comprehensive monitoring setup, see our Grafana and Prometheus guide.

Verify your setup

Test your MinIO installation with basic operations and cluster health checks.

sudo systemctl status minio
mc admin info mycluster
mc ls mycluster
echo "Hello MinIO" | mc pipe mycluster/test-bucket/test.txt
mc cat mycluster/test-bucket/test.txt
mc admin heal mycluster --recursive --dry-run
curl -k https://minio.example.com:9000/minio/health/live

Performance optimization

Tune system parameters

Optimize kernel parameters and file system settings for better MinIO performance.

net.core.rmem_default = 262144
net.core.rmem_max = 16777216
net.core.wmem_default = 262144
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 65536 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
vm.swappiness = 1
vm.dirty_background_ratio = 1
vm.dirty_ratio = 5
sudo sysctl -p /etc/sysctl.d/99-minio.conf

Configure disk optimization

Set up XFS file system with optimal mount options for object storage workloads.

sudo mkfs.xfs -f /dev/sdb
sudo mkdir -p /mnt/minio-data
echo '/dev/sdb /mnt/minio-data xfs defaults,noatime,nodiratime,largeio,inode64 0 2' | sudo tee -a /etc/fstab
sudo mount -a

Backup and maintenance

Set up automated backups

Configure regular backups using MinIO's built-in replication or external backup tools.

mc alias set backup-site https://backup.example.com:9000 backupuser backuppass
mc mirror mycluster/important-bucket backup-site/important-bucket --overwrite --remove
mc admin config set mycluster scanner speed=slowest

Schedule maintenance tasks

Create cron jobs for regular cluster health checks and cleanup operations.

# MinIO health check every hour
0     minio-user /usr/local/bin/mc admin heal mycluster --recursive --dry-run > /var/log/minio-heal.log 2>&1

Daily backup at 2 AM

0 2 * minio-user /usr/local/bin/mc mirror mycluster/backups backup-site/daily/$(date +\%Y-\%m-\%d) --overwrite

Common issues

SymptomCauseFix
Service fails to startPermission issues on data directorysudo chown -R minio-user:minio-user /opt/minio/data
SSL certificate errorsIncorrect certificate paths or permissionsCheck cert files exist and chmod 600 private.key
Cluster nodes can't connectFirewall blocking inter-node communicationAllow port 9000 between all cluster nodes
High memory usageDefault cache settings too aggressiveSet MINIO_CACHE_DRIVES and tune cache size
Slow upload performanceNetwork or disk I/O bottlenecksCheck disk performance with iostat and network with iperf3
Browser console not accessibleConsole port not configured or blockedVerify port 9001 is open and --console-address :9001 is set

Next steps

Automated install script

Run this to automate the entire setup

#minio #object-storage #s3-compatible #distributed-storage #ssl-tls

Need help?

Don't want to manage this yourself?

We handle infrastructure for businesses that depend on uptime. From initial setup to ongoing operations.

Talk to an engineer