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!
ComandoDescripción
mc mb myminio/respaldosCrear bucket
mc cp archivo.tar.gz myminio/respaldos/Subir archivo
mc mirror /dir/local myminio/respaldos/dir/Sincronizar directorio
mc ls myminio/respaldosListar objetos
mc version enable myminio/respaldosHabilitar versionado
mc ilm add --expiry-days 30 myminio/respaldosRegla de expiración
mc admin info myminioEstado del clúster
mc admin prometheus generate myminioConfig 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étricaDescripción
minio_cluster_capacity_usable_free_bytesEspacio libre utilizable
minio_cluster_nodes_online_totalNodos en línea
minio_cluster_drive_offline_totalDiscos fuera de línea
minio_s3_requests_totalTasa de solicitudes

Importe el dashboard de Grafana con ID 13502.


MinIO vs Alternativas

CaracterísticaMinIOCeph RGWSeaweedFSAWS S3
API S3 completaParcialSí (canónico)
Codificación de borradoGestionado
Complejidad de instalaciónBajaMuy altaBajaNinguna
Nativo de KubernetesParcialParcialN/A
Bloqueo de objetos (WORM)No
Notificaciones de bucketLimitadoNoSí (SNS)
IAM / OIDCNoSí (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.

Artículos Relacionados