Alojar un Bot de Discord 24/7 - Tutorial Completo

Guía paso a paso para alojar tu bot de Discord en producción 24/7 en un VPS. Con PM2 (Node.js) y systemd (Python).

Introducción

¿Has programado un bot de Discord con discord.js o discord.py? Para que funcione 24/7, necesitas un VPS. Aquí está el procedimiento.

Paso 1: Elegir y contratar un VPS

Un VPS de entrada (1 vCPU, 1-2 GB RAM, NVMe) basta para la mayoría de bots de Discord. En By-Hoster, calcula unos 4,99 €/mes.

  1. Ve al área de cliente By-Hoster
  2. Elige "VPS Linux" → distribución Ubuntu 22.04 LTS
  3. Valida y paga, el VPS se entrega en 60 segundos por email con acceso SSH

Paso 2: Conexión SSH y preparación

  1. Conéctate por SSH: ssh root@tu-ip
  2. Actualiza el sistema: apt update && apt upgrade -y
  3. Crea un usuario no-root: adduser botuser && usermod -aG sudo botuser
  4. Instala Node.js 20 LTS: curl -fsSL https://deb.nodesource.com/setup_20.x | bash && apt install -y nodejs (para Node) o Python 3: apt install -y python3 python3-pip python3-venv (para Python)

Paso 3: Desplegar tu bot

  1. Sube tu código vía Git: git clone https://github.com/tu-usuario/tu-bot.git
  2. Instala las dependencias: npm install (Node) o pip install -r requirements.txt (Python)
  3. Crea un archivo .env con tu token de Discord, nunca hagas commit a Git
  4. Prueba lanzándolo manualmente: node bot.js o python bot.py

Paso 4: Mantener el bot 24/7

Para Node.js: usa PM2.

  1. Instala PM2: npm install -g pm2
  2. Inicia tu bot: pm2 start bot.js --name discord-bot
  3. Configura el inicio automático al reboot: pm2 startup && pm2 save
  4. Ver los logs: pm2 logs discord-bot

Paso 5: Asegurar tu VPS de bot Discord

Un bot de Discord expuesto en Internet es un objetivo prioritario para bruteforce SSH, escaneos de puertos y intentos de explotación. Tres medidas de hardening bastan para eliminar el 99% de las amenazas: autenticación SSH solo por clave, firewall UFW restrictivo y fail2ban contra ataques de diccionario.

  1. Desactivar el login SSH por contraseña: genera una clave en tu equipo (ssh-keygen -t ed25519), cópiala al VPS (ssh-copy-id botuser@tu-ip), luego edita /etc/ssh/sshd_config y pon PasswordAuthentication no + PermitRootLogin no. Recarga: systemctl restart sshd
  2. Activar UFW (firewall Ubuntu): ufw default deny incoming && ufw default allow outgoing && ufw allow ssh && ufw enable. Tu bot Discord establece conexiones salientes (hacia gateway.discord.gg), no se necesitan puertos entrantes
  3. Instalar fail2ban: apt install -y fail2ban && systemctl enable --now fail2ban. Bloquea automáticamente cualquier IP que intente más de 5 logins SSH fallidos en 10 minutos (ban de 1 hora por defecto)
  4. Actualizaciones automáticas de seguridad: apt install -y unattended-upgrades && dpkg-reconfigure --priority=low unattended-upgrades. Los parches críticos (CVE) se instalan sin intervención
  5. Almacenar el token de Discord en un .env fuera del repo: añade .env a tu .gitignore, cárgalo con dotenv (Node) o python-dotenv (Python). Nunca hagas commit de tu token en GitHub, Discord revoca los tokens filtrados en segundos

Solución de problemas: mi bot Discord se cae, ¿qué hacer?

