753 - ¿Que es S3 y por que lo necesitas para Selfhosting?

753 - ¿Que es S3 y por que lo necesitas para Selfhosting?

MinIO cambia la licencia y quita la GUI. Descubre RustFS, la mejor alternativa S3 autoalojada con consola web para Backups, Jellyfin e Immich.

1:25
-3:15

Hasta hace un año o quizá dos no he utilizado S3 en el mundo del autoalojamiento o selfhosting. Pero desde que empecé a utilizar Minio como solución de almacenamiento, he descubierto que S3 es un estándar de facto en el mundo del almacenamiento en la nube y que muchas aplicaciones lo soportan de forma nativa. Poco a poco se ha ido convirtiendo en una pieza clave, inicialmente para realizar copias de seguridad, pero, con el paso del tiempo, lo estoy utilizando para casi cualquier cosa que te puedas imaginar. Sin embargo, en los últimos tiempos, se han producido determinados sucesos que me han hecho replantear mi uso de S3 autoalojado, no para ir a un SaaS, si no para cambiar de solución. Así, en este episodio, te voy a hablar de S3, que herramientas estaba utilizando hasta hace poco, y cual estoy utilizando actualmente, así también te contaré como puedes hacer tus migraciones y mas cosas.

¿Que es S3 y por que lo necesitas para Selfhosting?

¿Que es S3?

S3 es el estándar de facto para el almacenamiento de datos en la nube. Fue creado por Amzaon, pero se ha convertido en el protocolo universal para guardar grandes cantidades de información sin preocuparse por la estructura del sistema de archivos.

S3 es un protocolo de almacenamiento de objetos. A diferencia de los sistemas de archivos tradicionales, que organizan los datos en una jerarquía de carpetas y archivos, S3 almacena los datos como objetos dentro de cubos (buckets). Cada objeto consta de los datos en sí, junto con metadatos que describen el objeto. No es un Sistema de Archivos Tradicional.

En S3 todo se guarda como un Objeto dentro de un Bucket. Un Bucket es un contenedor lógico para almacenar objetos. Cada bucket tiene un nombre único y puede contener una cantidad ilimitada de objetos. Los objetos dentro de un bucket se identifican mediante una clave única, que es similar a la ruta de un archivo en un sistema de archivos tradicional. Cada objeto se accede a través de una URL única.

La cuestión es que S3 es tan popular porque tiene una API realmente sencilla, de forma que cualquier aplicación, ya sea una web, una herramienta de backup, un proxy inverso, es capaz de relacionarse con S3 de forma nativa para guardar y recuperar datos.

Así, ya te habrás dado cuenta de la potencia de este almacenamiento. Puedes crear una aplicación que no se tiene que preocupar de almacenar nada, solo necesita hablar con su S3, ya sea Amazon S3, Minio, RustFS o cualquier otro servicio compatible con S3.

Sobre todo, la gran ventaja de S3 es su escalabilidad y flexibilidad. Puedes empezar con un pequeño bucket y crecer según tus necesidades, sin preocuparte por la infraestructura subyacente. Así que, S3 te permite tener la misma capacidad infinita de almacenamiento que una nube pero en tu propia casa o en un VPS.

¿Para que puedo utilizar S3?

Hasta ahora simplemente te he has visto que es S3, pero…. ¿Que puedes hacer con S3?¿Para que lo puedes utilizar?

  • Backups Seguros y Versionados. Configura Restic o Duplicity para que envíen las copias de seguridad incrementales de tus servidores web o bases de datos a un bucket en tu RustFS. Restic utiliza el almacenamiento de objetos para deduplicar los datos de manera inteligente, ahorrando espacio.
  • Alojamiento Estático de Sitios Web. Tienes un sitio web documentado con Hugo o Jekyll (que generan HTML, CSS y JS planos). En lugar de usar un servidor web completo (como Nginx), subes todos los archivos al bucket y configuras tu proxy inversop ara que sirva el contenido directamente desde ese endpoint S3.
  • Almacenamiento Multimedia para Aplicaciones. Si utilizas aplicaciones como Plex, Jellyfin o Immich, puedes configurar estas aplicaciones para que utilicen tu endpoint S3 como almacenamiento principal para tus bibliotecas de medios, liberando espacio en tu servidor principal. Si tienes que migrar tu servidor de Jellyfin a una nueva máquina, no tienes que mover los archivos multimedia. Esto, lo puedes aplicacr a cualquier aplicación que maneje archivos multimedia.
  • Almacenamiento de Medios para Contenedores. Tienes una instancia de Nextcloud o WordPress corriendo en Docker. En lugar de guardar los archivos subidos en el volumen del contenedor (que puede ser lento o inestable), configuras la aplicación para que use tu endpoint S3 (RustFS) como almacenamiento principal para todos los archivos de usuario.
  • Servidor de Artefactos de CI/CD. Utiliza el almacenamiento S3 como un repositorio central para guardar los artefactos de construcción (binarios, paquetes compilados, imágenes Docker finales) generados por tus tuberías de Integración Continua (CI/CD).
  • Archivado de Logs y Datos de Observabilidad. Almacena de forma económica y escalable grandes volúmenes de datos que cambian poco, como logs históricos, métricas antiguas o capturas de red. Puedes configurar tu sistema de logging (ej. un stack ELK/Loki/Promtail) para mover los logs de más de 30 días de antigüedad a un bucket archivo-logs.

