Despliega un CMS Headless Strapi + S3 Local: Tu API de Contenidos con Docker Compose

Despliega un CMS Headless Strapi + S3 Local: Tu API de Contenidos con Docker Compose

¿Quieres crear rápidamente una API de contenidos lista para producción, sin atarte a WordPress ni depender de servicios en la nube? Hoy te traigo un proyecto avanzado y súper práctico: desplegar Strapi, uno de los CMS headless más populares, junto con MinIO (emulando S3 de Amazon para multimedia) y MySQL, todo gestionado desde un solo docker-compose.yml. Así podrás tener tus datos y archivos donde quieras, listos para ser consumidos por apps móviles, sitios estáticos o cualquier frontend.
¡Vamos allá, que esto mola y es mucho más fácil de lo que piensas!

¿Por qué Strapi + MinIO?

  • Strapi: Framework headless open source en Node.js, flexible y con panel de administración elegante.
  • MinIO: Compatible con la API S3 de Amazon, para guardar imágenes y ficheros localmente sin depender de la nube.
  • MySQL: Base de datos probada y robusta, ideal para datos estructurados.
  • Perfecto para centralizar contenidos y archivos dentro de tu propia infraestructura, ¡y todo en contenedores!

¿Qué vas a desplegar?

  • Un Strapi backend strapi:latest comunicado con MySQL.
  • Un MinIO server actuando como tu propio “bucket S3” para los ficheros subidos por Strapi.
  • Un MySQL con volúmenes persistentes.
  • Red interna para máxima seguridad, y puertos bien definidos.
  • Configuración lista para que los uploads se guarden en MinIO gracias a @strapi/provider-upload-aws-s3 configurado vía variables de entorno.

docker-compose.yml completo

Copia este archivo tal cual y ajústalo a tus necesidades (cambia contraseñas antes de usarlo en producción):

version: "3.8"

services:
  mysql:
    image: mysql:8
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: strapiRootPass
      MYSQL_DATABASE: strapidb
      MYSQL_USER: strapiuser
      MYSQL_PASSWORD: strapipass
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - backend

  minio:
    image: minio/minio:latest
    restart: always
    command: server /data --console-address ":9001"
    ports:
      - "9000:9000"    # API S3 compatible
      - "9001:9001"    # Panel web MinIO
    environment:
      MINIO_ROOT_USER: minioadmin
      MINIO_ROOT_PASSWORD: minioadminpass
    volumes:
      - minio_data:/data
    networks:
      - backend

  strapi:
    image: strapi/strapi:latest
    depends_on:
      - mysql
      - minio
    ports:
      - "1337:1337"
    environment:
      DATABASE_CLIENT: mysql
      DATABASE_HOST: mysql
      DATABASE_PORT: 3306
      DATABASE_NAME: strapidb
      DATABASE_USERNAME: strapiuser
      DATABASE_PASSWORD: strapipass
      DATABASE_SSL: "false"
      # Configuración provider S3 (MinIO)
      AWS_ACCESS_KEY_ID: minioadmin
      AWS_ACCESS_SECRET: minioadminpass
      AWS_REGION: us-east-1
      AWS_BUCKET: uploads
      AWS_ENDPOINT: http://minio:9000
      AWS_S3_FORCE_PATH_STYLE: "true"
      # ¿Quieres superadmin auto? Descomenta y edita
      # STRAPI_ADMIN_EMAIL: [email protected]
      # STRAPI_ADMIN_PASSWORD: clavesegura
      # STRAPI_ADMIN_FIRSTNAME: TuNombre
      # STRAPI_ADMIN_LASTNAME: Apellido
    networks:
      - backend
    volumes:
      - ./strapi-app:/srv/app

volumes:
  db_data:
  minio_data:

networks:
  backend:
    driver: bridge

Pasos rápidos de uso

  1. Inicia los servicios:

    docker-compose up -d
  2. Accede a Strapi:
    http://localhost:1337 (primer acceso: crea tu usuario admin, salvo que uses variables de entorno para autocreación).
  3. Panel MinIO (gestiona los buckets/files):
    http://localhost:9001 (usuario: minioadmin, contraseña: minioadminpass).
  4. Crea un bucket llamado uploads en MinIO (requisito para que Strapi guarde imágenes allí).
  5. Edita la configuración del proveedor upload de Strapi: puedes hacerlo desde el panel, el archivo config/plugins.js, o usando las variables de entorno ya indicadas arriba. Asegúrate de que el AWS_ENDPOINT apunte a MinIO.

¿Qué puedes hacer con esta pila?

  • Gestionar tus modelos y contenidos desde el admin gráfico de Strapi.
  • Servir una API REST o GraphQL personalizada para tu web/app móvil.
  • Guardar y servir archivos e imágenes localmente, 100% integrados y portables.
  • Usar MinIO como “S3 económico” para desarrollos, tests o entornos on-premises.
  • Migrar fácilmente a AWS S3 en producción cambiando solo endpoint y claves.

Consejos útiles & troubleshooting

  • Errores al subir archivos: Asegúrate de haber creado el bucket uploads en MinIO antes de subir algo desde Strapi.
  • Contraseñas y variables: Usa variables más seguras en entornos reales y, si puedes, gestionadas fuera del docker-compose.yml con ficheros .env.
  • Permisos de archivos: Si ves errores de permisos, revisa los UID/GID al montar volúmenes, sobre todo en entornos Linux cerrados.
  • Actualización a producción: Expón solo Strapi tras un proxy seguro (NGINX, Traefik) y accede a MinIO solo desde backend o por VPN/restricciones de red.
  • Desarrolla modelos personalizados: Abre ./strapi-app en tu máquina y disfruta del hot reload mientras prototipas tus modelos con Node.js y Docker Compose.

¡Y listo!

Ahora tienes un stack profesional y flexible: CMS headless + S3 privado y MySQL. Ideal para tus siguientes proyectos JAMstack, apps móviles o como plataforma API autogestionada. ¿Te gustaría otra configuración? ¡Comenta y lo exploro en futuros artículos!

Avatar

Por Mid