Cómo hospedar un bot de Discord en Python

Para hospedar un bot de discord.py, ejecuta el script en una máquina siempre encendida, con el token en una variable de entorno y las dependencias en un requirements.txt. Un bot pequeño suele caber en 256 MB de RAM.

Actualizado el 6 min de lectura

Objetivos de aprendizaje

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

  • Escribir un bot discord.py 2.x listo para producción
  • Preparar requirements.txt y variables de entorno para el deploy
  • Verificar que el bot está en línea y corregir los errores más comunes
En esta página

Un bot hecho con discord.py es un script de Python que abre una conexión con el Gateway de Discord y se queda en ejecución. Hospedar el bot es decidir dónde vive ese proceso, para que siga activo cuando cierras el editor o apagas el equipo.

Esta guía cubre el camino completo: código, dependencias, token, deploy y verificación. Los ejemplos usan la API de discord.py 2.x; consulta la versión actual en PyPI.

requirements.txtbot.pypip installpython bot.pydiscord.pylibreríaProcesodel botDISCORD_TOKENvariable deentornoEntorno Python, siempre encendidoGatewayde Discord
Sube bot.py y requirements.txt, define DISCORD_TOKEN en el entorno e inicia con python bot.py; el proceso se conecta al Gateway.

¿Qué necesitas antes de hospedar?#

¿Cómo escribir un bot de discord.py que funcione en producción?#

Crea un entorno virtual e instala la biblioteca:

bash
python3 -m venv .venv
source .venv/bin/activate   # en Windows: .venv\Scripts\activate
pip install -U discord.py

Ahora el bot.py (discord.py 2.x). Usa un slash command, que no necesita el intent privilegiado message_content, y lee el token del entorno:

python
import os

import discord
from discord.ext import commands


class MiBot(commands.Bot):
    async def setup_hook(self) -> None:
        # Registra los slash commands en Discord al iniciar
        await self.tree.sync()


intents = discord.Intents.default()
bot = MiBot(command_prefix=commands.when_mentioned, intents=intents)


@bot.event
async def on_ready() -> None:
    print(f"En línea como {bot.user}")


@bot.tree.command(name="ping", description="Muestra la latencia del bot")
async def ping(interaction: discord.Interaction) -> None:
    await interaction.response.send_message(f"Pong! {round(bot.latency * 1000)} ms")


bot.run(os.environ["DISCORD_TOKEN"])

Dos detalles importan para el hospedaje. Primero, os.environ["DISCORD_TOKEN"] lanza KeyError si la variable no existe, lo cual es bueno: el bot ni siquiera arranca con una configuración incompleta. Segundo, bot.run() ya configura el log y bloquea hasta que el proceso termina, así que no necesitas un bucle ni asyncio.run.

Sincronizar los comandos en cada inicio sirve para un bot pequeño. Si reinicias el bot con frecuencia, ejecuta la sincronización solo cuando cambien los comandos.

¿Cuándo necesito el intent message_content?#

Solo si el bot lee el texto de los mensajes, como en comandos con prefijo (!ping). El quickstart de discord.py, que responde a $hello, advierte en un comentario que el ejemplo "requiere el intent message_content" y lo activa con intents.message_content = True. Es un intent privilegiado: actívalo en la pestaña Bot del Developer Portal, en Privileged Gateway Intents, y también en el código. Activarlo solo de un lado no basta. Por encima de 100 servidores, la documentación advierte que usar intents privilegiados exige la verificación del bot.

¿Cómo declarar las dependencias?#

El hospedaje necesita saber qué instalar. Crea un requirements.txt en la raíz del proyecto, junto a bot.py:

text
discord.py>=2.7,<3

Si el bot reproduce audio en canales de voz, la documentación indica instalar el extra: discord.py[voice]. Fija de la misma forma la versión de cualquier otra biblioteca que uses (base de datos, peticiones HTTP). Genera la lista de tu entorno con pip freeze > requirements.txt cuando todo funcione.

¿Cómo pasar el token sin ponerlo en el código?#

Usa una variable de entorno. En la terminal, en Linux y macOS:

bash
export DISCORD_TOKEN="pega_aqui_el_token"
python3 bot.py

En PowerShell: $env:DISCORD_TOKEN="pega_aqui_el_token". Si usas un archivo .env en local, nunca lo subas al repositorio: agrégalo al .gitignore. El concepto y su razón de ser están en qué son las variables de entorno. Si el token se filtra, restablécelo en el Developer Portal; el anterior deja de funcionar al instante.

¿Cómo poner el bot en línea?#

En cualquier hospedaje los pasos son los mismos: subir bot.py y requirements.txt, definir DISCORD_TOKEN e iniciar con python bot.py. Lo que cambia es quién mantiene vivo el proceso:

