Cómo Instalar y Configurar MongoDB en un VPS (Guía Completa)
MongoDB es una base de datos NoSQL orientada a documentos que almacena registros como documentos BSON (JSON Binario), lo que permite el modelado de datos sin esquema con escalabilidad horizontal a través de sharding nativo. A diferencia de las bases de datos relacionales, MongoDB no requiere un esquema de tabla predefinido, lo que la convierte en la opción dominante para aplicaciones con estructuras de datos en evolución, alto rendimiento de escritura o relaciones de datos jerárquicas.
Esta guía describe un despliegue de MongoDB de nivel productivo en un VPS Linux — cubriendo la instalación desde el repositorio oficial, el fortalecimiento de la autenticación, el control de acceso a la red, la configuración TLS, el ajuste de rendimiento y la automatización de copias de seguridad. Cada paso asume que estás operando en un entorno de servidor real donde la seguridad y la fiabilidad no son negociables.
Requisitos previos
Antes de continuar, confirma lo siguiente:
- Un VPS con Ubuntu 20.04 LTS o Ubuntu 22.04 LTS (los comandos son idénticos para ambos)
- Acceso de usuario root o con privilegios
sudovía SSH - Un mínimo de 2 GB RAM (se recomiendan 4 GB para cargas de trabajo en producción)
- Al menos 20 GB de espacio en disco disponible en un volumen de almacenamiento rápido
- UFW o iptables disponibles para la gestión del firewall
- Familiaridad básica con la línea de comandos de Linux
> Nota de arquitectura: El motor de almacenamiento WiredTiger de MongoDB utiliza una caché interna predeterminada del 50% de (RAM – 1 GB). En un VPS de 2 GB, eso produce aproximadamente 512 MB de caché. Para cargas de trabajo con muchas lecturas, aprovisiona al menos 4 GB de RAM para evitar la E/S de disco constante por presión de caché.
MongoDB vs. Otras Bases de Datos NoSQL: Comparación Rápida
| Característica | MongoDB | Redis | Cassandra | CouchDB |
|---|---|---|---|---|
| Modelo de datos | Documento (BSON) | Clave-valor | Columna ancha | Documento (JSON) |
| Lenguaje de consulta | MQL (consultas enriquecidas) | Comandos | CQL | Mango / MapReduce |
| Escalado horizontal | Sharding nativo | Modo clúster | Nativo | Multi-maestro |
| Transacciones ACID | Sí (v4.0+, multi-doc) | Parcial (scripts Lua) | Ligero | Sí |
| Mejor caso de uso | Aplicaciones de propósito general, APIs | Caché, sesiones | Series temporales, IoT | Sincronización offline-first |
| Persistencia en disco | Almacén primario | Opcional (RDB/AOF) | Almacén primario | Almacén primario |
| Búsqueda de texto completo | Atlas Search / índice de texto | Limitado | No | Limitado |
Paso 1: Actualizar el Sistema
Comienza siempre con un sistema completamente parcheado. Los paquetes desactualizados introducen CVEs conocidos que pueden ser explotados antes de que instales tu pila de aplicaciones.
sudo apt update && sudo apt upgrade -yDespués de aplicar actualizaciones del kernel o libc, reinicia para activar el nuevo kernel:
sudo rebootVuelve a conectarte vía SSH después de que el servidor vuelva a estar en línea (normalmente 30–60 segundos).
Paso 2: Instalar MongoDB desde el Repositorio Oficial
Los repositorios apt predeterminados de Ubuntu incluyen una versión desactualizada y reempaquetada por la comunidad de MongoDB que carece de parches de seguridad recientes y mejoras del motor. Instala siempre desde el repositorio oficial de MongoDB.
Añadir la Clave GPG y el Repositorio de MongoDB
El comando apt-key está obsoleto en Ubuntu 22.04. Usa el método de keyring recomendado, que funciona tanto en 20.04 como en 22.04:
curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc |
sudo gpg --dearmor -o /usr/share/keyrings/mongodb-server-7.0.gpgAñade la entrada del repositorio oficial:
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ]
https://repo.mongodb.org/apt/ubuntu $(lsb_release -cs)/mongodb-org/7.0 multiverse" |
sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list> Nota de versión: Reemplaza 7.0 con tu versión objetivo (p. ej., 6.0) si necesitas una versión específica para la compatibilidad de la aplicación. MongoDB 7.0 es la versión de Soporte a Largo Plazo actual a partir de 2024.
Instalar los Paquetes de MongoDB
sudo apt update
sudo apt install -y mongodb-orgEsto instala los siguientes componentes:
mongod — el daemon principal de la base de datos
mongos — el enrutador de sharding (usado en despliegues de clústeres fragmentados)
mongosh — el MongoDB Shell moderno (reemplaza el binario heredado mongo)
mongodb-database-tools — incluye mongodump, mongorestore, mongoexport y mongoimportFijar la Versión Instalada
Evita actualizaciones no deseadas que podrían romper la compatibilidad de la aplicación:
echo "mongodb-org hold" | sudo dpkg --set-selections
echo "mongodb-org-database hold" | sudo dpkg --set-selections
echo "mongodb-org-server hold" | sudo dpkg --set-selections
echo "mongosh hold" | sudo dpkg --set-selections
echo "mongodb-org-mongos hold" | sudo dpkg --set-selections
echo "mongodb-org-tools hold" | sudo dpkg --set-selectionsPaso 3: Configurar los Requisitos Previos a Nivel de Sistema
MongoDB funciona mejor cuando ciertos parámetros del kernel y del sistema de archivos se ajustan antes de que el daemon se inicie.
Establecer el ulimit para Archivos Abiertos
MongoDB requiere un límite alto de descriptores de archivo. Crea una anulación de systemd:
sudo mkdir -p /etc/systemd/system/mongod.service.d
sudo tee /etc/systemd/system/mongod.service.d/limits.conf > /dev/null <<EOF
[Service]
LimitFNOFILE=64000
LimitNPROC=64000
EOFDeshabilitar las Páginas Hugepages Transparentes (THP)
THP causa picos de latencia significativos en MongoDB. Desactívalo de forma persistente:
sudo tee /etc/systemd/system/disable-thp.service > /dev/null <<EOF
[Unit]
Description=Disable Transparent Huge Pages (THP)
DefaultDependencies=no
After=sysinit.target local-fs.target
Before=mongod.service
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo never | tee /sys/kernel/mm/transparent_hugepage/enabled > /dev/null'
ExecStart=/bin/sh -c 'echo never | tee /sys/kernel/mm/transparent_hugepage/defrag > /dev/null'
[Install]
WantedBy=basic.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now disable-thpVerifica que la configuración tuvo efecto:
cat /sys/kernel/mm/transparent_hugepage/enabledLa salida debería mostrar [never] como valor activo.
Paso 4: Iniciar y Habilitar MongoDB
sudo systemctl daemon-reload
sudo systemctl start mongod
sudo systemctl enable mongodConfirma que el daemon está en ejecución:
sudo systemctl status mongodBusca Active: active (running) en la salida. Si el servicio no se inicia, inspecciona el registro inmediatamente:
sudo tail -50 /var/log/mongodb/mongod.logLos fallos de inicio más comunes incluyen:
- Puerto 27017 ya en uso — otro proceso está vinculado al puerto; identifícalo con
sudo ss -tlnp | grep 27017 - Permisos del directorio de datos — el usuario
mongoddebe ser propietario de/var/lib/mongodb; corrígelo consudo chown -R mongodb:mongodb /var/lib/mongodb - THP aún habilitado — el motor WiredTiger registra una advertencia y puede degradar el rendimiento
Paso 5: Asegurar MongoDB — Autenticación y Autorización
Esta es la sección más crítica. Las instancias de MongoDB desprotegidas expuestas a internet han sido responsables de miles de brechas de datos. La instalación predeterminada no tiene autenticación, lo que significa que cualquiera que pueda acceder al puerto 27017 tiene acceso completo de lectura/escritura a cada base de datos.
Crear el Usuario Administrativo
Conéctate al shell local de MongoDB (no se requiere autenticación antes de habilitarla):
mongoshDentro del shell, cambia a la base de datos admin y crea un superusuario:
use admin
db.createUser({
user: "adminuser",
pwd: passwordPrompt(),
roles: [
{ role: "userAdminAnyDatabase", db: "admin" },
{ role: "readWriteAnyDatabase", db: "admin" },
{ role: "dbAdminAnyDatabase", db: "admin" },
{ role: "clusterAdmin", db: "admin" }
]
})Usar passwordPrompt() en lugar de una cadena de texto plano evita que la contraseña aparezca en el historial del shell. Escribe la contraseña cuando se te solicite, luego sal:
exitHabilitar la Autenticación en mongod.conf
Abre el archivo de configuración de MongoDB:
sudo nano /etc/mongod.confLocaliza la sección security (estará comentada) y habilita la autorización:
security:
authorization: enabledGuarda y sal (Ctrl+X, luego Y, luego Enter), luego reinicia el daemon:
sudo systemctl restart mongodVerificar que la Autenticación Está Aplicada
Intenta una conexión sin autenticación — ahora debería fallar:
mongosh --eval "db.adminCommand({ listDatabases: 1 })"Deberías recibir un error Unauthorized. Ahora autentícate correctamente:
mongosh -u adminuser -p --authenticationDatabase adminCrear Usuarios con Ámbito de Aplicación
Nunca uses el superusuario admin para conexiones de aplicaciones. Crea un usuario con mínimos privilegios para cada base de datos de aplicación:
use myappdb
db.createUser({
user: "appuser",
pwd: passwordPrompt(),
roles: [
{ role: "readWrite", db: "myappdb" }
]
})Paso 6: Configurar el Enlace de Red y las Reglas del Firewall
Restringir o Ampliar bindIp
Por defecto, mongod.conf se enlaza solo a 127.0.0.1. Esta es la configuración correcta si tu aplicación se ejecuta en el mismo VPS. Si necesitas acceso remoto (p. ej., desde un servidor de aplicaciones en un host separado), edita /etc/mongod.conf:
net:
port: 27017
bindIp: 127.0.0.1,10.0.0.5Reemplaza 10.0.0.5 con la IP privada específica de tu servidor de aplicaciones. Nunca establezcas bindIp: 0.0.0.0 en una interfaz pública sin una regla de firewall que restrinja el acceso a IPs conocidas. Enlazar a todas las interfaces sin firewall es la principal causa de incidentes de exposición de datos en MongoDB.
Reinicia después de los cambios:
sudo systemctl restart mongodConfigurar las Reglas del Firewall UFW
Si se requiere acceso remoto, permite solo la IP de confianza específica:
sudo ufw allow from 10.0.0.5 to any port 27017 proto tcp
sudo ufw enable
sudo ufw status verboseBloquea todo el acceso externo al puerto 27017:
sudo ufw deny 27017UFW procesa las reglas en orden — la regla específica allow from por encima de la regla amplia deny tiene precedencia para la IP de confianza.
Paso 7: Habilitar TLS/SSL para Conexiones Cifradas
Para cualquier despliegue donde el tráfico de MongoDB cruce una red — incluso una LAN privada — el cifrado TLS es obligatorio. Sin él, las credenciales y los datos se transmiten en texto plano.
Genera un certificado autofirmado para pruebas (usa un certificado firmado por una CA en producción — considera combinarlo con un Certificado SSL para tu dominio):
sudo mkdir -p /etc/mongodb/ssl
sudo openssl req -newkey rsa:4096 -nodes -keyout /etc/mongodb/ssl/mongodb.key
-x509 -days 365 -out /etc/mongodb/ssl/mongodb.crt
-subj "/CN=your-vps-hostname"
sudo cat /etc/mongodb/ssl/mongodb.crt /etc/mongodb/ssl/mongodb.key |
sudo tee /etc/mongodb/ssl/mongodb.pem > /dev/null
sudo chown -R mongodb:mongodb /etc/mongodb/ssl
sudo chmod 600 /etc/mongodb/ssl/mongodb.pemAñade la configuración TLS a /etc/mongod.conf:
net:
port: 27017
bindIp: 127.0.0.1
tls:
mode: requireTLS
certificateKeyFile: /etc/mongodb/ssl/mongodb.pemReinicia MongoDB y conéctate con TLS:
sudo systemctl restart mongod
mongosh --tls --tlsCertificateKeyFile /etc/mongodb/ssl/mongodb.pem
--tlsAllowInvalidCertificates -u adminuser -p --authenticationDatabase adminEl indicador --tlsAllowInvalidCertificates solo es aceptable para certificados autofirmados en desarrollo. Elimínalo cuando uses un certificado firmado por una CA.
Paso 8: Ajuste de Rendimiento en mongod.conf
Para un despliegue en producción en un VPS con recursos dedicados, ajusta la caché de WiredTiger y la configuración de journaling. Abre /etc/mongod.conf y añade o modifica lo siguiente:
storage:
dbPath: /var/lib/mongodb
journal:
enabled: true
wiredTiger:
engineConfig:
cacheSizeGB: 1.5
operationProfiling:
slowOpThresholdMs: 100
mode: slowOp
replication:
oplogSizeMB: 1024Parámetros clave de ajuste explicados:
cacheSizeGB— Establece esto en aproximadamente el 50% de la RAM disponible menos 1 GB. En un VPS de 4 GB, usa1.5. En un VPS de 8 GB, usa3.5.slowOpThresholdMs— Las consultas que superen este umbral (en milisegundos) se registran en el perfilador. Reducirlo ayuda a identificar consultas sin índice de forma temprana.oplogSizeMB— Relevante si planeas añadir miembros de conjunto de réplicas más adelante. Predimensionar el oplog evita el retraso de replicación en cargas de trabajo con muchas escrituras.
Aplica los cambios:
sudo systemctl restart mongodPaso 9: Copia de Seguridad y Restauración con mongodump
Copia de Seguridad Manual
mongodump
--uri="mongodb://adminuser:yourpassword@127.0.0.1:27017/?authSource=admin"
--out /var/backups/mongodb/$(date +%Y-%m-%d)Restauración Manual
mongorestore
--uri="mongodb://adminuser:yourpassword@127.0.0.1:27017/?authSource=admin"
/var/backups/mongodb/2024-06-15Automatizar Copias de Seguridad con Cron
Crea un script de copia de seguridad dedicado:
sudo tee /usr/local/bin/mongodb-backup.sh > /dev/null <<'EOF'
#!/bin/bash
BACKUP_DIR="/var/backups/mongodb"
TIMESTAMP=$(date +%Y-%m-%d_%H-%M-%S)
MONGO_URI="mongodb://adminuser:yourpassword@127.0.0.1:27017/?authSource=admin"
RETENTION_DAYS=7
mkdir -p "${BACKUP_DIR}/${TIMESTAMP}"
mongodump --uri="${MONGO_URI}" --out="${BACKUP_DIR}/${TIMESTAMP}"
find "${BACKUP_DIR}" -maxdepth 1 -type d -mtime +${RETENTION_DAYS} -exec rm -rf {} ;
EOF
sudo chmod +x /usr/local/bin/mongodb-backup.shPrográmalo para ejecutarse diariamente a las 2:00 AM:
(crontab -l 2>/dev/null; echo "0 2 * * * /usr/local/bin/mongodb-backup.sh >> /var/log/mongodb-backup.log 2>&1") | crontab -> Consideración de producción: Almacena las copias de seguridad fuera del servidor. Mantener las copias de seguridad en el mismo VPS que la base de datos no proporciona protección contra fallos de disco o compromiso del servidor. Usa rsync, rclone o un almacén de objetos compatible con S3 para replicar las copias de seguridad en una ubicación remota.
Paso 10: Monitorear el Estado de MongoDB
Comandos de Monitoreo Integrados
Dentro de mongosh, ejecuta estadísticas del servidor:
db.serverStatus()
db.stats()
db.currentOp()Usar mongostat y mongotop
Desde el shell, monitorea los recuentos de operaciones en tiempo real:
mongostat --uri="mongodb://adminuser:yourpassword@127.0.0.1:27017/?authSource=admin"Monitorea el tiempo de lectura/escritura por colección:
mongotop --uri="mongodb://adminuser:yourpassword@127.0.0.1:27017/?authSource=admin"Métricas Clave a Vigilar
| Métrica | Umbral de Advertencia | Lo que Indica |
|---|---|---|
wiredTiger.cache.bytes currently in cache | > 90% de cacheSizeGB | Presión de caché; aumenta la RAM o reduce el conjunto de datos |
connections.current | > 80% de connections.available | Agotamiento del pool de conexiones; ajusta el pooling de la aplicación |
opcounters.getmore | Consistentemente alto | Ineficiencia del cursor; revisa los patrones de consulta |
repl.lag (conjuntos de réplicas) | > 10 segundos | Retraso de replicación; verifica la red y la E/S de disco |
locks.Global.acquireWaitCount | Cualquier valor sostenido | Contención de bloqueos; revisa las operaciones de larga duración |
Elegir el Alojamiento Adecuado para MongoDB
El rendimiento y la fiabilidad de tu instancia de MongoDB están directamente vinculados a la infraestructura subyacente. Considera estos niveles de despliegue:
- Desarrollo y staging: Un VPS estándar con 2–4 GB RAM es suficiente para cargas de trabajo no productivas, pruebas de esquemas y entornos de integración.
- Producción en nodo único: Un VPS con 4–8 GB RAM, almacenamiento NVMe y un núcleo de CPU dedicado gestiona el tráfico de producción moderado para la mayoría de las aplicaciones web.
- Producción de alto rendimiento: Un Servidor Dedicado elimina el efecto de vecino ruidoso inherente a los entornos virtualizados. Los patrones de E/S de WiredTiger se benefician significativamente de los arrays NVMe en bare-metal.
- Cargas de trabajo de ML/análisis: Si estás ejecutando MongoDB junto con pipelines de datos, análisis intensivos en agregación o búsqueda vectorial, el Alojamiento GPU puede acelerar las tareas de procesamiento posteriores.
Para despliegues que requieren una interfaz de gestión gráfica, el VPS con cPanel proporciona un entorno familiar para equipos menos cómodos con la administración puramente por CLI, aunque la edición directa de mongod.conf sigue siendo necesaria para la configuración avanzada.
Matriz de Decisión de Despliegue
Usa esta lista de verificación antes de entrar en producción:
- [ ] MongoDB instalado desde el repositorio oficial, versión fijada
- [ ] Servicio
mongodhabilitado y confirmadoactive (running) - [ ] Transparent Huge Pages deshabilitado y verificado
- [ ]
ulimitpara descriptores de archivo establecido en 64000 o superior - [ ] Autenticación habilitada en
mongod.conf(authorization: enabled) - [ ] Usuario admin creado con
passwordPrompt()— sin contraseñas en texto plano en el historial del shell - [ ] Usuarios específicos de la aplicación creados con roles de mínimos privilegios
- [ ]
bindIprestringido a localhost o IPs de confianza específicas únicamente - [ ] Reglas UFW en su lugar — puerto 27017 bloqueado desde internet público
- [ ] TLS habilitado con un certificado válido
- [ ] Caché de WiredTiger dimensionada al 50% de (RAM – 1 GB)
- [ ] Perfilado de consultas lentas habilitado (
slowOpThresholdMs: 100) - [ ] Copias de seguridad diarias automatizadas con replicación fuera del servidor
- [ ] Restauración de copia de seguridad probada — una copia de seguridad que nunca has restaurado no es una copia de seguridad
Preguntas Frecuentes
¿En qué puerto predeterminado escucha MongoDB y debería cambiarse?
MongoDB escucha en el puerto TCP 27017 por defecto. Cambiarlo a un puerto no estándar añade una oscuridad menor pero no es un sustituto de la autenticación y las reglas del firewall. Si lo cambias, actualiza net.port en /etc/mongod.conf y ajusta todas las reglas UFW y las cadenas de conexión en consecuencia.
¿Por qué MongoDB usa tanta RAM incluso con un conjunto de datos pequeño?
WiredTiger preasigna su caché interna basándose en la fórmula max(50% of (RAM - 1 GB), 256 MB). Esto es intencional — mantener los datos de trabajo en memoria elimina las lecturas de disco. Si el consumo de RAM es una preocupación en un VPS pequeño, establece explícitamente cacheSizeGB en /etc/mongod.conf a un valor más bajo.
¿Puedo ejecutar MongoDB en alojamiento compartido?
No. MongoDB requiere un daemon en segundo plano persistente (mongod), acceso directo al sistema de archivos a su directorio de datos y la capacidad de enlazarse a un puerto de red. Nada de esto está disponible en el Alojamiento Web Compartido. Un VPS es el entorno mínimo viable.
¿Cuál es la diferencia entre mongodump y una instantánea del sistema de archivos para copias de seguridad?
mongodump realiza una copia de seguridad lógica — lee documentos a través de la interfaz de consulta de MongoDB y los exporta como archivos BSON. Es portable y funciona entre versiones, pero es más lento y no puede garantizar la consistencia en un punto en el tiempo en una instancia activa con muchas escrituras sin --oplog. Una instantánea del sistema de archivos (LVM, ZFS o instantánea de almacenamiento en bloque en la nube) captura los archivos de datos sin procesar en un punto en el tiempo consistente y es significativamente más rápida para conjuntos de datos grandes, pero requiere que el motor de almacenamiento esté en un estado consistente.
¿Cómo compruebo qué versión de MongoDB está instalada?
Ejecuta el siguiente comando desde el terminal:
mongod --versionO desde dentro de mongosh:
db.version()
en todos los servicios de hosting