TL;DR — Resumen Rápido
Guía completa de MinIO: arquitectura, modo distribuido, codificación de borrado, IAM, cifrado, notificaciones y despliegue Docker Compose en producción.
MinIO es un sistema de almacenamiento de objetos de alto rendimiento, nativo de Kubernetes, que implementa la API S3 completa de AWS. Esta guía cubre la arquitectura distribuida con codificación de borrado, IAM integrado, cifrado del lado del servidor, notificaciones de bucket, replicación entre sitios y un stack Docker Compose de producción con nginx. Cualquier herramienta compatible con S3 — boto3, rclone, Terraform, aws CLI — funciona con MinIO cambiando únicamente la URL del endpoint.
Requisitos Previos
- Servidor Linux (Ubuntu 22.04+ o RHEL 9+) o Docker 24+.
- Al menos 8 GB de RAM y discos dedicados (no el disco del SO) en producción.
- Puertos 9000 (API) y 9001 (Consola) accesibles.
- Para modo distribuido: hardware idéntico en todos los nodos, DNS que resuelva cada nombre de nodo y relojes sincronizados (NTP).
Arquitectura: Codificación de Borrado y Protección contra Bitrot
MinIO almacena objetos mediante codificación de borrado (Reed-Solomon). Al escribir un objeto, lo divide en N fragmentos de datos y M fragmentos de paridad — llamados conjunto de borrado. Un conjunto de 16 discos con EC:8 proporciona 8 datos + 8 paridad: MinIO puede perder cualquier 8 discos simultáneamente sin pérdida de datos.
- Conjunto de borrado — unidad de redundancia, típicamente 4–16 discos.
- Pool de servidores — grupo de nodos que forman un único espacio de nombres. Se agregan pools en línea para expandir capacidad.
- Protección contra bitrot — cada fragmento tiene checksum (HighwayHash); los fragmentos corruptos se reparan desde la paridad.
- Cifrado de datos en línea — los objetos se cifran a nivel de fragmento antes de escribirse en disco.
Métodos de Instalación
Método 1: Binario + 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
Archivo /etc/default/minio:
MINIO_ROOT_USER=minioadmin
MINIO_ROOT_PASSWORD=ContrasenaSegura123!
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=ContrasenaSegura123! \
-v /data/minio:/data \
quay.io/minio/minio server /data --console-address ":9001"
Modo Distribuido: Multi-Nodo Multi-Disco
export MINIO_ROOT_USER=minioadmin
export MINIO_ROOT_PASSWORD=ContrasenaSegura123!
minio server \
http://minio-nodo{1...4}/data/{1...4} \
--console-address ":9001"
Ejecute el mismo comando en todos los nodos simultáneamente. La expansión de llaves {1...4} genera los nombres de nodo/disco automáticamente.
CLI mc: Referencia de Comandos
mc alias set myminio https://minio.ejemplo.com minioadmin ContrasenaSegura123!
| Comando | Descripción |
|---|---|
mc mb myminio/respaldos | Crear bucket |
mc cp archivo.tar.gz myminio/respaldos/ | Subir archivo |
mc mirror /dir/local myminio/respaldos/dir/ | Sincronizar directorio |
mc ls myminio/respaldos | Listar objetos |
mc version enable myminio/respaldos | Habilitar versionado |
mc ilm add --expiry-days 30 myminio/respaldos | Regla de expiración |
mc admin info myminio | Estado del clúster |
mc admin prometheus generate myminio | Config de Prometheus |
Gestión de Buckets: Versionado, Ciclo de Vida y Bloqueo de Objetos
# Habilitar versionado
mc version enable myminio/mi-bucket
# Expirar versiones no actuales después de 30 días
mc ilm add --noncurrentversion-expiration-days 30 myminio/mi-bucket
# Bloqueo WORM (no se puede deshabilitar una vez activado)
mc mb --with-lock myminio/bucket-cumplimiento
mc retention set --default COMPLIANCE "7y" myminio/bucket-cumplimiento
El modo COMPLIANCE bloquea objetos incluso para el usuario root. Use GOVERNANCE para permitir anulaciones administrativas.
Gestión de Identidades y Accesos (IAM)
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:ListBucket"],
"Resource": ["arn:aws:s3:::respaldos", "arn:aws:s3:::respaldos/*"]
}]
}
mc admin policy create myminio solo-lectura politica.json
mc admin user add myminio appuser claveSecreta123
mc admin policy attach myminio solo-lectura --user appuser
mc admin user svcacct add myminio appuser
Integración LDAP:
export MINIO_IDENTITY_LDAP_SERVER_ADDR="ldap.corp.ejemplo.com:389"
export MINIO_IDENTITY_LDAP_USER_DN_SEARCH_FILTER="(uid=%s)"
OpenID Connect (Keycloak, Azure AD):
export MINIO_IDENTITY_OPENID_CONFIG_URL="https://keycloak.ejemplo.com/realms/mi-realm/.well-known/openid-configuration"
export MINIO_IDENTITY_OPENID_CLIENT_ID="minio"
Cifrado del Lado del Servidor
# SSE-S3: clave interna
export MINIO_KMS_SECRET_KEY="mi-clave-minio:bXltaW5pb2tleXBhc3N3b3JkMTIzNDU2Nzg="
mc encrypt set sse-s3 myminio/mi-bucket
# SSE-KMS con HashiCorp Vault (vía KES)
export MINIO_KMS_KES_ENDPOINT="https://kes.ejemplo.com:7373"
export MINIO_KMS_KES_KEY_NAME="minio-clave-principal"
mc encrypt set sse-kms minio-clave-principal myminio/bucket-sensible
Notificaciones de Bucket
# Configurar destino webhook
mc admin config set myminio notify_webhook:1 \
endpoint="https://hooks.ejemplo.com/minio" \
auth_token="Bearer mitoken"
mc admin service restart myminio
mc event add myminio/mi-bucket arn:minio:sqs::1:webhook --event put,delete
# Destino Kafka
mc admin config set myminio notify_kafka:1 \
brokers="kafka1.ejemplo.com:9092" topic="eventos-minio"
Replicación entre Sitios
# Replicación activa-activa entre dos clústeres
mc admin replicate add sitio-a sitio-b
# Replicación a nivel de bucket para recuperación ante desastres
mc version enable sitio-a/bucket-importante
mc replicate add sitio-a/bucket-importante \
--remote-bucket https://adminB:passB@minio-b.ejemplo.com/bucket-replica \
--replicate "delete,delete-marker,existing-objects"
Monitoreo con Prometheus y Grafana
mc admin prometheus generate myminio > /etc/prometheus/minio.yml
| Métrica | Descripción |
|---|---|
minio_cluster_capacity_usable_free_bytes | Espacio libre utilizable |
minio_cluster_nodes_online_total | Nodos en línea |
minio_cluster_drive_offline_total | Discos fuera de línea |
minio_s3_requests_total | Tasa de solicitudes |
Importe el dashboard de Grafana con ID 13502.
MinIO vs Alternativas
| Característica | MinIO | Ceph RGW | SeaweedFS | AWS S3 |
|---|---|---|---|---|
| API S3 completa | Sí | Sí | Parcial | Sí (canónico) |
| Codificación de borrado | Sí | Sí | Sí | Gestionado |
| Complejidad de instalación | Baja | Muy alta | Baja | Ninguna |
| Nativo de Kubernetes | Sí | Parcial | Parcial | N/A |
| Bloqueo de objetos (WORM) | Sí | Sí | No | Sí |
| Notificaciones de bucket | Sí | Limitado | No | Sí (SNS) |
| IAM / OIDC | Sí | Sí | No | Sí (IAM completo) |
Docker Compose en Producción con 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:
Resumen
- MinIO ofrece un stack completo de almacenamiento de objetos compatible con S3 autoalojado — codificación de borrado, IAM, SSE, notificaciones y replicación.
- Use nodo único para desarrollo; modo distribuido con pools de servidores para producción.
- SSE-KMS + KES para cargas de trabajo reguladas que requieren gestión externa de claves.
- Bloqueo de objetos (WORM) en modo COMPLIANCE cumple con SEC 17a-4, FINRA y regulaciones similares.
- Monitoree con Prometheus + dashboard de Grafana 13502.