Dónde ¿Sobrevive si apagas tu PC? Qué mantienes tú
Tu computadora No Todo, y el bot cae con la máquina
VPS Sí Sistema, actualizaciones, supervisor (systemd, Docker)
Plataforma de hospedaje de bots Sí El código y la memoria

En un VPS, ejecuta el bot bajo systemd con Restart=always o en un contenedor Docker con --restart unless-stopped, como muestra la guía de bot en línea 24/7. Ejecutar python bot.py en una sesión SSH no basta: el proceso muere al cerrar la sesión. Para entender qué pasa con tu PC, lee bot de Discord sin conexión cuando se apaga el PC. La idea general de enviar el código para que corra en otra máquina está en qué es el deploy.

¿Cómo verificar que el bot funciona?#

  1. Mira los logs de inicio. Debes leer la línea En línea como NombreDelBot.
  2. En el servidor, confirma que el bot aparece en línea en la lista de miembros.
  3. Escribe /ping y confirma la respuesta. Los slash commands pueden tardar unos instantes en aparecer; si no aparecen, reinicia el cliente de Discord.
  4. Mata el proceso y comprueba si el hospedaje lo levanta de nuevo. Sin eso, el "24/7" es puro optimismo.

¿Qué errores comunes tumban un bot de discord.py?#

  • discord.errors.LoginFailure: Improper token has been passed. El token es incorrecto, tiene espacios de más o fue restablecido. Cópialo de nuevo en el Developer Portal y revisa la variable.
  • discord.errors.PrivilegedIntentsRequired. El código pide un intent privilegiado (como message_content) que no está activado en el portal. Actívalo o quítalo del código.
  • ModuleNotFoundError: No module named 'discord'. Las dependencias no se instalaron en el entorno donde corre el bot. Revisa el requirements.txt.
  • KeyError: 'DISCORD_TOKEN'. La variable no se definió en el hospedaje.
  • Un archivo llamado discord.py. La documentación advierte: no llames a tu script discord.py, porque choca con la biblioteca. Usa bot.py.
  • Un bot que cae por poca RAM. El proceso se mata cuando la memoria se agota. Mira la lista completa en por qué un bot de Discord se queda sin conexión.
  • Respuestas lentas o fallos por exceso de peticiones. Mira el error 429 de Discord.

Cómo hacerlo en Square Cloud#

En Square Cloud, tu bot.py corre en un contenedor aislado con el runtime de Python, siempre encendido y sin modo de suspensión. El reinicio automático viene activado en el deploy desde el panel y trae el bot de vuelta cuando el proceso termina con error. Tú mismo haces el deploy: subida de ZIP en el panel, CLI, GitHub (un push despliega) o la extensión de VS Code. Al iniciar, la plataforma instala las dependencias con pip install -r requirements.txt. discord.py funciona como cualquier otra biblioteca de Gateway, con sharding y voz, y FFmpeg está disponible en el contenedor.

El token entra como variable de entorno de la aplicación, en el panel, la API o la CLI; el cambio se aplica en el próximo reinicio, sin rebuild. El archivo de configuración squarecloud.app es opcional: el panel lo genera en el deploy con runtime, memoria y archivo principal, y escribirlo en la raíz del proyecto es la alternativa. Los logs aparecen en tiempo real en el panel, la CLI y la app móvil.

Todos los planes son de pago y se cobran en reales. El Hobby cuesta R$12,49 al mes, con 1 GB de RAM compartido entre tus aplicaciones y un mínimo de 256 MB por aplicación en segundo plano, como un bot. Mira los detalles en hospedaje de bots de Discord.

Hosting de bots

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

Más información

Preguntas frecuentes

¿Qué versión de Python necesita discord.py?

Consulta la versión mínima en la documentación oficial de discord.py. En un proyecto nuevo, usa una versión de Python que aún reciba actualizaciones de seguridad.

¿Necesito el intent message_content para que el bot funcione?

Solo si el bot lee el texto de los mensajes, por ejemplo con comandos con prefijo. Los slash commands no lo necesitan. Es un intent privilegiado: actívalo en el Developer Portal y también en el código.

¿Puedo hospedar un bot de discord.py en mi PC?

Sirve para probar, pero el bot queda sin conexión cuando el equipo se apaga, se suspende o pierde internet. Para estar en línea las 24 horas, usa una máquina que no se apague, como un VPS o una plataforma de hospedaje.

¿Cómo paso el token del bot sin ponerlo en el código?

Define una variable de entorno, como DISCORD_TOKEN, y léela con os.environ en Python. Así el token no llega al repositorio y puedes cambiarlo sin editar el código.

Siguiente artículoCómo hospedar un bot de WhatsApp 24/7Para mantener un bot de WhatsApp 24/7, ejecuta el proceso en un servidor siempre encendido y guarda la sesión en disco. Código con Baileys y la Cloud API oficial.