15%

Poupe 15% em todos os serviços

Teste as suas habilidades e obtenha Desconto em qualquer plano

Utilizar o código:

Skills
Começar a trabalhar
23.10.2024
1 +1

Como Instalar e Configurar o MongoDB em um VPS (Guia Completo)

MongoDB é uma base de dados NoSQL orientada a documentos que armazena registos como documentos BSON (Binary JSON), permitindo modelação de dados sem esquema com escalabilidade horizontal através de sharding nativo. Ao contrário das bases de dados relacionais, o MongoDB não requer um esquema de tabela predefinido, tornando-o a escolha dominante para aplicações com estruturas de dados em evolução, alto rendimento de escrita ou relações de dados hierárquicas.

Este guia percorre uma implementação MongoDB de nível de produção num VPS Linux — cobrindo a instalação a partir do repositório oficial, reforço de autenticação, controlo de acesso à rede, configuração TLS, ajuste de desempenho e automatização de backups. Cada passo pressupõe que está a operar num ambiente de servidor real onde a segurança e a fiabilidade são inegociáveis.

Pré-requisitos

Antes de prosseguir, confirme o seguinte:

  • Um VPS a executar Ubuntu 20.04 LTS ou Ubuntu 22.04 LTS (os comandos são idênticos para ambos)
  • Acesso de utilizador root ou com privilégios sudo via SSH
  • Um mínimo de 2 GB RAM (4 GB recomendado para cargas de trabalho de produção)
  • Pelo menos 20 GB de espaço em disco disponível num volume de armazenamento rápido
  • UFW ou iptables disponível para gestão de firewall
  • Familiaridade básica com a linha de comandos Linux

> Nota de arquitetura: O motor de armazenamento WiredTiger do MongoDB utiliza uma cache interna predefinida de 50% de (RAM – 1 GB). Num VPS de 2 GB, isso resulta em aproximadamente 512 MB de cache. Para cargas de trabalho com muita leitura, provisione pelo menos 4 GB RAM para evitar I/O de disco constante devido à pressão da cache.

MongoDB vs. Outras Bases de Dados NoSQL: Comparação Rápida

FuncionalidadeMongoDBRedisCassandraCouchDB
Modelo de dadosDocumento (BSON)Chave-valorColuna largaDocumento (JSON)
Linguagem de consultaMQL (consultas ricas)ComandosCQLMango / MapReduce
Escalabilidade horizontalSharding nativoModo clusterNativoMulti-master
Transações ACIDSim (v4.0+, multi-doc)Parcial (scripts Lua)LeveSim
Melhor caso de usoAplicações de uso geral, APIsCache, sessõesSéries temporais, IoTSincronização offline-first
Persistência em discoArmazenamento primárioOpcional (RDB/AOF)Armazenamento primárioArmazenamento primário
Pesquisa de texto completoAtlas Search / índice de textoLimitadoNãoLimitado

Passo 1: Atualizar o Sistema

Comece sempre com um sistema totalmente atualizado. Pacotes desatualizados introduzem CVEs conhecidos que podem ser explorados antes mesmo de instalar a sua pilha de aplicações.

sudo apt update && sudo apt upgrade -y

Após aplicar atualizações do kernel ou libc, reinicie para ativar o novo kernel:

sudo reboot

Reconecte via SSH após o servidor voltar a ficar online (normalmente 30–60 segundos).

Passo 2: Instalar MongoDB a partir do Repositório Oficial

Os repositórios apt padrão do Ubuntu incluem uma versão desatualizada e reempacotada pela comunidade do MongoDB que carece de patches de segurança recentes e melhorias do motor. Instale sempre a partir do repositório oficial do MongoDB.

Adicionar a Chave GPG e o Repositório do MongoDB

O comando apt-key está obsoleto no Ubuntu 22.04. Utilize o método de keyring recomendado, que funciona tanto no 20.04 como no 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

Adicione a entrada do repositório 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 versão: Substitua 7.0 pela sua versão alvo (por exemplo, 6.0) se necessitar de uma versão específica para compatibilidade de aplicações. O MongoDB 7.0 é a versão de Suporte de Longo Prazo atual a partir de 2024.

Instalar Pacotes MongoDB

sudo apt update
sudo apt install -y mongodb-org

