Ahorre 15% en todos los servicios de hosting

Pon a prueba tus habilidades y obtén Descuento<\/span> en cualquier plan de hosting

Usa el código: Skills Comenzar
Secciones
Linux Servidores virtuales

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 sudo ví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ísticaMongoDBRedisCassandraCouchDB
Modelo de datosDocumento (BSON)Clave-valorColumna anchaDocumento (JSON)
Lenguaje de consultaMQL (consultas enriquecidas)ComandosCQLMango / MapReduce
Escalado horizontalSharding nativoModo clústerNativoMulti-maestro
Transacciones ACIDSí (v4.0+, multi-doc)Parcial (scripts Lua)Ligero
Mejor caso de usoAplicaciones de propósito general, APIsCaché, sesionesSeries temporales, IoTSincronización offline-first
Persistencia en discoAlmacén primarioOpcional (RDB/AOF)Almacén primarioAlmacén primario
Búsqueda de texto completoAtlas Search / índice de textoLimitadoNoLimitado

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 -y

Después de aplicar actualizaciones del kernel o libc, reinicia para activar el nuevo kernel:

sudo reboot

Vuelve 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.gpg

Añ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-org

Esto 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 mongoimport

    Fijar 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-selections

    Paso 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
    EOF

    Deshabilitar 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-thp

    Verifica que la configuración tuvo efecto:

    cat /sys/kernel/mm/transparent_hugepage/enabled

    La 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 mongod

    Confirma que el daemon está en ejecución:

    sudo systemctl status mongod

    Busca Active: active (running) en la salida. Si el servicio no se inicia, inspecciona el registro inmediatamente:

    sudo tail -50 /var/log/mongodb/mongod.log

    Los 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 mongod debe ser propietario de /var/lib/mongodb; corrígelo con sudo 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):

    mongosh

    Dentro 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:

    exit

    Habilitar la Autenticación en mongod.conf

    Abre el archivo de configuración de MongoDB:

    sudo nano /etc/mongod.conf

    Localiza la sección security (estará comentada) y habilita la autorización:

    security:
      authorization: enabled

    Guarda y sal (Ctrl+X, luego Y, luego Enter), luego reinicia el daemon:

    sudo systemctl restart mongod

    Verificar 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 admin

    Crear 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.5

    Reemplaza 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 mongod

    Configurar 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 verbose

    Bloquea todo el acceso externo al puerto 27017:

    sudo ufw deny 27017

    UFW 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.pem

    Añ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.pem

    Reinicia MongoDB y conéctate con TLS:

    sudo systemctl restart mongod
    mongosh --tls --tlsCertificateKeyFile /etc/mongodb/ssl/mongodb.pem 
      --tlsAllowInvalidCertificates -u adminuser -p --authenticationDatabase admin

    El 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: 1024

    Pará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, usa 1.5. En un VPS de 8 GB, usa 3.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 mongod

    Paso 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-15

    Automatizar 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.sh

    Prográ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étricaUmbral de AdvertenciaLo que Indica
    wiredTiger.cache.bytes currently in cache> 90% de cacheSizeGBPresión de caché; aumenta la RAM o reduce el conjunto de datos
    connections.current> 80% de connections.availableAgotamiento del pool de conexiones; ajusta el pooling de la aplicación
    opcounters.getmoreConsistentemente altoIneficiencia del cursor; revisa los patrones de consulta
    repl.lag (conjuntos de réplicas)> 10 segundosRetraso de replicación; verifica la red y la E/S de disco
    locks.Global.acquireWaitCountCualquier valor sostenidoContenció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 mongod habilitado y confirmado active (running)
    • [ ] Transparent Huge Pages deshabilitado y verificado
    • [ ] ulimit para 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
    • [ ] bindIp restringido 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 --version

    O desde dentro de mongosh:

    db.version()
    Linux
    Administración Seguridad Servidores virtuales
    Linux Servidores virtuales