Como hospedar um bot do Discord em Node.js (discord.js)

Para hospedar um bot discord.js, crie o app no Portal, leia o token de uma variável de ambiente e rode o index.js numa máquina sempre ligada. Configure também algo que reinicie o processo se ele cair.

Atualizado em 4 min de leitura

Objetivos de aprendizado

Depois de ler este artigo, você vai conseguir:

  • Criar um bot discord.js que lê o token de variável de ambiente
  • Registrar um slash command e testar o bot localmente
  • Levar o bot para uma hospedagem e verificar que ele está online
Nesta página

Um bot discord.js é um processo Node.js que abre uma conexão com o Gateway do Discord e responde a eventos. O bot aparece online enquanto esse processo está de pé e conectado; se o processo para, o bot fica offline para todo mundo.

Este guia vai do projeto vazio ao bot no ar, com código completo em discord.js v14 e módulos ES. Se você ainda não criou o app no Discord, o artigo como criar seu primeiro bot do Discord cobre essa parte em detalhes.

index.jsNode.jssempre ligadoGatewaydo DiscordDISCORD_TOKENdeploy-commands.jsroda uma vezregistra /pingAPI RESTdo Discord
O processo do bot fica ligado e conectado ao Gateway; o registro dos comandos é um script à parte, que roda uma vez pela API REST.

O que você precisa antes de começar?#

  • Node.js em versão LTS. O guia oficial do discord.js recomenda a versão LTS ativa do Node.js, e o calendário oficial mostra qual é ela.
  • Um app no Portal de Desenvolvedores do Discord, com o bot criado e o token copiado.
  • Um servidor de teste onde você tenha permissão para convidar o bot.

O token é a senha do bot. Veja como obter e guardar o seu em token do bot do Discord. Daqui em diante ele sempre vem de uma variável de ambiente chamada DISCORD_TOKEN.

Como montar o projeto?#

Crie a pasta e instale a biblioteca:

bash
mkdir meu-bot && cd meu-bot
npm init -y
npm install discord.js

No package.json, adicione "type": "module" para usar import. Depois crie o arquivo .env (e adicione .env ao .gitignore):

bash
DISCORD_TOKEN=cole_o_token_aqui
CLIENT_ID=id_da_aplicacao
GUILD_ID=id_do_servidor_de_teste

O Node.js carrega esse arquivo sozinho com a flag --env-file, sem pacote extra. Ela existe desde a versão 20.6 e é estável a partir da 24.10, segundo a documentação do Node.js.

Como escrever o código do bot?#

Crie o index.js. O bot abaixo usa só o intent Guilds, que basta para slash commands, e responde ao comando /ping:

js
import { Client, Events, GatewayIntentBits } from "discord.js";

const client = new Client({ intents: [GatewayIntentBits.Guilds] });

client.once(Events.ClientReady, (readyClient) => {
  console.log(`Online como ${readyClient.user.tag}`);
});

client.on(Events.InteractionCreate, async (interaction) => {
  if (!interaction.isChatInputCommand()) return;

  if (interaction.commandName === "ping") {
    await interaction.reply("Pong!");
  }
});

client.login(process.env.DISCORD_TOKEN);

Se o bot precisar ler o texto das mensagens, você terá de ativar o intent privilegiado MessageContent no Portal e no código. Esse é o erro mais comum de quem migra de comandos com prefixo, e está explicado em erro de intents no bot do Discord.

Como registrar o slash command?#

Ligar o bot não cria o comando. É preciso enviá-lo à API do Discord uma vez, e de novo sempre que a definição mudar. Crie o deploy-commands.js:

js
import { REST, Routes, SlashCommandBuilder } from "discord.js";

const commands = [
  new SlashCommandBuilder().setName("ping").setDescription("Responde com Pong!"),
].map((command) => command.toJSON());

const rest = new REST().setToken(process.env.DISCORD_TOKEN);

await rest.put(
  Routes.applicationGuildCommands(process.env.CLIENT_ID, process.env.GUILD_ID),
  { body: commands },
);
console.log(`${commands.length} comando(s) registrado(s).`);

Registrar por servidor é o caminho indicado para testar. Quando os comandos estiverem prontos, troque a rota por Routes.applicationCommands(process.env.CLIENT_ID) para valer em todos os servidores onde o bot está, como explica o guia do discord.js.