Isto instala os seguintes componentes:

    mongod — o daemon principal da base de dados
    mongos — o router de sharding (utilizado em implementações de cluster com sharding)
    mongosh — o MongoDB Shell moderno (substitui o binário legado mongo)
    mongodb-database-tools — inclui mongodump, mongorestore, mongoexport e mongoimport

    Fixar a Versão Instalada

    Evite atualizações não intencionais que possam quebrar a compatibilidade das aplicações:

    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

    Passo 3: Configurar Pré-requisitos ao Nível do Sistema

    O MongoDB tem melhor desempenho quando determinados parâmetros do kernel e do sistema de ficheiros são ajustados antes do daemon iniciar.

    Definir o ulimit para Ficheiros Abertos

    O MongoDB requer um limite elevado de descritores de ficheiros. Crie uma substituição 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

    Desativar Transparent Huge Pages (THP)

    O THP causa picos de latência significativos no MongoDB. Desative-o 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

    Verifique se a configuração entrou em vigor:

    cat /sys/kernel/mm/transparent_hugepage/enabled

    A saída deve mostrar [never] como valor ativo.

    Passo 4: Iniciar e Ativar o MongoDB

    sudo systemctl daemon-reload
    sudo systemctl start mongod
    sudo systemctl enable mongod

    Confirme que o daemon está em execução:

    sudo systemctl status mongod

    Procure Active: active (running) na saída. Se o serviço não iniciar, inspecione o registo imediatamente:

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

    Falhas de arranque comuns incluem:

    • Porta 27017 já em uso — outro processo está vinculado à porta; identifique-o com sudo ss -tlnp | grep 27017
    • Permissões do diretório de dados — o utilizador mongod deve ser proprietário de /var/lib/mongodb; corrija com sudo chown -R mongodb:mongodb /var/lib/mongodb
    • THP ainda ativado — o motor WiredTiger regista um aviso e pode degradar o desempenho

    Passo 5: Proteger o MongoDB — Autenticação e Autorização

    Esta é a secção mais crítica. Instâncias MongoDB desprotegidas expostas à internet foram responsáveis por milhares de violações de dados. A instalação padrão não tem autenticação, o que significa que qualquer pessoa que possa alcançar a porta 27017 tem acesso total de leitura/escrita a todas as bases de dados.

    Criar o Utilizador Administrativo

    Conecte-se ao shell MongoDB local (não é necessária autenticação antes de a ativar):

    mongosh

    Dentro do shell, mude para a base de dados admin e crie um superutilizador:

    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() em vez de uma string em texto simples evita que a palavra-passe apareça no histórico do shell. Digite a palavra-passe quando solicitado e depois saia:

    exit

    Ativar Autenticação em mongod.conf

    Abra o ficheiro de configuração do MongoDB:

    sudo nano /etc/mongod.conf

    Localize a secção security (estará comentada) e ative a autorização:

    security:
      authorization: enabled

    Guarde e saia (Ctrl+X, depois Y, depois Enter), depois reinicie o daemon:

    sudo systemctl restart mongod

    Verificar se a Autenticação Está Aplicada

    Tente uma ligação não autenticada — deve agora falhar:

    mongosh --eval "db.adminCommand({ listDatabases: 1 })"

    Deve receber um erro Unauthorized. Agora autentique-se corretamente:

    mongosh -u adminuser -p --authenticationDatabase admin

    Criar Utilizadores com Âmbito de Aplicação

    Nunca utilize o superutilizador admin para ligações de aplicações. Crie um utilizador com privilégios mínimos para cada base de dados de aplicação:

    use myappdb
    
    db.createUser({
      user: "appuser",
      pwd: passwordPrompt(),
      roles: [
        { role: "readWrite", db: "myappdb" }
      ]
    })

    Passo 6: Configurar Vinculação de Rede e Regras de Firewall

    Restringir ou Expandir bindIp

    Por padrão, mongod.conf vincula apenas a 127.0.0.1. Esta é a configuração correta se a sua aplicação for executada no mesmo VPS. Se precisar de acesso remoto (por exemplo, a partir de um servidor de aplicações num host separado), edite /etc/mongod.conf:

    net:
      port: 27017
      bindIp: 127.0.0.1,10.0.0.5

    Substitua 10.0.0.5 pelo IP privado específico do seu servidor de aplicações. Nunca defina bindIp: 0.0.0.0 numa interface voltada para o público sem uma regra de firewall que restrinja o acesso a IPs conhecidos. Vincular a todas as interfaces sem firewall é a principal causa de incidentes de exposição de dados do MongoDB.

    Reinicie após as alterações:

    sudo systemctl restart mongod

    Configurar Regras de Firewall UFW

    Se for necessário acesso remoto, permita apenas o IP de confiança específico:

    sudo ufw allow from 10.0.0.5 to any port 27017 proto tcp
    sudo ufw enable
    sudo ufw status verbose

    Bloqueie todo o acesso externo à porta 27017:

    sudo ufw deny 27017

    O UFW processa as regras por ordem — a regra allow from específica acima da regra deny ampla tem precedência para o IP de confiança.

    Passo 7: Ativar TLS/SSL para Ligações Encriptadas

    Para qualquer implementação onde o tráfego MongoDB atravesse uma rede — mesmo uma LAN privada — a encriptação TLS é obrigatória. Sem ela, as credenciais e os dados são transmitidos em texto simples.

    Gere um certificado autoassinado para testes (utilize um certificado assinado por CA em produção — considere associar isto a um Certificado SSL para o seu domínio):

    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

    Adicione a configuração TLS a /etc/mongod.conf:

    net:
      port: 27017
      bindIp: 127.0.0.1
      tls:
        mode: requireTLS
        certificateKeyFile: /etc/mongodb/ssl/mongodb.pem

    Reinicie o MongoDB e conecte-se com TLS:

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

    O sinalizador --tlsAllowInvalidCertificates é apenas aceitável para certificados autoassinados em desenvolvimento. Remova-o quando utilizar um certificado assinado por CA.

    Passo 8: Ajuste de Desempenho em mongod.conf

    Para uma implementação de produção num VPS com recursos dedicados, ajuste as configurações de cache WiredTiger e journaling. Abra /etc/mongod.conf e adicione ou modifique o seguinte:

    storage:
      dbPath: /var/lib/mongodb
      journal:
        enabled: true
      wiredTiger:
        engineConfig:
          cacheSizeGB: 1.5
    
    operationProfiling:
      slowOpThresholdMs: 100
      mode: slowOp
    
    replication:
      oplogSizeMB: 1024

    Parâmetros de ajuste principais explicados:

    • cacheSizeGB — Defina isto para aproximadamente 50% da RAM disponível menos 1 GB. Num VPS de 4 GB, use 1.5. Num VPS de 8 GB, use 3.5.
    • slowOpThresholdMs — As consultas que excedam este limiar (em milissegundos) são registadas no profiler. Reduzir este valor ajuda a identificar consultas sem índice precocemente.
    • oplogSizeMB — Relevante se planear adicionar membros de replica set posteriormente. Pré-dimensionar o oplog evita atrasos de replicação em cargas de trabalho com muita escrita.

    Aplique as alterações:

    sudo systemctl restart mongod

    Passo 9: Backup e Restauro com mongodump

    Backup Manual

    mongodump 
      --uri="mongodb://adminuser:yourpassword@127.0.0.1:27017/?authSource=admin" 
      --out /var/backups/mongodb/$(date +%Y-%m-%d)

    Restauro Manual

    mongorestore 
      --uri="mongodb://adminuser:yourpassword@127.0.0.1:27017/?authSource=admin" 
      /var/backups/mongodb/2024-06-15

    Automatizar Backups com Cron

    Crie um script de backup 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

    Agende-o para ser executado diariamente às 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 -

    > Consideração de produção: Armazene os backups fora do servidor. Manter backups no mesmo VPS que a base de dados não oferece proteção contra falha de disco ou comprometimento do servidor. Utilize rsync, rclone ou um armazenamento de objetos compatível com S3 para replicar backups para uma localização remota.

    Passo 10: Monitorizar a Saúde do MongoDB

    Comandos de Monitorização Integrados

    Dentro de mongosh, execute estatísticas do servidor:

    db.serverStatus()
    db.stats()
    db.currentOp()

    Usar mongostat e mongotop

    A partir do shell, monitorize contagens de operações em tempo real:

    mongostat --uri="mongodb://adminuser:yourpassword@127.0.0.1:27017/?authSource=admin"

    Monitorize o tempo de leitura/escrita por coleção:

    mongotop --uri="mongodb://adminuser:yourpassword@127.0.0.1:27017/?authSource=admin"

    Métricas Principais a Observar

    MétricaLimiar de AvisoO Que Indica
    wiredTiger.cache.bytes currently in cache> 90% de cacheSizeGBPressão na cache; aumente a RAM ou reduza o conjunto de dados
    connections.current> 80% de connections.availableEsgotamento do pool de ligações; ajuste o pooling da aplicação
    opcounters.getmoreConsistentemente altoIneficiência do cursor; reveja os padrões de consulta
    repl.lag (replica sets)> 10 segundosAtraso de replicação; verifique a rede e o I/O de disco
    locks.Global.acquireWaitCountQualquer valor sustentadoContenção de bloqueio; reveja operações de longa duração

    Escolher o Alojamento Certo para MongoDB

    O desempenho e a fiabilidade da sua instância MongoDB estão diretamente ligados à infraestrutura subjacente. Considere estes níveis de implementação:

    • Desenvolvimento e staging: Um VPS padrão com 2–4 GB RAM é suficiente para cargas de trabalho não produtivas, testes de esquema e ambientes de integração.
    • Produção de nó único: Um VPS com 4–8 GB RAM, armazenamento NVMe e um núcleo CPU dedicado suporta tráfego de produção moderado para a maioria das aplicações web.
    • Produção de alto rendimento: Um Servidor Dedicado elimina o efeito de vizinho ruidoso inerente aos ambientes virtualizados. Os padrões de I/O do WiredTiger beneficiam significativamente de arrays NVMe em bare-metal.
    • Cargas de trabalho de ML/análise: Se estiver a executar MongoDB juntamente com pipelines de dados, análises com muita agregação ou pesquisa vetorial, o Alojamento GPU pode acelerar tarefas de processamento a jusante.

    Para implementações que requerem uma interface de gestão gráfica, o VPS com cPanel fornece um ambiente familiar para equipas menos confortáveis com administração puramente via CLI, embora a edição direta de mongod.conf continue a ser necessária para configuração avançada.

    Matriz de Decisão de Implementação

    Utilize esta lista de verificação antes de entrar em produção:

    • [ ] MongoDB instalado a partir do repositório oficial, versão fixada
    • [ ] Serviço mongod ativado e confirmado active (running)
    • [ ] Transparent Huge Pages desativado e verificado
    • [ ] ulimit para descritores de ficheiros definido para 64000 ou superior
    • [ ] Autenticação ativada em mongod.conf (authorization: enabled)
    • [ ] Utilizador admin criado com passwordPrompt() — sem palavras-passe em texto simples no histórico do shell
    • [ ] Utilizadores específicos de aplicações criados com funções de privilégio mínimo
    • [ ] bindIp restrito a localhost ou apenas a IPs de confiança específicos
    • [ ] Regras UFW em vigor — porta 27017 bloqueada da internet pública
    • [ ] TLS ativado com um certificado válido
    • [ ] Cache WiredTiger dimensionada para 50% de (RAM – 1 GB)
    • [ ] Profiling de consultas lentas ativado (slowOpThresholdMs: 100)
    • [ ] Backups diários automatizados com replicação fora do servidor
    • [ ] Restauro de backup testado — um backup que nunca restaurou não é um backup

    FAQ

    Qual é a porta padrão em que o MongoDB escuta e deve ser alterada?

    O MongoDB escuta na porta TCP 27017 por padrão. Alterá-la para uma porta não padrão adiciona uma obscuridade menor, mas não substitui a autenticação e as regras de firewall. Se a alterar, atualize net.port em /etc/mongod.conf e ajuste todas as regras UFW e strings de ligação em conformidade.

    Por que o MongoDB usa tanta RAM mesmo com um conjunto de dados pequeno?

    O WiredTiger pré-aloca a sua cache interna com base na fórmula max(50% of (RAM - 1 GB), 256 MB). Isto é intencional — manter os dados de trabalho em memória elimina as leituras de disco. Se o consumo de RAM for uma preocupação num VPS pequeno, defina explicitamente cacheSizeGB em /etc/mongod.conf para um valor inferior.

    Posso executar o MongoDB em alojamento partilhado?

    Não. O MongoDB requer um daemon de fundo persistente (mongod), acesso direto ao sistema de ficheiros para o seu diretório de dados e a capacidade de vincular a uma porta de rede. Nenhuma destas opções está disponível em Alojamento Web Partilhado. Um VPS é o ambiente mínimo viável.

    Qual é a diferença entre mongodump e um snapshot do sistema de ficheiros para backups?

    mongodump realiza um backup lógico — lê documentos através da interface de consulta do MongoDB e exporta-os como ficheiros BSON. É portátil e funciona entre versões, mas é mais lento e não pode garantir consistência point-in-time numa instância ativa com muita escrita sem --oplog. Um snapshot do sistema de ficheiros (LVM, ZFS ou snapshot de armazenamento em bloco na nuvem) captura os ficheiros de dados brutos num ponto consistente no tempo e é significativamente mais rápido para grandes conjuntos de dados, mas requer que o motor de armazenamento esteja num estado consistente.

    Como verifico qual versão do MongoDB está instalada?

    Execute o seguinte comando a partir do terminal:

    mongod --version

    Ou a partir de dentro de mongosh:

    db.version()
    15%

    Poupe 15% em todos os serviços

    Teste as suas habilidades e obtenha Desconto em qualquer plano

    Utilizar o código:

    Skills
    Começar a trabalhar