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:latestcomunicado 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-s3configurado 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
-
Inicia los servicios:
docker-compose up -d -
Accede a Strapi:
http://localhost:1337 (primer acceso: crea tu usuario admin, salvo que uses variables de entorno para autocreación). -
Panel MinIO (gestiona los buckets/files):
http://localhost:9001 (usuario:minioadmin, contraseña:minioadminpass). -
Crea un bucket llamado
uploadsen MinIO (requisito para que Strapi guarde imágenes allí). -
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 elAWS_ENDPOINTapunte 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
uploadsen 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.ymlcon 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-appen 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!