Para o convite funcionar, gere a URL em OAuth2 no Portal marcando os escopos bot e applications.commands.

Como testar antes de hospedar?#

Registre o comando e ligue o bot:

bash
node --env-file=.env deploy-commands.js
node --env-file=.env index.js

O terminal deve mostrar Online como NomeDoBot. No servidor, digite /ping e confira se a resposta chega. Se o bot fica online, mas o comando não aparece, volte ao registro. Se o bot não entra online, o token está errado ou foi redefinido.

Onde hospedar o bot?#

O seu computador serve para desenvolver, mas o bot cai quando a máquina desliga. Para ficar no ar, o processo precisa rodar em outra máquina sempre ligada:

  • VPS: você instala o Node.js, configura um supervisor como pm2 ou systemd e cuida de atualizações e firewall. O passo a passo está em como deixar um bot online 24/7.
  • Plataforma de hospedagem de bots: você envia o código e define as variáveis; o ambiente Node.js já existe. Costuma ser mais rápido de configurar.

Para estimar a memória do seu bot, veja quanta RAM um bot precisa, e para comparar valores, quanto custa hospedar um bot.

Quais erros aparecem na hora de hospedar?#

  • Error [TokenInvalid]: An invalid token was provided.: a variável DISCORD_TOKEN não chegou ao processo. Na hospedagem não existe o seu .env local, a menos que você o envie; defina a variável no painel.
  • Used disallowed intents: o código pede um intent privilegiado que não está ativo no Portal.
  • O processo termina sem erro: o arquivo principal está errado, ou uma exceção não tratada derrubou o Node.js. Leia os logs e veja por que o bot fica offline.
  • Comando aparece duas vezes: o mesmo comando foi registrado por servidor e globalmente. Registre só por um dos caminhos.

Como fazer isso na Square Cloud#

Na Square Cloud, o bot roda num container isolado e sempre ligado, com reinício automático (ligado por padrão no deploy pelo painel) quando o processo encerra com erro. Você faz o deploy por ZIP no painel, CLI, GitHub ou extensão do VS Code.

  1. Compacte o projeto em ZIP (index.js, package.json, sem node_modules) e envie pelo painel; no start, a plataforma roda npm install. O arquivo de configuração squarecloud.app é opcional: o painel o gera com o runtime, a memória e o arquivo principal, ou você o escreve na raiz do projeto.
  2. Escolha o Node.js como runtime e index.js como arquivo principal. Cada aplicação de fundo, como um bot, usa no mínimo 256 MB do pool de RAM do plano.
  3. Defina DISCORD_TOKEN nas variáveis de ambiente da aplicação. A mudança vale no próximo reinício, sem rebuild.
  4. Acompanhe os logs em tempo real no painel, na CLI ou no VS Code e confirme a linha Online como ....

Os planos são pagos: o Hobby, de R$ 12,49 por mês, inclui 1 GB de RAM e 1 vCPU. Veja os detalhes em hospedagem de bots Discord na Square Cloud.

Hospedagem de bots

Seu bot online 24/7, com reinício automático

Saiba mais

Perguntas frequentes

Qual versão do Node.js devo usar com discord.js?

Use a versão LTS ativa do Node.js, como recomenda o guia oficial do discord.js. Ela atende ao mínimo que o discord.js v14 declara no npm e recebe correções por mais tempo.

Preciso do intent MessageContent para o bot funcionar?

Não para slash commands. O intent Guilds basta. MessageContent é privilegiado e só é necessário se o bot precisa ler o texto de mensagens comuns.

Posso colocar o token direto no código?

Não. Quem vir o código vê o token e controla o bot. Leia o token de uma variável de ambiente e, se ele vazar, gere outro no Portal de Desenvolvedores.

Por que o slash command não aparece no Discord?

O comando precisa ser registrado na API do Discord, e isso é um passo separado de ligar o bot. Rode o script de registro e confirme que o bot foi convidado com o escopo applications.commands.

Próximo passo · Passo 4 de 5Como deixar um bot do Discord online 24/7Para deixar um bot do Discord online 24/7, rode o processo numa máquina sempre ligada com reinício automático. Veja PC, VPS com pm2 ou systemd e hospedagem.