Cómo hospedar un bot de Discord con Node.js

Para hospedar un bot de discord.js, crea la app en el Portal, lee el token de una variable de entorno y ejecuta index.js en una máquina siempre encendida. Configura también algo que reinicie el proceso si falla.

Actualizado el 4 min de lectura

Objetivos de aprendizaje

Después de leer este artículo podrás:

  • Crear un bot de discord.js que lee el token de una variable de entorno
  • Registrar un slash command y probar el bot en local
  • Llevar el bot a un hosting y comprobar que está en línea
En esta página

Un bot de discord.js es un proceso de Node.js que abre una conexión con el Gateway de Discord y responde a eventos. El bot aparece en línea mientras ese proceso está activo y conectado; si el proceso se detiene, el bot queda desconectado para todos.

Esta guía va de una carpeta vacía a un bot en línea, con código completo de discord.js v14 y módulos ES. Si aún no creaste la app en Discord, cómo crear tu primer bot de Discord explica esa parte en detalle.

index.jsNode.jssiempre encendidoGatewayde DiscordDISCORD_TOKENdeploy-commands.jsse ejecuta una vezregistra /pingAPI RESTde Discord
El proceso del bot sigue encendido y conectado al Gateway; registrar los comandos es un script aparte que se ejecuta una vez contra la API REST.

¿Qué necesitas antes de empezar?#

  • Node.js en una versión LTS. La guía oficial de discord.js recomienda la versión LTS activa de Node.js, y el calendario oficial muestra cuál es.
  • Una app en el Portal de Desarrolladores de Discord, con el bot creado y el token copiado.
  • Un servidor de pruebas donde puedas invitar al bot.

El token es la contraseña del bot. Mira cómo obtenerlo y guardarlo en token del bot de Discord. De aquí en adelante siempre viene de una variable de entorno llamada DISCORD_TOKEN.

¿Cómo armas el proyecto?#

Crea la carpeta e instala la biblioteca:

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

En package.json agrega "type": "module" para usar import. Luego crea un archivo .env (y agrégalo al .gitignore):

bash
DISCORD_TOKEN=pega_el_token_aqui
CLIENT_ID=id_de_la_aplicacion
GUILD_ID=id_del_servidor_de_pruebas

Node.js carga ese archivo solo con la opción --env-file, sin paquetes extra. Existe desde la versión 20.6 y es estable desde la 24.10, según la documentación de Node.js.

¿Cómo escribes el código del bot?#

Crea index.js. Este bot usa solo el intent Guilds, suficiente para slash commands, y responde al comando /ping:

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

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

client.once(Events.ClientReady, (readyClient) => {
  console.log(`En línea 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);

Si el bot necesita leer el texto de los mensajes, deberás activar el intent privilegiado MessageContent en el Portal y en el código. Es el tropiezo más común de quien viene de comandos con prefijo, y se explica en error de intents en el bot de Discord.

¿Cómo registras el slash command?#

Encender el bot no crea el comando. Hay que enviarlo a la API de Discord una vez, y de nuevo cada vez que cambie su definición. Crea deploy-commands.js:

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

const commands = [
  new SlashCommandBuilder().setName("ping").setDescription("Responde con 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 es lo recomendado para probar. Cuando los comandos estén listos, cambia la ruta por Routes.applicationCommands(process.env.CLIENT_ID) para que valgan en todos los servidores donde está el bot, como explica la guía de discord.js.

Para que la invitación funcione, genera la URL en OAuth2 del Portal con los scopes bot y applications.commands.

¿Cómo pruebas antes de hospedar?#

Registra el comando y enciende el bot:

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

La terminal debe mostrar En línea como NombreDelBot. En tu servidor escribe /ping y comprueba que llega la respuesta. Si el bot está en línea, pero el comando no aparece, vuelve al paso de registro. Si el bot nunca se conecta, el token es incorrecto o fue restablecido.

¿Dónde hospedar el bot?#

Tu computadora sirve para desarrollar, pero el bot se cae cuando la apagas. Para mantenerse en línea, el proceso debe correr en otra máquina siempre encendida:

  • VPS: instalas Node.js, configuras un supervisor como pm2 o systemd y te encargas de actualizaciones y firewall. El paso a paso está en cómo mantener un bot de Discord en línea 24/7.
  • Plataforma de hosting de bots: subes el código y defines las variables; el entorno Node.js ya existe. Suele ser más rápido de configurar.

Para estimar la memoria de tu bot, mira cuánta RAM necesita un bot de Discord, y para comparar precios, cuánto cuesta hospedar un bot de Discord.

¿Qué errores aparecen al hospedar?#

  • Error [TokenInvalid]: An invalid token was provided.: la variable DISCORD_TOKEN no llegó al proceso. Tu .env local no existe en el hosting salvo que lo subas, así que define la variable en el panel.
  • Used disallowed intents: el código pide un intent privilegiado que no está activo en el Portal.
  • El proceso termina sin error: el archivo principal es incorrecto, o una excepción no controlada detuvo Node.js. Lee los logs y revisa por qué tu bot de Discord se desconecta.
  • Un comando aparece dos veces: el mismo comando se registró por servidor y de forma global. Regístralo solo por una de las dos vías.

Cómo hacerlo en Square Cloud#

En Square Cloud, el bot corre en un contenedor aislado y siempre encendido, con reinicio automático (activado por defecto en el deploy desde el panel) cuando el proceso termina con error. Tú haces el deploy por ZIP en el panel, CLI, GitHub o la extensión de VS Code.

  1. Comprime el proyecto en un ZIP (index.js, package.json, sin node_modules) y súbelo en el panel; al iniciar, la plataforma ejecuta npm install. El archivo de configuración squarecloud.app es opcional: el panel lo genera con el runtime, la memoria y el archivo principal, o tú lo escribes en la raíz del proyecto.
  2. Elige Node.js como runtime e index.js como archivo principal. Cada aplicación en segundo plano, como un bot, usa como mínimo 256 MB del pool de RAM del plan.
  3. Define DISCORD_TOKEN en las variables de entorno de la aplicación. El cambio aplica en el siguiente reinicio, sin rebuild.
  4. Sigue los logs en tiempo real en el panel, la CLI o VS Code y confirma la línea En línea como ....

Los planes son de pago: Hobby, a R$12,49 al mes, incluye 1 GB de RAM y 1 vCPU. Mira los detalles en hosting de bots de Discord en Square Cloud.

Hosting de bots

Tu bot en línea 24/7, con reinicio automático

Más información

Preguntas frecuentes

¿Qué versión de Node.js debo usar con discord.js?

Usa la versión LTS activa de Node.js, como recomienda la guía oficial de discord.js. Cumple el mínimo que discord.js v14 declara en npm y recibe correcciones durante más tiempo.

¿Necesito el intent MessageContent para que el bot funcione?

No para slash commands. Con el intent Guilds basta. MessageContent es privilegiado y solo hace falta si el bot debe leer el texto de mensajes normales.

¿Puedo poner el token directamente en el código?

No. Cualquiera que vea el código puede controlar el bot. Lee el token de una variable de entorno y, si se filtra, genera otro en el Portal de Desarrolladores.

¿Por qué no aparece mi slash command en Discord?

El comando debe registrarse en la API de Discord, y es un paso distinto de encender el bot. Ejecuta el script de registro y comprueba que invitaste al bot con el scope applications.commands.

Siguiente paso · Paso 4 de 5Cómo mantener tu bot de Discord en línea 24/7Para mantener un bot de Discord en línea 24/7, ejecuta el proceso en una máquina siempre encendida con reinicio automático. Compara PC, VPS con pm2 o systemd.