Configuración de Docker Compose para FastAPI + MongoDB + Mongo Express
Cuándo usar esta combinación
Ideal para microservicios y APIs asíncronas de alto rendimiento que manejan datos no estructurados o esquemas dinámicos basados en JSON. FastAPI proporciona concurrencia nativa (ASGI) y documentación automática OpenAPI, mientras MongoDB ofrece escalabilidad horizontal y flexibilidad de modelado. Mongo Express acelera las etapas de desarrollo, prototipado y pruebas locales al proveer una interfaz visual ligera para inspeccionar y manipular datos sin requerir herramientas de escritorio externas.
Configuración de Referencia (docker-compose.yml)
version: '3.8'
services:
fastapi:
build:
context: ./app
dockerfile: Dockerfile
container_name: fastapi_app
restart: always
environment:
- MONGO_URI=mongodb://app_user:${MONGO_APP_PASSWORD}@mongodb:27017/app_db?authSource=app_db
- SECRET_KEY=${FASTAPI_SECRET_KEY}
ports:
- "8000:8000"
depends_on:
mongodb:
condition: service_healthy
networks:
- backend_network
mongodb:
image: mongo:6.0
container_name: mongodb_db
restart: always
environment:
- MONGO_INITDB_ROOT_USERNAME=${MONGO_ROOT_USER}
- MONGO_INITDB_ROOT_PASSWORD=${MONGO_ROOT_PASSWORD}
- MONGO_INITDB_DATABASE=app_db
volumes:
- mongo_data:/data/db
- ./init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js:ro
networks:
- backend_network
healthcheck:
test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"]
interval: 10s
timeout: 5s
retries: 5
mongo-express:
image: mongo-express:1.0.0-alpha.4
container_name: mongo_express_gui
restart: unless-stopped
environment:
- ME_CONFIG_MONGODB_ADMINUSERNAME=${MONGO_ROOT_USER}
- ME_CONFIG_MONGODB_ADMINPASSWORD=${MONGO_ROOT_PASSWORD}
- ME_CONFIG_MONGODB_URL=mongodb://${MONGO_ROOT_USER}:${MONGO_ROOT_PASSWORD}@mongodb:27017/
- ME_CONFIG_BASICAUTH_USERNAME=${MONGO_EXPRESS_USER}
- ME_CONFIG_BASICAUTH_PASSWORD=${MONGO_EXPRESS_PASSWORD}
ports:
- "8081:8081"
depends_on:
mongodb:
condition: service_healthy
networks:
- backend_network
networks:
backend_network:
driver: bridge
volumes:
mongo_data:
Variables de Entorno Críticas para Producción
MONGO_INITDB_ROOT_PASSWORD(MongoDB): Contraseña maestra del clúster. Debe generarse de forma aleatoria (mínimo 32 caracteres alfanuméricos) y nunca usar valores por defecto (admin,root).FASTAPI_SECRET_KEY(FastAPI): Semilla criptográfica utilizada para firmar tokens JWT, cookies y sesiones de seguridad. Si se ve comprometida, se pueden falsificar identidades de autenticación.ME_CONFIG_BASICAUTH_PASSWORD(Mongo Express): Credencial de acceso a la interfaz web administrativa. La exposición de este panel con credenciales predeterminadas equivale a otorgar control total de la base de datos a atacantes.
Consejo de Seguridad y Rendimiento
- Seguridad (Zero-Trust en Producción): Desacopla Mongo Express del despliegue productivo. Este servicio solo debe existir en entornos de desarrollo local mediante overrides (
docker-compose.override.yml). Exponer Mongo Express en internet es una vulnerabilidad crítica documentada recurrente. - Rendimiento (Connection Pooling): En FastAPI, inicializa el cliente de MongoDB (
AsyncIOMotorClient) una única vez en el ciclo de vida de la aplicación (lifespan handler), configurando límites de pool (maxPoolSize=100,minPoolSize=10) para prevenir la saturación de sockets TCP y el agotamiento de memoria bajo cargas concurrentes elevadas.
Checklist de Seguridad antes de desplegar
- Cambiar las contraseñas por defecto en el archivo .env
- Mapear volúmenes persistentes en el VPS
- Configurar las reglas de firewall para los puertos requeridos