Hay un problema que aparece tarde o temprano cuando llevas un tiempo con el homelab: necesitas almacenamiento de objetos compatible con S3. No porque seas Amazon, sino porque muchas herramientas modernas hablan S3 de forma nativa. Velero para backups de Kubernetes. Loki para logs. Restic, Rclone, Backblaze. Incluso algunas aplicaciones como Immich o Seafile pueden usar S3 como backend.
Si dependes de AWS S3 real, tienes un coste mensual variable y tus datos en manos de Amazon. MinIO resuelve eso: un servidor de objetos que habla la misma API que S3, que corres en tu propio hardware.
Lo tengo en producción haciendo de backend para los backups de mi cluster Kubernetes desde hace tiempo. Te cuento qué es, cómo instalarlo y para qué sirve realmente.
Qué es MinIO#
MinIO es un servidor de almacenamiento de objetos. Guarda archivos (objetos) en buckets, igual que S3. La diferencia es que lo corres tú en tu propio servidor.
La compatibilidad con la API de S3 es total: si una herramienta soporta S3, puede usar MinIO sin cambios. Solo tienes que cambiar el endpoint y las credenciales. Eso es el verdadero valor de MinIO: no tienes que aprender una API nueva ni adaptar nada.
Está escrito en Go, es extremadamente rápido, y puede funcionar tanto en modo servidor único como en clúster distribuido con varios nodos y erasure coding. Para homelab, el modo servidor único es más que suficiente.
Para qué lo uso en mi homelab#
Antes de entrar en la instalación, te cuento los casos de uso concretos donde lo tengo integrado, porque creo que es más útil que una lista abstracta de características.
Backups de Kubernetes con Velero: Velero necesita un backend de objetos para guardar los snapshots del cluster. Puede usar AWS S3, Google Cloud Storage o cualquier backend compatible. MinIO es la opción obvia para homelab. Cada backup del cluster (deployments, configmaps, PVCs) va a un bucket en MinIO.
Backups de bases de datos: Tengo scripts que hacen dump de PostgreSQL y MySQL periódicamente y suben el resultado a MinIO. Rclone puede montar MinIO como si fuera un sistema de archivos o usarlo directamente para sincronizar.
Almacenamiento secundario para aplicaciones: Algunas aplicaciones como Loki (agregación de logs) pueden usar S3 como backend. En vez de crecer sin límite en disco local, Loki va escribiendo sus chunks a MinIO.
Artefactos de builds: Si tienes pipelines de CI/CD que generan artefactos, MinIO es un buen lugar para guardarlos de forma accesible y versionada.
No lo uso como almacenamiento principal de archivos para el día a día. Para eso prefiero un NAS con Samba o NFS. MinIO brilla para datos estructurados que las aplicaciones necesitan leer y escribir programáticamente.
Instalación con Docker#
La forma más rápida de probar MinIO es con Docker. Para producción uso Docker Compose con un volumen persistente.
Crea la carpeta del proyecto:
| |
Crea el archivo docker-compose.yml:
| |
El puerto 9000 es la API S3. El 9001 es la consola web de administración.
Levanta el contenedor:
| |
Accede a la consola en http://tu-servidor:9001 con las credenciales que pusiste en el compose. Verás un panel desde donde puedes crear buckets, gestionar usuarios y monitorizar el estado.
Instalación como binario (sin Docker)#
Si prefieres no usar Docker, MinIO tiene binarios estáticos que funcionan sin dependencias.
| |
Crea el directorio de datos y un usuario de sistema:
| |
Crea la configuración en /etc/default/minio:
| |
Crea el servicio systemd en /etc/systemd/system/minio.service:
| |
Activa e inicia el servicio:
| |
Crear buckets y usuarios#
Desde la consola web puedes hacer casi todo, pero el cliente de línea de comandos mc (MinIO Client) es más versátil para automatizar.
Instala mc:
| |
Configura el alias para tu servidor:
| |
Desde ahora puedes usar mi-minio como alias en los comandos de mc.
Crea tu primer bucket:
| |
Verifica que funciona:
| |
Sube un archivo de prueba:
| |
Usuarios y políticas de acceso#
El usuario root que configuraste al instalar tiene acceso total. Para producción es mala idea usar esas credenciales en las aplicaciones. Mejor crear usuarios con permisos específicos.
Desde la consola web, ve a Identity > Users > Add User. Crea un usuario con el nombre que quieras. Luego asígnale políticas.
MinIO viene con políticas predefinidas:
readonly: solo lecturawriteonly: solo escriturareadwrite: lectura y escrituradiagnostics: para monitorización
También puedes crear políticas personalizadas en JSON. Por ejemplo, una política que solo permite acceder a un bucket específico:
| |
Con esto el usuario solo puede ver y modificar el bucket backups, y no tiene acceso al resto.
Integrar MinIO con Velero (backups Kubernetes)#
Este es el caso de uso que más me interesaba. Velero es la herramienta estándar para hacer backups de clusters Kubernetes. Necesita un backend de objetos para guardar los snapshots.
Primero, crea un bucket en MinIO específico para Velero:
| |
Crea un usuario de servicio con acceso solo a ese bucket. En la consola web: Identity > Service Accounts > Add Service Account. Guarda las credenciales generadas.
Crea el archivo de credenciales para Velero:
| |
Instala Velero apuntando a MinIO:
| |
El s3ForcePathStyle=true es importante para MinIO: fuerza el formato de URL servidor/bucket en vez del formato de subdominios que usa AWS real.
Verifica que Velero puede conectarse:
| |
Si el estado dice “Available”, todo va bien. Lanza un backup de prueba:
| |
En unos segundos verás el backup creado y en MinIO aparecerá el objeto correspondiente en el bucket velero.
Integrar MinIO con Rclone#
Rclone es la navaja suiza del almacenamiento. Puede sincronizar entre casi cualquier sistema de archivos o servicio cloud. Con MinIO como backend, puedes usar Rclone para:
- Sincronizar carpetas locales a MinIO
- Mover datos entre MinIO y otros servicios (Backblaze, S3 real, etc.)
- Montar MinIO como sistema de archivos local
Configura MinIO en Rclone:
| |
Elige “New remote”, nombre “minio-homelab”, tipo “s3”, proveedor “Minio”. Introduce el endpoint, access key y secret key. Deja el resto por defecto.
O directamente edita ~/.config/rclone/rclone.conf:
| |
Prueba la conexión:
| |
Sincronizar una carpeta local a MinIO:
| |
Montar MinIO como directorio local:
| |
Este último comando es útil si quieres que las aplicaciones que no soportan S3 nativamente puedan usar MinIO como si fuera un disco normal.
Políticas de lifecycle (retención automática)#
Una cosa muy práctica de MinIO es que puedes definir reglas de ciclo de vida para los objetos. Por ejemplo, eliminar automáticamente backups que tengan más de 30 días.
Desde la consola web: Buckets > tu-bucket > Lifecycle. Añade una regla:
- Status: Enabled
- Prefix: dejar vacío (aplica a todo el bucket)
- Expiry: número de días hasta que los objetos se eliminan
Con mc también puedes hacerlo:
| |
Con esto los backups más viejos de 30 días desaparecen automáticamente. No tienes que acordarte de limpiar manualmente ni escribir scripts. Es una de esas pequeñas cosas que marcan la diferencia en un sistema que quieres que funcione solo.
Monitorización#
MinIO expone métricas en formato Prometheus. Si ya tienes Prometheus configurado en tu homelab (si no, puedes ver el post sobre Grafana y Prometheus), añade MinIO como target.
La URL de métricas es: http://tu-servidor:9000/minio/v2/metrics/cluster
Para acceder a las métricas necesitas un token de bearer. Genéralo desde la consola web: Monitoring > Metrics > Generate Prometheus Config. Te da el bloque de configuración listo para pegar en tu prometheus.yml.
MinIO también tiene un dashboard de Grafana oficial en el ID 13502. Lo importas en Grafana y tienes visibilidad de operaciones por segundo, latencias, uso de disco y estado del cluster.
Rendimiento#
Para homelab con un solo disco o RAID, MinIO va muy bien. Los números dependen completamente del disco subyacente. En mi servidor con disco SATA SSD:
- Escritura secuencial: cerca de 400 MB/s (prácticamente el límite del disco)
- Lectura secuencial: similar
- Operaciones pequeñas: la latencia es baja, funciona bien para miles de archivos pequeños
Si necesitas más rendimiento, MinIO soporta modo distribuido con varios nodos y erasure coding. Pero para backups de homelab el modo single-node es más que suficiente.
Backups del propio MinIO#
El dato crítico: si MinIO guarda tus backups, ¿qué pasa si falla el servidor donde corre MinIO?
Hay dos enfoques.
Enfoque 1: Replicación a otro destino
MinIO tiene replicación de buckets integrada. Puedes configurar que un bucket se replique automáticamente a otro servidor MinIO, a S3 de Amazon, o a Backblaze B2.
| |
Enfoque 2: Backup del directorio de datos
Más simple: el directorio de datos de MinIO (/mnt/datos-minio) son simplemente archivos en el sistema de archivos del servidor. Puedes hacer backup de ese directorio con Restic, rsync o cualquier herramienta.
| |
Yo uso los dos: Rclone sincroniza los buckets más importantes a Backblaze B2 una vez al día, y Restic hace snapshot del directorio completo semanalmente.
¿Cuándo tiene sentido MinIO?#
Vale la pena si:
- Tienes aplicaciones que hablan S3 (Velero, Loki, Restic con backend S3, etc.)
- Quieres centralizar almacenamiento de backups con una API estándar
- Manejas volúmenes de datos medianos o grandes y quieres control total
No tiene tanto sentido si:
- Solo necesitas guardar archivos para acceso manual: mejor un NAS con Samba
- Tu carga es poca y no te importa depender de AWS: S3 real es más simple
- Empiezas y quieres lo mínimo: hay cosas más urgentes en el homelab
Lo que me convenció fue que varias herramientas que ya quería usar (Velero, Loki) necesitaban un backend S3. Montar MinIO una sola vez y que todas las herramientas lo usen es más limpio que gestionar diferentes sistemas de almacenamiento para cada una.