Un bot que cae en producción raramente se debe a un VPS defectuoso, en el 90% de los casos es un error aplicativo (token caducado, excepción no gestionada, desbordamiento de memoria, rate limit Discord). Aquí está la checklist de diagnóstico a seguir en orden.

  • Verificar el estado del proceso: pm2 status (Node) o systemctl status mi-bot (Python). Busca "online" / "active (running)". Si "errored" / "failed", pasa al siguiente punto
  • Leer los logs recientes: pm2 logs discord-bot --lines 100 o journalctl -u mi-bot -n 100 --no-pager. Logs típicos de Discord a identificar: DiscordAPIError[401] = token inválido o revocado, DiscordAPIError[429] = rate limit, UnhandledPromiseRejection = excepción async no gestionada
  • Token inválido (401 Unauthorized): regenera un nuevo token en discord.com/developers/applications → Bot → Reset Token. Actualiza tu .env y luego pm2 restart discord-bot
  • Bot OOM-killed (out of memory): verifica con dmesg | grep -i "killed process". Si se confirma, o tu código tiene una fuga de memoria (caché que crece sin límite), o el VPS está infradimensionado, sube a 4 GB RAM
  • Bot offline pero proceso activo: Discord probablemente cerró el WebSocket. Activa autoReconnect: true en discord.js (por defecto) o implementa un handler on('disconnect') que relance client.login()
  • Forzar un reinicio limpio: pm2 restart discord-bot --update-env recarga código Y variables de entorno. Para empezar totalmente desde cero: pm2 delete discord-bot && pm2 start bot.js --name discord-bot
  • Monitoreo continuo: configura pm2 install pm2-logrotate (evita saturar el disco) y un webhook Discord vía pm2-discord-webhook que te alerta si el bot cae más de 3 veces en 5 minutos

Yendo más allá: añadir una base de datos a tu bot

Un bot de Discord serio necesita persistencia: configuración por servidor, estadísticas de usuarios, economía virtual, caché de comandos slash, moderación (warns, mutes). Tres opciones según tu necesidad: PostgreSQL para datos relacionales fiables, MongoDB para esquemas flexibles, Redis para caché rápido y leaderboards.

  • PostgreSQL (recomendado para el 80% de bots): apt install -y postgresql postgresql-contrib. Crea una base: sudo -u postgres createdb mibot. Ideal con Prisma ORM (Node): npm i @prisma/client prisma luego define tus modelos en schema.prisma y ejecuta npx prisma migrate dev. Type-safe, migraciones versionadas, perfecto para datos como guilds/users/warnings
  • MongoDB (para esquemas evolutivos): apt install -y mongodb-org luego systemctl enable --now mongod. Usa Mongoose (Node): npm i mongoose. Práctico para almacenar configuraciones JSON anidadas (settings de servidor con listas de roles, channels custom, etc.) sin definir un esquema rígido de antemano
  • Redis (caché + leaderboards en tiempo real): apt install -y redis-server. Usa ioredis (Node) o redis-py (Python). Ideal para: caché de comandos slash (TTL 1h), conteo de XP en sorted set (ZADD leaderboard 1500 user_id luego ZREVRANGE leaderboard 0 9 WITHSCORES para el top 10), rate limit anti-spam por usuario
  • Ejemplo Prisma mínimo (Node + PostgreSQL): model Guild { id String @id; prefix String @default("!"); xpEnabled Boolean @default(true); warnings Warning[] } luego en tu bot: const guild = await prisma.guild.upsert({ where: { id: msg.guildId }, update: {}, create: { id: msg.guildId } }). El bot memoriza los parámetros por servidor de forma duradera
  • Buenas prácticas: respalda tu base diariamente (pg_dump mibot > backup.sql vía cron), nunca expongas PostgreSQL/MongoDB en la IP pública (UFW deny todo excepto SSH), usa un pool de conexiones para evitar saturar la BBDD si tu bot escala

Preguntas frecuentes

Para un bot simple: 1 GB RAM mínimo. Para un bot con base de datos y varios cientos de servidores: 2-4 GB RAM. El VPS de entrada By-Hoster a 4,99 €/mes basta para el 90% de bots.

Sí, siempre que hayas configurado pm2 startup (Node) o un servicio systemd (Python). El bot reinicia automáticamente tras reboot.

PM2 es un process manager Node.js con dashboard integrado, logs coloreados, monitoreo CPU/RAM en tiempo real y clustering, ideal para discord.js. systemd es el gestor de servicios nativo Linux: más bajo nivel pero universal (Node, Python, Go, Rust). Para Python con discord.py/aiogram, systemd suele preferirse porque PM2 está diseñado para Node.