Como Hospedar um Bot do Discord 24 Horas em uma VPS Linux
Tutorial completo para deploy de bot Discord (discord.js ou discord.py) em VPS Linux com PM2 ou systemd para uptime 24/7.
Bot Discord rodando no seu notebook funciona até a primeira reinicialização do Windows ou queda de Wi-Fi. Pra ter um bot disponível 24 horas por dia, você precisa de um servidor que fica ligado o tempo todo — e uma VPS Linux barata resolve isso por menos de R$30/mês com sobra de recursos pra crescer.
Este tutorial é pra developer com bot já funcionando em discord.js (Node.js) ou discord.py (Python) que quer fazer deploy em produção pela primeira vez. Você vai aprender a preparar a VPS, transferir o código, gerenciar o processo com PM2 ou systemd, e garantir que o bot reinicie automaticamente se a VPS reiniciar.
Tempo estimado: 30-45 minutos da primeira conexão SSH até o bot online com auto-restart configurado.
Pré-requisitos
Uma VPS com Ubuntu 24.04 LTS (qualquer plano de 1 vCPU/2 GB cobre bots pequenos), acesso SSH como root ou usuário com sudo, e o código do bot funcionando localmente — token gerado no Discord Developer Portal e bot adicionado a pelo menos um servidor de teste.
Ubuntu 24.04 LTS 1 vCPU / 1 GB RAM SSH com sudo 22 (padrão) Tenha em mãos o token do bot (em
https://discord.com/developers/applications → sua aplicação → Bot → Reset
Token). Você vai colar esse token num arquivo .env dentro da VPS.
Conexão SSH e usuário dedicado
Rodar bot como root é prática ruim — qualquer dependência comprometida vira acesso total à VPS. Crie um usuário dedicado pra isolar o processo.
Conecte na VPS via SSH a partir do seu terminal local:
ssh root@seu-ip-da-vpsSubstitua seu-ip-da-vps pelo IP que o provedor entregou. Na primeira
conexão, aceite a fingerprint do servidor digitando yes.
Crie um usuário bot com home directory e shell bash:
adduser bot
usermod -aG sudo botA primeira linha pede uma senha (escolha uma forte) e alguns campos opcionais que você pode pular com Enter. A segunda adiciona o usuário ao grupo sudo pra ele poder instalar pacotes quando necessário.
Mude pra o usuário bot e confirme que ele tem permissões corretas:
su - bot
whoamiA saída deve ser bot. Daqui em diante, todos os comandos rodam como esse
usuário (não como root).
Instalação do runtime
Escolha a stack conforme a linguagem do seu bot. Esta seção cobre Node.js (pra discord.js) e Python (pra discord.py) — pule pra subseção apropriada.
Node.js para discord.js
A maneira recomendada de instalar Node.js no Ubuntu é via NodeSource, que mantém pacotes atualizados pra cada major version LTS.
Instale Node.js 22 LTS (atual em 2026):
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt install -y nodejsO primeiro comando adiciona o repositório oficial NodeSource ao apt. O segundo instala Node.js junto com npm.
Verifique as versões instaladas:
node --version
npm --versionVocê deve ver v22.x.x e algo como 10.x.x respectivamente.
Python para discord.py
Ubuntu 24.04 já vem com Python 3.12. Você só precisa do venv e pip pra isolar dependências.
Instale ferramentas Python:
sudo apt update
sudo apt install -y python3-pip python3-venv gitpython3-venv permite criar ambientes virtuais isolados, evitando conflito
entre dependências de bots diferentes ou com pacotes do sistema.
Transferência do código
Você pode subir o código via Git (recomendado, mantém histórico e facilita updates) ou SCP direto do seu computador.
Se o código está no GitHub/GitLab, clone na home do usuário bot:
cd ~
git clone https://github.com/seu-usuario/seu-bot.git
cd seu-botPra repositórios privados, configure uma deploy key SSH ou use um Personal Access Token na URL.
Alternativa via SCP — rode no seu computador local, não na VPS:
scp -r ./seu-bot bot@seu-ip-da-vps:/home/bot/Reconecte na VPS depois (ssh bot@seu-ip-da-vps) e entre no diretório
cd ~/seu-bot.
Instale as dependências do projeto. Pra Node.js:
npm install --productionPra Python (com venv):
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txtA flag --production no npm pula devDependencies (testes, linter), o que
economiza espaço e tempo de instalação.
Variáveis de ambiente
Nunca deixe o token do bot hardcoded no código. Use um arquivo .env com
permissão restrita.
Crie o arquivo .env na raiz do projeto:
nano .envAdicione as variáveis necessárias, exemplo pra discord.js:
DISCORD_TOKEN=seu-token-aqui
NODE_ENV=productionSalve com Ctrl+O, Enter, Ctrl+X.
Restrinja a permissão do arquivo pra só o usuário bot poder ler:
chmod 600 .envIsso evita que outros usuários no sistema (caso existam) leiam o token.
Adicione .env ao seu .gitignore antes do primeiro commit. Token vazado
em repositório público é um dos vetores de comprometimento de bot mais
comuns — bots maliciosos varrem GitHub atrás disso 24/7.
Gerenciamento de processo com PM2
PM2 é o gerenciador de processo padrão pro ecossistema Node.js. Ele faz restart automático em crash, mantém logs estruturados e integra com systemd pra sobreviver a reboot.
Instale PM2 globalmente:
sudo npm install -g pm2A flag -g instala em /usr/lib/node_modules, disponível pra todos os
usuários.
Inicie o bot com PM2:
pm2 start index.js --name meu-botSubstitua index.js pelo entrypoint do seu bot e meu-bot por um nome
identificável. O PM2 vai mostrar uma tabela com PID, status e uso de
memória.
Configure o PM2 pra iniciar no boot da VPS:
pm2 startup
pm2 saveO primeiro comando imprime uma linha sudo env PATH=... pm2 startup ...
— copie e execute essa linha exata. O segundo salva o estado atual dos
processos pra ser restaurado no próximo boot.
Gerenciamento de processo com systemd
Pra bots em Python ou quando você prefere o stack base do Linux, systemd é a alternativa nativa. Não precisa instalar nada — vem com o Ubuntu.
Crie um arquivo de serviço systemd:
sudo nano /etc/systemd/system/meu-bot.serviceCole o conteúdo abaixo, ajustando paths e comando:
[Unit]
Description=Meu Bot Discord
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=bot
WorkingDirectory=/home/bot/seu-bot
ExecStart=/home/bot/seu-bot/venv/bin/python3 bot.py
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.targetPra Node.js sem PM2, troque o ExecStart por
/usr/bin/node /home/bot/seu-bot/index.js.
Ative e inicie o serviço:
sudo systemctl daemon-reload
sudo systemctl enable meu-bot
sudo systemctl start meu-botdaemon-reload faz o systemd reler os arquivos de serviço. enable
configura pra iniciar no boot. start inicia agora.
Verificação
Confirme que o bot está rodando e respondendo no Discord.
Com PM2:
pm2 status
pm2 logs meu-bot --lines 50
Você deve ver o bot com status online na tabela e logs mostrando
mensagens tipo Logged in as MeuBot#1234.
Com systemd:
sudo systemctl status meu-bot
sudo journalctl -u meu-bot -n 50 -f
A saída deve mostrar active (running) em verde. A flag -f no
journalctl deixa os logs em tempo real (Ctrl+C pra sair).
No próprio Discord, vá pro servidor de teste e mande um comando que o bot responde. Confirme que ele aparece online (bolinha verde) na lista de membros.
Resolução de problemas
Bot mostra status offline mesmo com processo rodando
Geralmente é token inválido (você gerou um novo e esqueceu de atualizar
o .env) ou o bot não tem o intent correto habilitado no Developer
Portal. Verifique nos logs do PM2/journalctl por Invalid Token ou
DisallowedIntents.
Erro “EADDRINUSE” no início
Você tem outra instância do bot rodando. Liste com pm2 list ou
sudo systemctl status meu-bot e pare a duplicata antes de reiniciar.
Bot consome RAM crescente até crashar
Memory leak no código — comum em handlers de mensagem que acumulam
estado sem limpar. Use pm2 monit pra ver uso em tempo real. Pra
mitigar enquanto investiga, configure --max-memory-restart 500M no PM2,
que reinicia o processo quando ultrapassa 500 MB.
Próximos passos
Com o bot rodando 24/7, considere os próximos passos pra produção:
- Configure backups automáticos do código e banco de dados (se tiver) pra
outro local —
rsyncvia cron pra outro servidor ou serviço S3-compatível - Adicione um sistema de monitoramento externo (UptimeRobot, Healthchecks.io) que pinga seu bot ou um endpoint de health-check
- Implemente logging estruturado (Winston pra Node.js, structlog pra Python) e centralize em Loki ou Elasticsearch se rodar vários bots
- Use sharding nativo do discord.js/discord.py se o bot crescer pra 2.500+ servidores
- Se você está colocando isso em produção séria, uma VPS Hostini no Brasil entrega latência baixa pros gateways do Discord na América do Sul e snapshots agendados pra restaurar o bot em minutos se algo der errado.
Perguntas frequentes
PM2 ou systemd: qual é melhor pra rodar bot Discord?
PM2 é mais simples pra desenvolvedor Node.js — cluster mode, logs estruturados e `pm2 monit` saem de fábrica. Systemd é o padrão Linux, sem dependência adicional, e tem integração nativa com journald pra logs. Se você só tem um bot Node.js, PM2 economiza tempo. Se roda bots em linguagens diferentes ou prefere o stack base do Ubuntu, systemd é mais coerente.
Quanto de RAM e CPU um bot Discord consome?
Bot pequeno em discord.js fica entre 80-150 MB de RAM em idle e usa CPU desprezível (<1%). Bots com cache de servidores grandes (10k+ membros), música ou IA podem subir pra 300-800 MB. Uma VPS de 1 vCPU e 2 GB de RAM cobre confortavelmente vários bots pequenos rodando juntos.
Por que meu bot cai sozinho depois de algumas horas?
Causas comuns: token sendo invalidado por race condition em múltiplas instâncias rodando ao mesmo tempo, rate limit do Discord (429), erro não tratado em event handler que mata o processo, ou OOM kill do kernel quando a VPS fica sem RAM. Verifique `pm2 logs` ou `journalctl -u seu-bot.service -e` pra encontrar a stack trace antes do crash.
Preciso de IP fixo pra hospedar bot Discord?
Não. O bot abre uma conexão WebSocket de saída pra api.discord.com — quem inicia o handshake é o bot, não o Discord. Qualquer VPS com IP público funciona. IP fixo só importa se você roda também um webhook server recebendo eventos HTTP do Discord, e mesmo assim subdomínio + DNS resolve.
Como faço deploy de uma atualização do bot sem perder uptime?
Com PM2: `git pull && pm2 reload seu-bot` faz reload zero-downtime mantendo o processo vivo. Com systemd: `git pull && sudo systemctl restart seu-bot` causa ~2-5s de offline. Pra evitar isso, rode duas instâncias com sharding e reinicie uma por vez — só faz sentido se o bot está em 2.500+ servidores.
É seguro deixar o token do bot direto no .env?
Sim, desde que o arquivo .env tenha permissão 600 (`chmod 600 .env`) e nunca seja commitado no Git (adicione no .gitignore). O risco real é vazar via screenshot, log público ou backup mal configurado. Em times maiores, use um secret manager (HashiCorp Vault, AWS Secrets Manager), mas pra solo dev em VPS dedicada, .env com permissão restrita é aceitável.