MinIO te da tu propio almacenamiento de objetos compatible con Amazon S3, autoalojado con Docker y bajo tu control. En esta guía levantas MinIO con un solo docker-compose.yml, separas la API S3 (puerto 9000) de la consola web (puerto 9001), creas buckets y claves de acceso con el cliente mc, y lo conectas como backend S3 para copias de seguridad, adjuntos de otras aplicaciones y fotos. La misma explicación está disponible en inglés.

Puntos clave

  • MinIO es un servidor de almacenamiento de objetos de alto rendimiento que habla la API de Amazon S3, así que cualquier herramienta que sepa hablar con S3 funciona contra tu MinIO sin cambios.
  • Expone dos puertos: el 9000 para la API S3 (donde se conectan las aplicaciones) y el 9001 para la consola web de administración.
  • Las credenciales raíz se fijan con MINIO_ROOT_USER y MINIO_ROOT_PASSWORD; la contraseña debe tener al menos 8 caracteres (usa 20 o más).
  • Fija una etiqueta concreta como minio/minio:RELEASE.2025-09-07T16-13-09Z en lugar de :latest: de hecho es la última imagen que Docker Hub publicó nunca del proyecto, así que no hay una versión «más nueva» a la que migrar.
  • Desde RELEASE.2025-05-24, la consola de la edición comunitaria solo trae el explorador de objetos: la gestión de usuarios, políticas y claves se hace ahora con el cliente mc.
  • Tanto minio/minio como minio/mc (el cliente que usa esta guía) están archivados en GitHub y ya no reciben parches; la corrección de una vulnerabilidad de escalado de privilegios de octubre de 2025 (CVE-2025-62506) nunca llegó a publicarse como imagen Docker.

¿Qué es MinIO y el almacenamiento de objetos S3?

El almacenamiento de objetos guarda cada archivo como un objeto dentro de un contenedor lógico llamado bucket, con sus metadatos y un identificador único, en lugar de organizarlo en carpetas sobre un disco. Es el modelo que popularizó Amazon S3 y sobre el que se apoyan hoy miles de aplicaciones para guardar copias de seguridad, imágenes, vídeos o adjuntos.

MinIO es un servidor de almacenamiento de objetos que implementa esa misma API de S3, pero que corre en tu servidor. Cualquier cliente, SDK o aplicación pensada para Amazon S3 puede apuntar a tu MinIO cambiando solo la dirección del endpoint. Eso lo convierte en la pieza de almacenamiento de referencia para un homelab: un Duplicati que hace copias cifradas, un Outline que guarda sus adjuntos o una aplicación de fotos, todos pueden escribir en el mismo MinIO como si fuera S3 de Amazon.

Conviene conocer tres hechos recientes antes de empezar. Primero, desde la versión RELEASE.2025-05-24 MinIO retiró las funciones de administración de la consola web de la edición comunitaria: ahora la consola solo permite navegar por los objetos, y la gestión de usuarios, políticas y claves de acceso se realiza con el cliente de línea de comandos mc. Segundo, el repositorio oficial minio/minio en GitHub fue archivado el 25 de abril de 2026, y el de su cliente mc le siguió el 14 de julio de 2026: ninguno de los dos recibirá ya nuevas funciones ni parches revisados. Tercero, la distribución de imágenes Docker se detuvo con esa misma versión de septiembre de 2025, un mes antes de que MinIO publicara la corrección de una vulnerabilidad de escalado de privilegios en cuentas de servicio (CVE-2025-62506, octubre de 2025): esa corrección solo llegó al código fuente, nunca a minio/minio en Docker Hub. Nada de esto te impide autoalojarlo hoy (el servidor sigue siendo funcional y compatible con S3), pero conviene saber que no hay parches nuevos en camino, y explica por qué en esta guía la administración se hace con mc y no desde el navegador.

El docker-compose.yml de MinIO (API y consola)

Necesitas una máquina Linux con Docker y el plugin Compose. Si aún no los tienes, sigue primero la guía para instalar Docker en Ubuntu 24.04. MinIO es ligero para desarrollo (con unos 2 GB de RAM sobra para pruebas), aunque para producción seria su documentación recomienda partir de 32 GB por nodo.

Crea una carpeta para el proyecto y guarda dentro este docker-compose.yml. Cambia la contraseña raíz por una cadena larga y aleatoria:

services:
  minio:
    image: minio/minio:RELEASE.2025-09-07T16-13-09Z
    restart: unless-stopped
    command: server /data --console-address ":9001"
    ports:
      - "9000:9000"
      - "9001:9001"
    environment:
      MINIO_ROOT_USER: admin
      MINIO_ROOT_PASSWORD: cambia_esta_clave_muy_larga
    volumes:
      - minio_data:/data
    healthcheck:
      test: ["CMD", "mc", "ready", "local"]
      interval: 30s
      timeout: 10s
      retries: 5

volumes:
  minio_data:

Fíjate en tres detalles. El comando server /data --console-address ":9001" le dice a MinIO que sirva los datos desde /data y que ponga la consola en el 9001, dejando el 9000 libre para la API. El volumen con nombre minio_data es lo que hace que tus objetos sobrevivan a un reinicio o a una actualización del contenedor. Y el healthcheck usa el propio cliente mc, que viene incluido en la imagen, para marcar el servicio como sano solo cuando está listo para recibir peticiones.

Arranca la pila y sigue los registros:

docker compose up -d
docker compose ps
docker compose logs -f minio

Cuando el registro indique que la API y la consola están escuchando, abre http://localhost:9001 en el navegador y entra con el usuario y la contraseña que pusiste en MINIO_ROOT_USER y MINIO_ROOT_PASSWORD.

¿Cómo crear buckets y claves de acceso?

La consola comunitaria ya no permite crear usuarios ni claves, así que la administración se hace con mc, el cliente oficial de MinIO. Como la imagen del servidor lo trae incorporado, puedes ejecutarlo dentro del propio contenedor con docker compose exec.

Primero configura un alias que apunte a tu servidor y crea un bucket:

docker compose exec minio mc alias set local http://localhost:9000 admin cambia_esta_clave_muy_larga
docker compose exec minio mc mb local/backups
docker compose exec minio mc ls local

Nunca uses las credenciales raíz en tus aplicaciones. Crea una clave de acceso dedicada (una cuenta de servicio ligada al usuario raíz) con permisos que puedas revocar sin tocar la contraseña principal:

docker compose exec minio mc admin user svcacct add local admin \
  --access-key miappclave \
  --secret-key clave_secreta_muy_larga

Ese par access-key / secret-key es lo que darás a cada aplicación cliente. Si necesitas usuarios completos con políticas propias, el comando es mc admin user add seguido de mc admin policy attach.

¿Cómo usar MinIO como backend S3 (copias, adjuntos, fotos)?

Una vez creado el bucket y la clave, cualquier cliente S3 puede escribir en MinIO. La diferencia clave frente a Amazon S3 es que debes activar el path-style: MinIO espera direcciones del tipo http://minio:9000/mibucket en lugar del formato de subdominio de AWS. En la mayoría de SDK y aplicaciones esto es una opción llamada force_path_style o similar.

Si el cliente corre en otro contenedor de la misma red de Docker, el endpoint es el nombre del servicio, http://minio:9000, y no localhost. Una configuración típica para una aplicación cliente incluye estos valores:

      S3_ENDPOINT: http://minio:9000
      S3_REGION: us-east-1
      S3_BUCKET: backups
      S3_ACCESS_KEY: miappclave
      S3_SECRET_KEY: clave_secreta_muy_larga
      S3_FORCE_PATH_STYLE: "true"

Con esto, Duplicati puede guardar copias cifradas e incrementales en el bucket backups, y un Outline puede almacenar sus adjuntos en MinIO en lugar de en el disco del contenedor. La región us-east-1 es un valor de relleno: MinIO no la usa realmente, pero muchos SDK de S3 exigen que exista.

¿Cómo publicar MinIO con Traefik y HTTPS?

En producción no expongas los puertos 9000 y 9001 directamente: colócalos detrás de un proxy inverso como Traefik con certificados válidos. Necesitas dos nombres de dominio, uno para la API y otro para la consola, porque MinIO los sirve en puertos distintos.

Añade a la aplicación las variables MINIO_SERVER_URL (la URL pública de la API) y MINIO_BROWSER_REDIRECT_URL (la de la consola), quita la sección ports, une el servicio a la red de Traefik y define dos routers con estas etiquetas:

    environment:
      MINIO_ROOT_USER: admin
      MINIO_ROOT_PASSWORD: cambia_esta_clave_muy_larga
      MINIO_SERVER_URL: https://s3.midominio.com
      MINIO_BROWSER_REDIRECT_URL: https://consola.midominio.com
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.minio-api.rule=Host(`s3.midominio.com`)"
      - "traefik.http.routers.minio-api.entrypoints=websecure"
      - "traefik.http.routers.minio-api.tls.certresolver=letsencrypt"
      - "traefik.http.routers.minio-api.service=minio-api"
      - "traefik.http.services.minio-api.loadbalancer.server.port=9000"
      - "traefik.http.routers.minio-console.rule=Host(`consola.midominio.com`)"
      - "traefik.http.routers.minio-console.entrypoints=websecure"
      - "traefik.http.routers.minio-console.tls.certresolver=letsencrypt"
      - "traefik.http.routers.minio-console.service=minio-console"
      - "traefik.http.services.minio-console.loadbalancer.server.port=9001"

Las dos variables MINIO_SERVER_URL y MINIO_BROWSER_REDIRECT_URL son imprescindibles tras un proxy: sin ellas, la consola intenta redirigir a localhost y las peticiones fallan. Con ambos dominios apuntando a la IP de tu servidor y Traefik gestionando los certificados de Let’s Encrypt, tendrás la API S3 en https://s3.midominio.com y la consola en https://consola.midominio.com, ambas cifradas.

Preguntas frecuentes

¿Es seguro exponer MinIO a Internet?

La API S3 (puerto 9000) sí puede exponerse porque es el punto por el que se conectan las aplicaciones, siempre tras HTTPS y con claves de acceso dedicadas en lugar de las credenciales raíz. La consola (puerto 9001), en cambio, conviene mantenerla en tu red interna o detrás de una VPN, ya que da acceso administrativo. Nunca dejes el MINIO_ROOT_PASSWORD por defecto ni con menos de 8 caracteres.

¿Por qué la consola ya no tiene opciones de administración?

Porque desde la versión RELEASE.2025-05-24 MinIO trasladó la gestión de usuarios, políticas y claves de acceso de la edición comunitaria al cliente mc, dejando en la consola web solo el explorador de objetos. No es un fallo de tu instalación: es un cambio de producto. Toda la administración descrita en esta guía se hace con mc, que viene incluido en la imagen del servidor.

¿Debo usar la etiqueta latest de la imagen?

No conviene. :latest cambia sin avisarte y puede introducir cambios de comportamiento en un simple reinicio. Al fijar una etiqueta con fecha como minio/minio:RELEASE.2025-09-07T16-13-09Z decides tú cuándo actualizas, puedes leer antes las notas de la versión y volver atrás si algo no encaja con tus aplicaciones. En este caso concreto :latest apunta hoy a esa misma versión, porque no se ha publicado ninguna imagen posterior: fijar la etiqueta con fecha solo te protegerá si en algún momento se retoma la publicación de imágenes.

¿Sigue recibiendo MinIO parches de seguridad?

No, al menos no la imagen Docker que usa esta guía. El proyecto en código abierto está en modo mantenimiento: los repositorios minio/minio y minio/mc están archivados en GitHub y de solo lectura. La última corrección de seguridad conocida, un escalado de privilegios en cuentas de servicio como la que creas en esta guía (CVE-2025-62506), se publicó en octubre de 2025 solo como código fuente, sin una imagen Docker equivalente. Si necesitas garantías de parcheo continuo, valora AIStor (la oferta comercial de MinIO) o alternativas activas como Garage o SeaweedFS; para un homelab, sigue siendo razonable seguir usándolo si restringes el acceso de red y no expones nunca las credenciales raíz.

Conclusión

Con un único docker-compose.yml tienes tu propio almacenamiento de objetos compatible con S3: MinIO sirviendo la API en el 9000 y la consola en el 9001, con los datos en un volumen persistente. La administración se hace con el cliente mc (crear buckets, claves de acceso y usuarios), y el paso lógico siguiente es publicarlo con HTTPS detrás de Traefik y apuntar contra él tus copias de seguridad con Duplicati. A partir de ahí, tus datos viven en tu servidor, hablando el mismo idioma que la nube pero sin depender de ella.

Fuentes: [1] Repositorio de MinIO (minio/minio en GitHub, archivado)[1], [2] Imagen oficial minio/minio en Docker Hub[2], [3] CVE-2025-62506 en la National Vulnerability Database[3].

Fuentes

  1. Repositorio de MinIO (minio/minio en GitHub, archivado)
  2. Imagen oficial minio/minio en Docker Hub
  3. CVE-2025-62506 en la National Vulnerability Database

Ruta: Bases de datos y almacenamiento self-hosted con Docker