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

Lo que necesitas antes de empezar

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.

Sistema Ubuntu 24.04 LTS
Recursos mínimos 1 vCPU / 1 GB RAM
Acceso SSH con sudo
Puerto SSH 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.

01

Conéctate a la VPS vía SSH desde tu terminal local:

ssh root@tu-ip-de-la-vps

Sustituye tu-ip-de-la-vps por la IP que entregó el proveedor. En la primera conexión, acepta la fingerprint del servidor escribiendo yes.

02

Crea un usuario bot con home directory y shell bash:

adduser bot
usermod -aG sudo bot

La 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.

03

Cambia al usuario bot y confirma que tiene los permisos correctos:

su - bot
whoami

La 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.

04

Instala Node.js 22 LTS (actual en 2026):

curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt install -y nodejs

El primer comando añade el repositorio oficial NodeSource a apt. El segundo instala Node.js junto con npm.

05

Verifica las versiones instaladas:

node --version
npm --version

Deberí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.

04

Instala herramientas Python:

sudo apt update
sudo apt install -y python3-pip python3-venv git

python3-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.

06

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-bot

Para repositorios privados, configura una deploy key SSH o usa un Personal Access Token en la URL.

07

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.

08

Instala las dependencias del proyecto. Para Node.js:

npm install --production

Para Python (con venv):

python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt

El 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.

09

Crea el archivo .env en la raíz del proyecto:

nano .env

Añade las variables necesarias, ejemplo para discord.js:

DISCORD_TOKEN=tu-token-aqui
NODE_ENV=production

Guarda con Ctrl+O, Enter, Ctrl+X.

10

Restringe los permisos del archivo para que solo el usuario bot pueda leerlo:

chmod 600 .env

Esto evita que otros usuarios del sistema (si existen) lean el token.

Nunca commitees el .env

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.

11

Instala PM2 globalmente:

sudo npm install -g pm2

El flag -g instala en /usr/lib/node_modules, disponible para todos los usuarios.

12

Inicia el bot con PM2:

pm2 start index.js --name mi-bot

Sustituye 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.

13

Configura PM2 para que se inicie en el boot de la VPS:

pm2 startup
pm2 save

El 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.

11

Crea un archivo de servicio systemd:

sudo nano /etc/systemd/system/mi-bot.service

Pega 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.target

Para Node.js sin PM2, cambia el ExecStart por /usr/bin/node /home/bot/tu-bot/index.js.

12

Habilita e inicia el servicio:

sudo systemctl daemon-reload
sudo systemctl enable mi-bot
sudo systemctl start mi-bot

daemon-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 — rsync ví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.

Temas:
Próximos pasos VPS, dedicado o panel gestionado para FiveM, SAMP, MTA, Tibia y más.Aloja tu servidor de juegos con Hostini →
¿Te resultó útil este tutorial?
Hablar por WhatsApp