¿Que es MiniIO?

MinIO es un servidor de almacenamiento de objetos compatible con S3 de código abierto. Está diseñado para ser ligero, rápido y fácil de usar, lo que lo convierte en una opción popular para el autoalojamiento. Históricamente, MinIO ha sido una de las soluciones más populares para implementar S3 autoalojado debido a su simplicidad y rendimiento.

¿Que características tiene MinIO?

  • API S3 Compatible: MinIO implementa la API de Amazon S3, lo que significa que cualquier aplicación que funcione con S3 también funcionará con MinIO sin modificaciones. Esto significa que puedes utilizar MinIO con una amplia variedad de aplicaciones y herramientas que ya soportan S3.
  • Alto Rendimiento: MinIO está optimizado para ofrecer un alto rendimiento en la transferencia de datos, lo que lo hace adecuado para aplicaciones que requieren acceso rápido a grandes volúmenes de datos.
  • Escalabilidad: MinIO puede escalar horizontalmente para manejar grandes cantidades de objetos y datos, lo que lo hace adecuado para entornos de almacenamiento a gran escala.

El desastre

El cambio de licencia de MinIO de la permisiva Apache 2.0 a la estricta AGPL v3 (Affero General Public License, versión 3), que ocurrió en 2020, fue motivado por un objetivo principal de negocio: Proteger sus ingresos y obligar a las grandes empresas de la nube a contribuir.

Esta, no es la primera vez que vemos que una empresa cambia su licencia para supuestamente proteger su modelo de negocio. Anteriormente, hemos visto casos similares con MongoDB y ElasticSearch. En ambos casos, las empresas cambiaron sus licencias para evitar que los proveedores de servicios en la nube ofrecieran sus productos como servicios gestionados sin contribuir al desarrollo del software. MinIO argumentaba que estas empresas estaban monetizando su software (que era gratis y Apache 2.0) y, de hecho, compitiendo contra la propia MinIO por los clientes empresariales, ya que ofrecían el mismo producto sin pagar nada.

Aunque el cambio de licencia ocurrió en 2020, la eliminación de la Consola GUI de la versión abierta, es una maniobra complementaria que sigue la misma lógica,

Valor Añadido al Modelo de Pago. Al quitar funcionalidades de administración esenciales de la versión open source (AGPL), MinIO crea una barrera de entrada para las empresas que quieren la comodidad de una GUI, obligándolas a considerar la suscripción a su versión Enterprise.

Mi opinión sobre este cambio de estrategia

Mi opinión sobre los cambios perpetrados por MinIO se fundamentan en tres puntos clave que reflejan una evolución desde un enfoque de liderazgo en innovación hacia uno centrado en la protección del mercado y el rentismo.

  • La Licencia Permisiva como Motor de Excelencia. La licencia permisiva (Apache 2.0 en el caso de MinIO, o MIT) obliga al proyecto a ser el mejor del mercado, no solo para atraer usuarios, sino para competir constantemente contra sus propios usuarios y la nube. Mientras MinIO usó Apache, su única ventaja competitiva era su rendimiento superior y sus nuevas características. Si Amazon o Google podían tomar su código gratis, MinIO tenía que estar dos pasos por delante para justificar que las empresas pagaran por su soporte. Este ambiente de competencia obligatoria impulsó la innovación de MinIO y lo convirtió en el estándar de facto.
  • El Cambio de Licencia: Un Escudo de Rentismo*. El cambio a la AGPL (Affero General Public License) y la eliminación estratégica de la consola marcan el punto de inflexión donde la prioridad cambió de la innovación a la protección del mercado. El uso de AGPL no buscaba *libertad*, MIT/Apache son más libres), sino obligación. Buscaba obligar a los grandes proveedores de la nube a contribuir o pagar por su uso. Al combinar la AGPL con la eliminación de la Consola de la versión abierta, MinIO estableció una barrera artificial. Ya no tienen que ser *mejores*, solo tienen que hacer que sea *demasiado inconveniente* usar la versión gratuita (CLI obligatoria) y demasiado costoso para que los grandes competidores la integren sin pagar. Esta estrategia es un «impuesto a la comodidad». Intentar vivir de las rentas y de las barreras en lugar de la innovación de código abierto, es lo que hace que se busquen alternativas.
  • El Resultado en el Ecosistema. Al enfocarse en proteger su nicho empresarial y no en el cliente, MinIO dejó de estar en la punta de lanza del desarrollo abierto, y comenzó su declive en popularidad frente a nuevas alternativas que sí mantienen una licencia permisiva y un enfoque en la innovación continua.

