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.