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
sudovia 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
| Funcionalidade | MongoDB | Redis | Cassandra | CouchDB |
|---|---|---|---|---|
| Modelo de dados | Documento (BSON) | Chave-valor | Coluna larga | Documento (JSON) |
| Linguagem de consulta | MQL (consultas ricas) | Comandos | CQL | Mango / MapReduce |
| Escalabilidade horizontal | Sharding nativo | Modo cluster | Nativo | Multi-master |
| Transações ACID | Sim (v4.0+, multi-doc) | Parcial (scripts Lua) | Leve | Sim |
| Melhor caso de uso | Aplicações de uso geral, APIs | Cache, sessões | Séries temporais, IoT | Sincronização offline-first |
| Persistência em disco | Armazenamento primário | Opcional (RDB/AOF) | Armazenamento primário | Armazenamento primário |
| Pesquisa de texto completo | Atlas Search / índice de texto | Limitado | Não | Limitado |
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 -yApós aplicar atualizações do kernel ou libc, reinicie para ativar o novo kernel:
sudo rebootReconecte 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.gpgAdicione 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-orgIsto 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 mongoimportFixar 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-selectionsPasso 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
EOFDesativar 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-thpVerifique se a configuração entrou em vigor:
cat /sys/kernel/mm/transparent_hugepage/enabledA 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 mongodConfirme que o daemon está em execução:
sudo systemctl status mongodProcure Active: active (running) na saída. Se o serviço não iniciar, inspecione o registo imediatamente:
sudo tail -50 /var/log/mongodb/mongod.logFalhas 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
mongoddeve ser proprietário de/var/lib/mongodb; corrija comsudo 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):
mongoshDentro 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:
exitAtivar Autenticação em mongod.conf
Abra o ficheiro de configuração do MongoDB:
sudo nano /etc/mongod.confLocalize a secção security (estará comentada) e ative a autorização:
security:
authorization: enabledGuarde e saia (Ctrl+X, depois Y, depois Enter), depois reinicie o daemon:
sudo systemctl restart mongodVerificar 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 adminCriar 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.5Substitua 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 mongodConfigurar 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 verboseBloqueie todo o acesso externo à porta 27017:
sudo ufw deny 27017O 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.pemAdicione a configuração TLS a /etc/mongod.conf:
net:
port: 27017
bindIp: 127.0.0.1
tls:
mode: requireTLS
certificateKeyFile: /etc/mongodb/ssl/mongodb.pemReinicie o MongoDB e conecte-se com TLS:
sudo systemctl restart mongod
mongosh --tls --tlsCertificateKeyFile /etc/mongodb/ssl/mongodb.pem
--tlsAllowInvalidCertificates -u adminuser -p --authenticationDatabase adminO 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: 1024Parâmetros de ajuste principais explicados:
cacheSizeGB— Defina isto para aproximadamente 50% da RAM disponível menos 1 GB. Num VPS de 4 GB, use1.5. Num VPS de 8 GB, use3.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 mongodPasso 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-15Automatizar 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.shAgende-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étrica | Limiar de Aviso | O Que Indica |
|---|---|---|
wiredTiger.cache.bytes currently in cache | > 90% de cacheSizeGB | Pressão na cache; aumente a RAM ou reduza o conjunto de dados |
connections.current | > 80% de connections.available | Esgotamento do pool de ligações; ajuste o pooling da aplicação |
opcounters.getmore | Consistentemente alto | Ineficiência do cursor; reveja os padrões de consulta |
repl.lag (replica sets) | > 10 segundos | Atraso de replicação; verifique a rede e o I/O de disco |
locks.Global.acquireWaitCount | Qualquer valor sustentado | Contençã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
mongodativado e confirmadoactive (running) - [ ] Transparent Huge Pages desativado e verificado
- [ ]
ulimitpara 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
- [ ]
bindIprestrito 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 --versionOu a partir de dentro de mongosh:
db.version()