Cómo Alojar un Bot de Discord 24 Horas en una VPS Linux
Tutorial completo para desplegar bots de Discord (discord.js o discord.py) en una VPS Linux con PM2 o systemd para uptime 24/7.
Un bot de Discord corriendo en tu portátil funciona hasta el primer reinicio de Windows o caída del Wi-Fi. Para tener un bot disponible 24 horas al día, necesitas un servidor que esté encendido todo el tiempo — y una VPS Linux barata resuelve esto por menos de 6 USD al mes con recursos de sobra para crecer.
Este tutorial está dirigido a desarrolladores con un bot ya funcionando en discord.js (Node.js) o discord.py (Python) que quieren hacer el despliegue en producción por primera vez. Vas a aprender a preparar la VPS, transferir el código, gestionar el proceso con PM2 o systemd, y garantizar que el bot se reinicie automáticamente si la VPS se reinicia.
Tiempo estimado: 30-45 minutos desde la primera conexión SSH hasta el bot en línea con auto-reinicio configurado.
Prerrequisitos
Una VPS con Ubuntu 24.04 LTS (cualquier plan de 1 vCPU/2 GB cubre bots pequeños), acceso SSH como root o usuario con sudo, y el código del bot funcionando localmente — token generado en el Discord Developer Portal y bot añadido al menos a un servidor de prueba.
Ubuntu 24.04 LTS 1 vCPU / 1 GB RAM SSH con sudo 22 (por defecto) Ten a mano el token del bot (en
https://discord.com/developers/applications → tu aplicación → Bot → Reset
Token). Vas a pegar ese token en un archivo .env dentro de la VPS.
Conexión SSH y usuario dedicado
Correr un bot como root es una mala práctica — cualquier dependencia comprometida se convierte en acceso total a la VPS. Crea un usuario dedicado para aislar el proceso.
Conéctate a la VPS vía SSH desde tu terminal local:
ssh root@tu-ip-de-la-vpsSustituye tu-ip-de-la-vps por la IP que entregó el proveedor. En la
primera conexión, acepta la fingerprint del servidor escribiendo yes.
Crea un usuario bot con home directory y shell bash:
adduser bot
usermod -aG sudo botLa primera línea pide una contraseña (elige una fuerte) y algunos campos opcionales que puedes saltar con Enter. La segunda añade el usuario al grupo sudo para que pueda instalar paquetes cuando sea necesario.
Cambia al usuario bot y confirma que tiene los permisos correctos:
su - bot
whoamiLa salida debe ser bot. A partir de aquí, todos los comandos se ejecutan
como ese usuario (no como root).
Instalación del runtime
Elige el stack según el lenguaje de tu bot. Esta sección cubre Node.js (para discord.js) y Python (para discord.py) — salta a la subsección apropiada.
Node.js para discord.js
La forma recomendada de instalar Node.js en Ubuntu es vía NodeSource, que mantiene paquetes actualizados para cada major version LTS.
Instala Node.js 22 LTS (actual en 2026):
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt install -y nodejsEl primer comando añade el repositorio oficial NodeSource a apt. El segundo instala Node.js junto con npm.
Verifica las versiones instaladas:
node --version
npm --versionDeberías ver v22.x.x y algo como 10.x.x respectivamente.
Python para discord.py
Ubuntu 24.04 ya viene con Python 3.12. Solo necesitas venv y pip para aislar las dependencias.
Instala herramientas Python:
sudo apt update
sudo apt install -y python3-pip python3-venv gitpython3-venv permite crear entornos virtuales aislados, evitando
conflictos entre dependencias de bots distintos o con paquetes del sistema.
Transferencia del código
Puedes subir el código vía Git (recomendado, mantiene historial y facilita actualizaciones) o SCP directo desde tu computadora.
Si el código está en GitHub/GitLab, clónalo en el home del usuario bot:
cd ~
git clone https://github.com/tu-usuario/tu-bot.git
cd tu-botPara repositorios privados, configura una deploy key SSH o usa un Personal Access Token en la URL.
Alternativa vía SCP — ejecuta en tu computadora local, no en la VPS:
scp -r ./tu-bot bot@tu-ip-de-la-vps:/home/bot/Vuelve a conectarte a la VPS después (ssh bot@tu-ip-de-la-vps) y entra
en el directorio con cd ~/tu-bot.
Instala las dependencias del proyecto. Para Node.js:
npm install --productionPara Python (con venv):
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txtEl flag --production en npm omite devDependencies (tests, linter), lo
que ahorra espacio y tiempo de instalación.
Variables de entorno
Nunca dejes el token del bot hardcoded en el código. Usa un archivo .env
con permisos restrictivos.
Crea el archivo .env en la raíz del proyecto:
nano .envAñade las variables necesarias, ejemplo para discord.js:
DISCORD_TOKEN=tu-token-aqui
NODE_ENV=productionGuarda con Ctrl+O, Enter, Ctrl+X.
Restringe los permisos del archivo para que solo el usuario bot pueda
leerlo:
chmod 600 .envEsto evita que otros usuarios del sistema (si existen) lean el token.
Añade .env a tu .gitignore antes del primer commit. Un token filtrado
en un repositorio público es uno de los vectores de compromiso de bots más
comunes — bots maliciosos rastrean GitHub buscando esto 24/7.
Gestión de procesos con PM2
PM2 es el gestor de procesos estándar para el ecosistema Node.js. Hace restart automático tras un crash, mantiene logs estructurados e integra con systemd para sobrevivir a un reboot.
Instala PM2 globalmente:
sudo npm install -g pm2El flag -g instala en /usr/lib/node_modules, disponible para todos los
usuarios.
Inicia el bot con PM2:
pm2 start index.js --name mi-botSustituye index.js por el entrypoint de tu bot y mi-bot por un nombre
identificable. PM2 mostrará una tabla con PID, status y uso de memoria.
Configura PM2 para que se inicie en el boot de la VPS:
pm2 startup
pm2 saveEl primer comando imprime una línea sudo env PATH=... pm2 startup ...
— copia y ejecuta esa línea exacta. El segundo guarda el estado actual de
los procesos para restaurarlo en el próximo boot.
Gestión de procesos con systemd
Para bots en Python o cuando prefieres el stack base de Linux, systemd es la alternativa nativa. No necesitas instalar nada — viene con Ubuntu.
Crea un archivo de servicio systemd:
sudo nano /etc/systemd/system/mi-bot.servicePega el contenido siguiente, ajustando paths y comando:
[Unit]
Description=Mi Bot Discord
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=bot
WorkingDirectory=/home/bot/tu-bot
ExecStart=/home/bot/tu-bot/venv/bin/python3 bot.py
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.targetPara Node.js sin PM2, cambia el ExecStart por
/usr/bin/node /home/bot/tu-bot/index.js.
Habilita e inicia el servicio:
sudo systemctl daemon-reload
sudo systemctl enable mi-bot
sudo systemctl start mi-botdaemon-reload hace que systemd relea los archivos de servicio. enable
lo configura para iniciar en el boot. start lo inicia ahora.
Verificación
Confirma que el bot está corriendo y respondiendo en Discord.
Con PM2:
pm2 status
pm2 logs mi-bot --lines 50
Deberías ver el bot con status online en la tabla y logs mostrando
mensajes tipo Logged in as MiBot#1234.
Con systemd:
sudo systemctl status mi-bot
sudo journalctl -u mi-bot -n 50 -f
La salida debe mostrar active (running) en verde. El flag -f en
journalctl deja los logs en tiempo real (Ctrl+C para salir).
En el propio Discord, ve al servidor de prueba y manda un comando al que el bot responda. Confirma que aparece online (círculo verde) en la lista de miembros.
Resolución de problemas
El bot muestra status offline incluso con el proceso corriendo
Generalmente es un token inválido (generaste uno nuevo y olvidaste
actualizar el .env) o el bot no tiene el intent correcto habilitado en
el Developer Portal. Revisa los logs de PM2/journalctl buscando
Invalid Token o DisallowedIntents.
Error “EADDRINUSE” al iniciar
Tienes otra instancia del bot corriendo. Lístala con pm2 list o
sudo systemctl status mi-bot y detén la duplicada antes de reiniciar.
El bot consume RAM creciente hasta crashar
Memory leak en el código — común en handlers de mensaje que acumulan
estado sin limpiar. Usa pm2 monit para ver el uso en tiempo real. Para
mitigar mientras investigas, configura --max-memory-restart 500M en PM2,
que reinicia el proceso cuando supera los 500 MB.
Próximos pasos
Con el bot corriendo 24/7, considera los siguientes pasos para producción:
- Configura backups automáticos del código y la base de datos (si la
tienes) hacia otro lugar —
rsyncvía cron a otro servidor o servicio S3-compatible - Añade un sistema de monitoreo externo (UptimeRobot, Healthchecks.io) que haga ping a tu bot o a un endpoint de health-check
- Implementa logging estructurado (Winston para Node.js, structlog para Python) y centralízalo en Loki o Elasticsearch si corres varios bots
- Usa sharding nativo de discord.js/discord.py si el bot crece a 2.500+ servidores
- Si vas a poner esto en producción seria, una VPS Hostini en Brasil entrega latencia baja hacia los gateways de Discord en Sudamérica y snapshots programados para restaurar el bot en minutos si algo sale mal.
Preguntas frecuentes
PM2 o systemd: ¿cuál es mejor para correr un bot de Discord?
PM2 es más sencillo para desarrolladores Node.js — modo cluster, logs estructurados y `pm2 monit` vienen de fábrica. Systemd es el estándar de Linux, sin dependencias adicionales, y tiene integración nativa con journald para los logs. Si solo tienes un bot Node.js, PM2 ahorra tiempo. Si corres bots en lenguajes distintos o prefieres el stack base de Ubuntu, systemd es más coherente.
¿Cuánta RAM y CPU consume un bot de Discord?
Un bot pequeño en discord.js consume entre 80-150 MB de RAM en idle y usa CPU despreciable (<1%). Bots con caché de servidores grandes (10k+ miembros), música o IA pueden subir a 300-800 MB. Una VPS de 1 vCPU y 2 GB de RAM cubre cómodamente varios bots pequeños corriendo juntos.
¿Por qué mi bot se cae solo después de algunas horas?
Causas comunes: token invalidado por una race condition con múltiples instancias corriendo a la vez, rate limit de Discord (429), error no manejado en un event handler que mata el proceso, o un OOM kill del kernel cuando la VPS se queda sin RAM. Revisa `pm2 logs` o `journalctl -u tu-bot.service -e` para encontrar el stack trace antes del crash.
¿Necesito una IP fija para alojar un bot de Discord?
No. El bot abre una conexión WebSocket saliente hacia api.discord.com — quien inicia el handshake es el bot, no Discord. Cualquier VPS con IP pública funciona. La IP fija solo importa si también corres un webhook server recibiendo eventos HTTP de Discord, y aun así un subdominio con DNS resuelve el problema.
¿Cómo despliego una actualización del bot sin perder uptime?
Con PM2: `git pull && pm2 reload tu-bot` hace un reload zero-downtime manteniendo el proceso vivo. Con systemd: `git pull && sudo systemctl restart tu-bot` causa ~2-5s de offline. Para evitarlo, corre dos instancias con sharding y reinicia una a la vez — solo tiene sentido si el bot está en 2.500+ servidores.
¿Es seguro dejar el token del bot directo en el .env?
Sí, siempre que el archivo .env tenga permiso 600 (`chmod 600 .env`) y nunca se commitee a Git (añádelo al .gitignore). El riesgo real es filtrarlo por captura de pantalla, log público o backup mal configurado. En equipos grandes usa un secret manager (HashiCorp Vault, AWS Secrets Manager), pero para un dev solo en VPS dedicada, un .env con permiso restrictivo es aceptable.