almeira-web/transporte-cali-buenaventura/docs/COOLIFY_MONGODB_DEPLOY.md

120 lines
4.2 KiB
Markdown

# Despliegue de MongoDB Propio (Self-Hosted) en Coolify
Este documento describe el procedimiento exacto para desplegar el servidor propio de MongoDB en **Coolify** para la plataforma de transporte y mensajería **Cali - Buenaventura**, asegurando soporte completo para **índices geoespaciales 2dsphere**, persistencia de datos y compatibilidad con Traefik.
---
## 1. Arquitectura de Despliegue en Coolify
- **Motor:** MongoDB Community 7.0 (WiredTiger Engine).
- **Límites de Recursos:** Asignación fija de caché (`--wiredTigerCacheSizeGB 1.5`) y memoria máxima (2GB) para prevenir saturación de RAM en el VPS.
- **Seguridad:** Autenticación obligatoria con usuario root y base de datos `transporte_cali_buenaventura`.
- **Persistencia:** Volúmenes Docker gestionados por Coolify (`coolify_mongodb_cali_data`).
- **Enrutamiento:** Red interna de Docker. El backend de Node.js se conecta internamente a través del nombre de servicio `mongodb-cali-buenaventura:27017` sin exponer puertos innecesarios a Internet, o con puerto `27017` si necesitas conectarte vía MongoDB Compass.
---
## 2. Configuración en Coolify (Paso a Paso)
1. **Ingresar a tu panel de Coolify.**
2. Ir a tu **Proyecto** y seleccionar el **Ambiente (Environment)** de producción.
3. Hacer clic en **+ New Resource** ➔ **Docker Compose**.
4. Asignar el nombre: `mongodb-transporte-cali`.
5. En el campo de configuración Compose, pegar el contenido del archivo [`coolify-mongodb.docker-compose.yml`](file:///c:/Users/Carlos/dev/almeira-web/transporte-cali-buenaventura/coolify-mongodb.docker-compose.yml):
```yaml
version: '3.8'
services:
mongodb-transporte:
image: mongo:7.0-jammy
container_name: mongodb-cali-buenaventura
restart: always
environment:
MONGO_INITDB_ROOT_USERNAME: ${MONGO_ROOT_USER:-admin_transporte}
MONGO_INITDB_ROOT_PASSWORD: ${MONGO_ROOT_PASSWORD:-InnovaTransporte2026!*}
MONGO_INITDB_DATABASE: ${MONGO_DATABASE:-transporte_cali_buenaventura}
command: >
mongod
--bind_ip_all
--wiredTigerCacheSizeGB 1.5
--nounixsocket
--oplogSize 1024
volumes:
- mongodb_cali_data:/data/db
- mongodb_cali_config:/data/configdb
ports:
- "27017:27017"
healthcheck:
test: ["CMD-SHELL", "mongosh --quiet --eval 'db.adminCommand(\"ping\").ok' || exit 1"]
interval: 10s
timeout: 5s
retries: 5
start_period: 20s
deploy:
resources:
limits:
memory: 2048M
volumes:
mongodb_cali_data:
name: coolify_mongodb_cali_data
driver: local
mongodb_cali_config:
name: coolify_mongodb_cali_config
driver: local
```
6. **Variables de Entorno en Coolify:**
Configurar en la pestaña *Environment Variables*:
```env
MONGO_ROOT_USER=admin_transporte
MONGO_ROOT_PASSWORD=TuPasswordSuperSeguro2026!*
MONGO_DATABASE=transporte_cali_buenaventura
```
7. **Desplegar:**
Hacer clic en **Deploy**. Coolify levantará el contenedor de manera aislada y segura.
---
## 3. String de Conexión para el Backend
Una vez desplegado en Coolify, la variable `MONGODB_URI` en tu backend de Node.js debe configurarse como:
### Conexión Interna (si el backend corre en Coolify):
```env
MONGODB_URI=mongodb://admin_transporte:TuPasswordSuperSeguro2026!*@mongodb-cali-buenaventura:27017/transporte_cali_buenaventura?authSource=admin
```
### Conexión Externa (VPS IP):
```env
MONGODB_URI=mongodb://admin_transporte:TuPasswordSuperSeguro2026!*@161.97.93.156:27017/transporte_cali_buenaventura?authSource=admin
```
---
## 4. Verificación de Índices Geoespaciales 2dsphere
El backend ejecuta `autoIndex: true` de forma predeterminada. Puedes comprobar que los índices estén activos conectándote a `mongosh`:
```bash
docker exec -it mongodb-cali-buenaventura mongosh -u admin_transporte -p TuPasswordSuperSeguro2026!* --authenticationDatabase admin
```
Ejecutar dentro de la base de datos:
```javascript
use transporte_cali_buenaventura;
db.users.getIndexes();
db.driverprofiles.getIndexes();
db.trips.getIndexes();
```
Debes observar el índice:
```json
{ "coordenadasDomicilio": "2dsphere" }
{ "coordenadasActuales": "2dsphere" }
{ "origen.ubicacion": "2dsphere" }
```
Con esto, las consultas `$near`, `$geoWithin` y `$nearSphere` operarán con máxima velocidad milimétrica.