Como hospedar um bot do Discord em uma VPS: guia completo
Bots do Discord estão por toda a plataforma: eles atribuem cargos a novos membros, banem spammers, tocam música em canais de voz e respondem perguntas usando IA. Escrever um bot é apenas metade do trabalho. A outra metade é fazer com que ele rode continuamente — não apenas enquanto o seu notebook está ligado.
A abordagem mais comum é mover o bot para uma VPS. O servidor roda 24/7, é independente da sua conexão doméstica com a internet, não reinicia inesperadamente e nunca entra em modo de suspensão. Este artigo cobre todo o processo: da escolha do servidor à configuração de reinicialização automática em caso de falha. Os exemplos são apresentados para Python e Node.js, passo a passo, com comandos reais.
Por que seu computador doméstico não é adequado para produção
Quando você está escrevendo um bot pela primeira vez, executá-lo diretamente na sua máquina é a forma mais rápida de testar se tudo funciona. Mas, para um bot que atende um servidor real do Discord, essa é uma solução ruim no longo prazo.
Ambientes domésticos são imprevisíveis: seu provedor de internet pode cair por horas, o computador pode entrar em suspensão, o Windows pode instalar atualizações e reiniciar. Endereços IP domésticos geralmente são dinâmicos — eles mudam, e se o bot depende de listas de permissões ou notificações por webhook, isso cria problemas adicionais. Além disso, o bot consome recursos da sua máquina o tempo todo.
Uma VPS resolve todos esses problemas de uma vez. Endereço IP fixo, alta disponibilidade e um ambiente isolado onde o bot roda sozinho — completamente independente da sua rotina.
O básico: VPS, SSH e gerenciador de processos
O que é uma VPS
Uma VPS (Virtual Private Server, ou servidor virtual privado) é uma máquina virtual executada em um servidor físico dentro de um data center. Você recebe recursos dedicados: CPU, RAM e espaço em disco. O gerenciamento é feito via SSH — uma conexão remota segura por linha de comando. Em servidores Linux, essa é a principal ferramenta para todas as operações.
O que é SSH
SSH (Secure Shell) é um protocolo para se conectar remotamente a um servidor. Com ele, você digita comandos como se estivesse sentado na frente daquela máquina, mesmo que ela esteja fisicamente em um data center em outra cidade. No macOS e no Linux, o SSH já vem integrado; no Windows, está disponível no PowerShell e por meio do aplicativo PuTTY.
Por que você precisa de um gerenciador de processos
Se você simplesmente executar o bot pelo terminal, ele será encerrado assim que a sessão SSH for fechada. Um gerenciador de processos — systemd, PM2 ou supervisor — inicia o bot como um serviço em segundo plano, reinicia o processo em caso de falha e o coloca no ar automaticamente após uma reinicialização do servidor.
Requisitos mínimos do servidor
Um bot do Discord sem recursos de voz consome poucos recursos. Um bot típico em Python, com algumas dezenas de comandos, usa cerca de 50 a 150 MB de RAM. Um bot de voz ou um bot que executa modelos de ML localmente é uma situação diferente.
| Tipo de bot | RAM | CPU | Disco |
|---|---|---|---|
| Comandos de texto, moderação | 512 MB | 1 núcleo | 10 GB |
| Integrações com API, banco de dados | 1 GB | 1–2 núcleos | 20 GB |
| Bot de música (canais de voz) | 2 GB | 2 núcleos | 20 GB |
| Bot com modelo de ML local | 4+ GB | 2–4 núcleos | 40+ GB |
Para a maioria dos projetos, um plano inicial com 1 GB de RAM é suficiente. Em uma VPS da Serverspace, essa configuração é suficiente para executar vários bots pequenos ao mesmo tempo. Os recursos podem ser escalados pelo painel de controle a qualquer momento, sem reinstalar o sistema operacional.
Etapa 1. Primeira conexão e configuração do sistema
Depois de criar uma VPS, você recebe um endereço IP e uma senha root ou uma chave SSH, caso tenha escolhido essa opção. Conecte-se ao servidor:
ssh root@seu_endereco_ip
A primeira coisa a fazer é atualizar os pacotes. Isso é importante: um sistema recém-instalado muitas vezes vem com softwares desatualizados que podem conter vulnerabilidades conhecidas.
apt update && apt upgrade -y
Executar tudo permanentemente como root não é uma boa prática. É melhor criar um usuário dedicado para o bot, com privilégios limitados:
adduser botuser
usermod -aG sudo botuser
su - botuser
A partir deste ponto, todas as operações são executadas pela conta botuser, com sudo usado apenas para tarefas administrativas. Isso reduz riscos: mesmo que exista uma vulnerabilidade no bot, um invasor não terá acesso root a todo o sistema.
Etapa 2. Instalando o ambiente de execução
Python
No Ubuntu 22.04, o Python 3 já vem pré-instalado. Verifique a versão e instale o pip junto com o módulo de ambiente virtual:
python3 --version
sudo apt install python3-pip python3-venv -y
Node.js
Para Node.js, recomenda-se instalar a versão LTS mais recente usando o script oficial da NodeSource — a versão nos repositórios padrão do Ubuntu geralmente fica desatualizada:
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
node --version && npm --version
Etapa 3. Enviando o código do bot para o servidor
O método mais conveniente é usar Git. Se o projeto estiver hospedado no GitHub ou no GitLab, instale o git e clone o repositório:
sudo apt install git -y
git clone https://github.com/seu_usuario/seu_bot.git
cd seu_bot
Se você não tem um repositório e precisa copiar os arquivos da sua máquina local, use scp — ele funciona pela mesma conexão SSH:
scp -r /caminho/local/do/bot botuser@seu_ip:/home/botuser/bot
Após a transferência, verifique se tudo está no lugar: o arquivo principal (main.py ou index.js), o arquivo de dependências (requirements.txt ou package.json) e todas as pastas com comandos e arquivos de configuração.
Etapa 4. Configurando variáveis de ambiente
O token do seu bot do Discord é um dado sensível. Inserir esse token diretamente no código-fonte é um erro: assim que o código é enviado para o GitHub, o token fica exposto para qualquer pessoa. A abordagem correta é armazenar o token e outros segredos em um arquivo .env.
Crie o arquivo no diretório do bot:
nano .env
Exemplo de conteúdo:
DISCORD_TOKEN=seu_token_aqui
PREFIX=!
DATABASE_URL=sqlite:///bot.db
Adicione .env ao seu .gitignore — esse arquivo nunca deve entrar no repositório. Para carregar variáveis de ambiente em um bot Python, use a biblioteca python-dotenv:
from dotenv import load_dotenv
import os
load_dotenv()
TOKEN = os.getenv("DISCORD_TOKEN")
Para Node.js, use o pacote dotenv — ele é conectado com uma única linha no início do arquivo principal: require('dotenv').config().
Etapa 5. Instalando dependências
Python — ambiente virtual
Um ambiente virtual isola os pacotes do projeto da instalação Python do sistema. Isso é importante se o servidor hospeda vários bots ou aplicações Python com requisitos diferentes de versões de bibliotecas.
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
Quando ativado, (venv) aparece no início do prompt do terminal — todos os comandos pip seguintes serão executados dentro do ambiente isolado.
Node.js
npm install
Etapa 6. Execução de teste
Antes de configurar a inicialização automática, confirme que o bot inicia sem erros:
# Python (dentro do venv ativado)
python3 main.py
# Node.js
node index.js
Se uma mensagem de conexão do Discord aparecer no console, tudo está funcionando. Teste rapidamente alguns comandos no chat. Se algo der errado, os erros aparecerão diretamente no terminal. Para interromper o processo: Ctrl + C.
Vale observar: enquanto o bot estiver rodando diretamente pelo terminal, ele será encerrado quando a sessão SSH for fechada. Para operação contínua, é preciso seguir a próxima etapa.
Etapa 7. Inicialização automática com systemd
systemd é o gerenciador de serviços padrão no Ubuntu e na maioria das distribuições Linux. Ele inicia processos durante o boot do sistema, reinicia processos em caso de falha e mantém logs. Para um bot do Discord em uma VPS, essa é a abordagem ideal.
Crie um arquivo de unidade para o serviço:
sudo nano /etc/systemd/system/discord-bot.service
Conteúdo para um bot Python:
[Unit]
Description=Discord Bot
After=network.target
[Service]
Type=simple
User=botuser
WorkingDirectory=/home/botuser/bot
ExecStart=/home/botuser/bot/venv/bin/python main.py
Restart=on-failure
RestartSec=5
EnvironmentFile=/home/botuser/bot/.env
[Install]
WantedBy=multi-user.target
Para Node.js, a linha ExecStart fica diferente:
ExecStart=/usr/bin/node /home/botuser/bot/index.js
Algumas observações sobre a configuração. After=network.target significa que o bot só será iniciado depois que a rede estiver pronta — algo essencial para se conectar ao Discord. Restart=on-failure reinicia o processo após uma falha, mas não após um encerramento limpo. EnvironmentFile carrega as variáveis do arquivo .env.
Ative e inicie o serviço:
sudo systemctl daemon-reload
sudo systemctl enable discord-bot
sudo systemctl start discord-bot
Verifique o status:
sudo systemctl status discord-bot
A linha Active: active (running) confirma que o serviço está em execução. Agora o bot será iniciado automaticamente após qualquer reinicialização do servidor e se recuperará em caso de falha.
Alternativa: PM2 para Node.js
PM2 é um gerenciador de processos popular no ecossistema Node.js. Ele é um pouco mais simples de configurar inicialmente, oferece monitoramento conveniente pelo terminal e gerencia várias aplicações em um único ambiente.
npm install -g pm2
pm2 start index.js --name "discord-bot"
pm2 startup
pm2 save
O comando pm2 startup gera um comando para criar uma entrada no systemd, que você precisará executar. pm2 save salva a lista atual de processos — exatamente o que o PM2 restaurará depois de uma reinicialização.
Para ver logs em tempo real:
pm2 logs discord-bot
Para bots em Python, o systemd nativo costuma ser mais prático. Se toda a sua stack for Node.js, o PM2 oferece mais ferramentas de monitoramento em um só lugar.
Visualização de logs e diagnóstico de problemas
Quando o bot roda como um serviço systemd, os logs são lidos pelo journalctl:
sudo journalctl -u discord-bot -f
A flag -f ativa o modo de acompanhamento em tempo real. Para ver as últimas 100 linhas sem transmissão contínua:
sudo journalctl -u discord-bot -n 100
Se o bot tiver seu próprio logging em arquivos, procure um arquivo de log no diretório de trabalho. Em bots Python, isso geralmente é bot.log ou uma pasta logs/.
Atualizando o bot
Quando você precisa implantar uma nova versão do código, o processo é simples. Se você usa Git:
cd /home/botuser/bot
git pull origin main
source venv/bin/activate # apenas Python
pip install -r requirements.txt # se as dependências mudaram
sudo systemctl restart discord-bot
A reinicialização leva apenas alguns segundos. Para a maioria dos bots, isso é perfeitamente aceitável — os usuários quase não percebem a breve reconexão. Se quiser minimizar o tempo de indisponibilidade, implemente um desligamento gracioso no próprio bot: finalize tarefas em andamento antes de encerrar.
Segurança do servidor e do bot
Implantar um bot e deixar o servidor com a configuração padrão cria exposição desnecessária. Algumas medidas devem ser tomadas logo após a implantação inicial.
Desative o login por senha para root e configure chaves SSH. Scanners automatizados começam a tentar ataques de força bruta em senhas poucos minutos depois que um novo IP aparece online. Uma chave SSH é mais segura do que qualquer senha.
Configure o UFW — firewall integrado do Ubuntu:
sudo ufw allow OpenSSH
sudo ufw enable
sudo ufw status
Por padrão, o UFW bloqueia todas as conexões de entrada, exceto aquelas explicitamente permitidas. Se o bot precisar de um servidor web para receber solicitações de webhook, adicione a porta necessária separadamente.
Armazene o token do bot apenas no arquivo .env. Se o token acabar em um repositório público, redefina-o imediatamente no Discord Developer Portal. A regeneração leva um segundo; as consequências de um token vazado podem ser significativas — qualquer pessoa com acesso a ele ganha controle total sobre o bot.
No lado do Discord: não conceda permissões de administrador ao bot em um servidor, a menos que a funcionalidade realmente exija isso. Permissões mínimas significam dano mínimo se algo der errado.
Casos de uso práticos
Vamos ver quais tarefas um bot do Discord executado em um servidor permanentemente disponível pode realmente assumir.
Moderação de uma grande comunidade. O bot atribui cargos automaticamente ao entrar, filtra palavras proibidas, emite avisos e mantém um registro de violações. Tudo isso exige operação ininterrupta — qualquer queda cria uma janela sem monitoramento no canal.
Notificações automatizadas. O bot monitora um feed RSS, verifica status do GitHub Actions ou acompanha novos releases no PyPI — depois publica avisos no canal apropriado. Esse tipo de lógica depende de um agendador de tarefas (APScheduler para Python ou node-cron para Node.js) e simplesmente não funciona de forma confiável em uma máquina que é desligada periodicamente.
Recursos de jogo com banco de dados. O bot armazena pontuações, reputação e inventários de personagens. SQLite funciona bem para servidores menores; PostgreSQL lida com cargas mais pesadas. O banco de dados fica na mesma VPS, junto com o bot, o que simplifica backups e migrações.
Bot de voz. Reproduz música em canais de voz. Isso exige ffmpeg e yt-dlp instalados no servidor, uma conexão estável e uma CPU razoavelmente potente. Um plano com 2 GB de RAM é recomendado — codificar um stream de áudio em tempo real consome recursos.
Integrações com IA. O bot responde perguntas via API da OpenAI, gera imagens ou resume textos. Ao usar uma API externa, uma configuração básica de VPS é suficiente. Se o modelo roda localmente, você precisará de um servidor com vários gigabytes de RAM e uma CPU adequada.
Erros comuns e como evitá-los
| Problema | Causa | Solução |
|---|---|---|
| O bot para quando a sessão SSH é fechada | O processo está vinculado à sessão do terminal | Configure um serviço systemd ou use PM2 |
| Token exposto no repositório | Token hardcoded no código-fonte ou ausência de .gitignore | Redefina o token no Developer Portal; mova-o para .env |
| ModuleNotFoundError quando o serviço inicia | ExecStart aponta para o Python do sistema em vez do venv | Use o caminho completo para venv/bin/python no arquivo de unidade |
| O bot não consegue ler variáveis de ambiente | EnvironmentFile não foi especificado na seção [Service] | Adicione EnvironmentFile=/caminho/.env ao arquivo do serviço |
| Slash commands não atualizam após o deploy | O Discord mantém comandos globais em cache por até 1 hora | Use guild_id durante o desenvolvimento — as atualizações são instantâneas |
| A memória cresce e o bot trava a cada poucos dias | Vazamento de memória ou cache sem limite no código | Defina Restart=always no systemd e revise a lógica de cache |
Conclusão
Implantar um bot do Discord em um servidor em nuvem leva algumas horas na primeira vez e apenas alguns minutos em cada atualização posterior. As principais etapas são: criar um usuário na VPS, instalar o ambiente de execução, enviar o código, mover segredos para um arquivo .env e configurar um serviço systemd com inicialização automática.
Depois disso, o bot roda de forma independente do seu computador pessoal, reinicia automaticamente em caso de falha e permanece disponível para os usuários 24 horas por dia. Uma configuração mínima já é suficiente para começar — uma VPS da Serverspace pode ser escalada conforme a carga aumenta, diretamente pelo painel de controle.
Perguntas frequentes
Sim. Cada bot roda como um serviço systemd separado, com seu próprio arquivo de unidade e seu próprio .env. Os recursos são compartilhados entre todos os processos, então, ao executar vários bots, escolha um plano com RAM suficiente de sobra.
Não. O bot se conecta aos servidores do Discord por meio de uma conexão WebSocket de saída — um IP estático não é necessário para isso. Você só precisará de um se expuser uma interface web ou aceitar solicitações de webhook de entrada.
Verifique os logs: sudo journalctl -u discord-bot -n 50. Ali haverá um traceback detalhado. Causas comuns incluem: token inválido, dependência ausente, permissões insuficientes no arquivo do banco de dados ou um erro de sintaxe introduzido em uma atualização recente.
Ubuntu 22.04 LTS é a escolha mais comum: grande comunidade, pacotes atualizados e suporte até 2027. Debian e Rocky Linux são alternativas sólidas — para fins de implantação de bots, a diferença é mínima.
É exatamente para isso que serve uma VPS. O servidor opera de forma independente do seu dispositivo — 24 horas por dia, 7 dias por semana. Não é necessário manter seu próprio computador ligado para manter o bot ativo.