TL;DR — Resumo Rápido

Guia completo do MinIO: arquitetura, modo distribuído, erasure coding, IAM, criptografia, notificações de bucket e implantação Docker Compose em produção.

O MinIO é um sistema de armazenamento de objetos de alto desempenho, nativo do Kubernetes, que implementa a API S3 completa da AWS. Este guia cobre a arquitetura distribuída com erasure coding, IAM integrado, criptografia no lado do servidor, notificações de bucket, replicação entre sites e um stack Docker Compose de produção com nginx. Qualquer ferramenta compatível com S3 — boto3, rclone, Terraform, aws CLI — funciona com MinIO alterando apenas a URL do endpoint.

Pré-requisitos

  • Servidor Linux (Ubuntu 22.04+ ou RHEL 9+) ou Docker 24+.
  • Pelo menos 8 GB de RAM e discos dedicados (não o disco do SO) em produção.
  • Portas 9000 (API) e 9001 (Console) acessíveis.
  • Para modo distribuído: hardware idêntico em todos os nós, DNS resolvendo cada nome de nó e relógios sincronizados (NTP).

Arquitetura: Erasure Coding e Proteção contra Bitrot

O MinIO armazena objetos usando erasure coding (Reed-Solomon). Ao gravar um objeto, ele é dividido em N fragmentos de dados e M fragmentos de paridade — chamados erasure set. Um conjunto de 16 discos com EC:8 fornece 8 dados + 8 paridade: o MinIO pode perder qualquer 8 discos simultaneamente sem perda de dados.

  • Erasure set — unidade de redundância, tipicamente 4–16 discos.
  • Pool de servidores — grupo de nós que formam um único namespace. Adicione pools online para expandir a capacidade.
  • Proteção contra bitrot — cada fragmento tem checksum (HighwayHash); fragmentos corrompidos são reparados a partir da paridade.
  • Criptografia inline — os objetos são criptografados no nível do fragmento antes de serem gravados no disco.

Métodos de Instalação

Método 1: Binário + systemd

wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio && sudo mv minio /usr/local/bin/
sudo useradd -r minio-user -s /sbin/nologin
sudo mkdir -p /data/minio
sudo chown minio-user:minio-user /data/minio

Arquivo /etc/default/minio:

MINIO_ROOT_USER=minioadmin
MINIO_ROOT_PASSWORD=SenhaForte123!
MINIO_VOLUMES="/data/minio"
MINIO_OPTS="--console-address :9001"
sudo systemctl daemon-reload && sudo systemctl enable --now minio

Método 2: Docker

docker run -d --name minio \
  -p 9000:9000 -p 9001:9001 \
  -e MINIO_ROOT_USER=minioadmin \
  -e MINIO_ROOT_PASSWORD=SenhaForte123! \
  -v /data/minio:/data \
  quay.io/minio/minio server /data --console-address ":9001"

Modo Distribuído: Multi-Nó Multi-Disco

export MINIO_ROOT_USER=minioadmin
export MINIO_ROOT_PASSWORD=SenhaForte123!

minio server \
  http://minio-no{1...4}/data/{1...4} \
  --console-address ":9001"

Execute o mesmo comando em todos os nós simultaneamente. A expansão de chaves {1...4} gera os nomes de nó/disco automaticamente.


CLI mc: Referência de Comandos

mc alias set myminio https://minio.exemplo.com minioadmin SenhaForte123!
ComandoDescrição
mc mb myminio/backupsCriar bucket
mc cp arquivo.tar.gz myminio/backups/Enviar arquivo
mc mirror /dir/local myminio/backups/dir/Sincronizar diretório
mc ls myminio/backupsListar objetos
mc version enable myminio/backupsHabilitar versionamento
mc ilm add --expiry-days 30 myminio/backupsRegra de expiração
mc admin info myminioStatus do cluster
mc admin prometheus generate myminioConfig do Prometheus

Gerenciamento de Buckets: Versionamento, Ciclo de Vida e Object Locking

# Habilitar versionamento
mc version enable myminio/meu-bucket

# Expirar versões não atuais após 30 dias
mc ilm add --noncurrentversion-expiration-days 30 myminio/meu-bucket

# Bloqueio WORM (não pode ser desabilitado após ativação)
mc mb --with-lock myminio/bucket-conformidade
mc retention set --default COMPLIANCE "7y" myminio/bucket-conformidade

Gerenciamento de Identidade e Acesso (IAM)

{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Action": ["s3:GetObject", "s3:ListBucket"],
    "Resource": ["arn:aws:s3:::backups", "arn:aws:s3:::backups/*"]
  }]
}
mc admin policy create myminio somente-leitura politica.json
mc admin user add myminio appuser chavesecreta123
mc admin policy attach myminio somente-leitura --user appuser
mc admin user svcacct add myminio appuser

Integração LDAP:

export MINIO_IDENTITY_LDAP_SERVER_ADDR="ldap.corp.exemplo.com:389"
export MINIO_IDENTITY_LDAP_USER_DN_SEARCH_FILTER="(uid=%s)"

Criptografia no Lado do Servidor

# SSE-S3: chave interna
export MINIO_KMS_SECRET_KEY="minha-chave-minio:bXltaW5pb2tleXBhc3N3b3JkMTIzNDU2Nzg="
mc encrypt set sse-s3 myminio/meu-bucket

# SSE-KMS com HashiCorp Vault (via KES)
export MINIO_KMS_KES_ENDPOINT="https://kes.exemplo.com:7373"
export MINIO_KMS_KES_KEY_NAME="minio-chave-principal"
mc encrypt set sse-kms minio-chave-principal myminio/bucket-sensivel

Notificações de Bucket

# Destino webhook
mc admin config set myminio notify_webhook:1 \
  endpoint="https://hooks.exemplo.com/minio" \
  auth_token="Bearer meutoken"
mc admin service restart myminio
mc event add myminio/meu-bucket arn:minio:sqs::1:webhook --event put,delete

# Destino Kafka
mc admin config set myminio notify_kafka:1 \
  brokers="kafka1.exemplo.com:9092" topic="eventos-minio"

Replicação entre Sites

# Replicação ativa-ativa entre dois clusters
mc admin replicate add site-a site-b

# Replicação em nível de bucket para recuperação de desastres
mc version enable site-a/bucket-importante
mc replicate add site-a/bucket-importante \
  --remote-bucket https://adminB:passB@minio-b.exemplo.com/bucket-replica \
  --replicate "delete,delete-marker,existing-objects"

Monitoramento com Prometheus e Grafana

mc admin prometheus generate myminio > /etc/prometheus/minio.yml
MétricaDescrição
minio_cluster_capacity_usable_free_bytesEspaço livre utilizável
minio_cluster_nodes_online_totalNós online
minio_cluster_drive_offline_totalDiscos offline
minio_s3_requests_totalTaxa de requisições

Importe o dashboard do Grafana com ID 13502.


MinIO vs Alternativas

RecursoMinIOCeph RGWSeaweedFSAWS S3
API S3 completaSimSimParcialSim (canônico)
Erasure codingSimSimSimGerenciado
Complexidade de instalaçãoBaixaMuito altaBaixaNenhuma
Nativo do KubernetesSimParcialParcialN/A
Object locking (WORM)SimSimNãoSim
Notificações de bucketSimLimitadoNãoSim (SNS)
IAM / OIDCSimSimNãoSim (IAM completo)

Docker Compose em Produção com nginx

services:
  minio:
    image: quay.io/minio/minio:latest
    restart: unless-stopped
    command: server /data --console-address ":9001"
    environment:
      MINIO_ROOT_USER: "${MINIO_ROOT_USER}"
      MINIO_ROOT_PASSWORD: "${MINIO_ROOT_PASSWORD}"
      MINIO_KMS_SECRET_KEY: "${MINIO_KMS_SECRET_KEY}"
    volumes:
      - minio_data:/data
    healthcheck:
      test: ["CMD", "mc", "ready", "local"]
      interval: 30s
    networks:
      - minio_net

  nginx:
    image: nginx:alpine
    ports:
      - "443:443"
      - "9001:9001"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
      - ./certs:/etc/nginx/certs:ro
    depends_on:
      minio:
        condition: service_healthy
    networks:
      - minio_net

volumes:
  minio_data:
networks:
  minio_net:

Resumo

  • O MinIO oferece um stack completo de armazenamento de objetos compatível com S3 auto-hospedado — erasure coding, IAM, SSE, notificações e replicação.
  • Use nó único para desenvolvimento; modo distribuído com pools de servidores para produção.
  • SSE-KMS + KES para cargas de trabalho regulamentadas que exigem gerenciamento externo de chaves.
  • Object locking (WORM) no modo COMPLIANCE atende SEC 17a-4, FINRA e regulamentações similares.
  • Monitore com Prometheus + dashboard do Grafana 13502.

Artigos Relacionados