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!
Comando Descrição
mc mb myminio/backups Criar bucket
mc cp arquivo.tar.gz myminio/backups/ Enviar arquivo
mc mirror /dir/local myminio/backups/dir/ Sincronizar diretório
mc ls myminio/backups Listar objetos
mc version enable myminio/backups Habilitar versionamento
mc ilm add --expiry-days 30 myminio/backups Regra de expiração
mc admin info myminio Status do cluster
mc admin prometheus generate myminio Config 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étrica Descrição
minio_cluster_capacity_usable_free_bytes Espaço livre utilizável
minio_cluster_nodes_online_total Nós online
minio_cluster_drive_offline_total Discos offline
minio_s3_requests_total Taxa de requisições

Importe o dashboard do Grafana com ID 13502.


MinIO vs Alternativas

Recurso MinIO Ceph RGW SeaweedFS AWS S3
API S3 completa Sim Sim Parcial Sim (canônico)
Erasure coding Sim Sim Sim Gerenciado
Complexidade de instalação Baixa Muito alta Baixa Nenhuma
Nativo do Kubernetes Sim Parcial Parcial N/A
Object locking (WORM) Sim Sim Não Sim
Notificações de bucket Sim Limitado Não Sim (SNS)
IAM / OIDC Sim Sim Não Sim (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