¿Que es RustFS?

RustFS es una implementación de un servidor de almacenamiento de objetos compatible con la API de S3 (AWS S3-compatible endpoint). Su propósito es permitir a los usuarios alojar sus propios buckets y datos de manera local o privada, y acceder a ellos usando cualquier herramienta diseñada para S3.

RustFS gana puntos frente al MinIO actual por su enfoque en la comodidad del usuario libre por dos razones fundamentales,

  • Consola de Administración Incluida: A diferencia de MinIO (que ha eliminado la GUI de su versión abierta), RustFS mantiene una interfaz gráfica web para la gestión de usuarios, claves y buckets dentro de la versión de código abierto. Esto devuelve el control y la comodidad al usuario.
  • Simplicidad y Enfoque: El proyecto se enfoca en ser un servidor S3 sólido y sin adornos innecesarios, respetando la filosofía de la modularidad y la transparencia en el software libre.

Instalación de RustFS

La instalación de RustFS, como sucede con MinIO, es bastante sencilla. Aquí tienes un ejemplo de cómo hacerlo utilizando Docker:

services:
  rustfs:
    image: rustfs/rustfs
    container_name: rustfs
    restart: unless-stopped
    init: true
    volumes:
      - data:/data
    networks:
      - proxy
    environment:
      RUSTFS_ACCESS_KEY: ${RUSTFS_ACCESS_KEY}
      RUSTFS_SECRET_KEY: ${RUSTFS_SECRET_KEY}
      RUSTFS_CONSOLE_ENABLE: ${RUSTFS_CONSOLE_ENABLE}
    healthcheck:
      test:
        - CMD
        - sh
        - -c
        - curl -f http://localhost:9000/health && curl -f
          http://localhost:9001/rustfs/console/health
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s
    labels:
      traefik.enable: true
      traefik.http.services.rustfs.loadbalancer.server.port: 9000
      traefik.http.routers.rustfs.entrypoints: https
      traefik.http.routers.rustfs.rule: Host(`${FQDN1}`)
      traefik.http.routers.rustfs.service: rustfs
      traefik.http.services.rustfs-console.loadbalancer.server.port: 9001
      traefik.http.routers.rustfs-console.entrypoints: https
      traefik.http.routers.rustfs-console.rule: Host(`${FQDN2}`)
      traefik.http.routers.rustfs-console.service: rustfs-console
volumes:
  data: {}
networks:
  proxy:
    external: true

Observa que tiene dos puntos de entrada diferentes, uno para la API S3 (puerto 9000) y otro para la consola de administración (puerto 9001). Y por otro lado, el healthcheck comprueba ambos servicios, pero no por fuera, sino directamente en la propia red interna del contenedor. Para evitar castigar al proxy.

Migración de MinIO a RustFS

Esto es probablemente lo que mas pereza te dé, pero en realidad es bastante sencillo. Al fin y al cabo, ambos son compatibles con la API S3, por lo que solo tienes que copiar los datos de un sitio a otro. Esto está muy bien explicado en un artículo del blog de RustFS, y que te recomiendo que visites. Resumiendo los pasos,

# Configura el origen
mc alias set minio https://minio.example.com ADMIN_ACCESS_KEY ADMIN_SECRET_KEY

# Configura el destino
mc alias set rustfs https://rustfs.example.com ADMIN_ACCESS_KEY ADMIN_SECRET_KEY

# Realiza una simulación de la migración
mc mirror --dry-run minio rustfs

# Realiza la migración
mc mirror minio rustfs

# Verifica la migración
mc diff minio rustfs

Más información,

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *