Cómo alojar un bot de Discord en un VPS (Node.js o Python)

Un bot de Discord en tu ordenador se apaga cuando lo apagas tú. En un VPS está encendido siempre y se reinicia solo si falla. Esta guía lo monta con Node.js o Python, el token a salvo y un servicio que arranca con el sistema.

Cómo alojar un bot de Discord en un VPS (Node.js o Python)
  • Un bot solo hace conexiones de salida: no necesitas abrir ningún puerto más allá de SSH.
  • Guarda el token en un archivo .env fuera del repositorio y con permisos restringidos; si se filtra, regéneralo.
  • Ejecútalo con un usuario normal y como servicio de systemd (o PM2) para que arranque con el VPS y se reinicie solo.
  • Los logs se leen con journalctl -u nombre -f.

Antes de empezar

El token es la contraseña de tu bot. Quien lo tenga lo controla. No lo pegues en el código, ni lo subas a GitHub, ni lo compartas. Si crees que se ha filtrado, regéneralo en el portal de Discord.

Crear un usuario para el bot

No ejecutes el bot como root: si alguien aprovecha un fallo, tendría todo el VPS. Crea un usuario solo para él:

sudo adduser --disabled-password --gecos "" bot

Instalar el entorno

Node.js (versión LTS):

sudo apt update
curl -fsSL https://deb.nodesource.com/setup_lts.x -o nodesource_setup.sh
sudo bash nodesource_setup.sh
sudo apt install -y nodejs
node -v

Python 3 (suele venir ya en Ubuntu y Debian):

sudo apt install -y python3 python3-venv python3-pip
python3 --version

Subir el bot

Copia tu proyecto a /home/bot/mibot. Si está en Git: sudo -u bot git clone URL /home/bot/mibot. O súbelo por SFTP/scp con tu usuario y luego cámbialo de dueño:

sudo chown -R bot:bot /home/bot/mibot

Instala las dependencias como el usuario bot:

cd /home/bot/mibot
sudo -u bot npm install --omit=dev
cd /home/bot/mibot
sudo -u bot python3 -m venv venv
sudo -u bot venv/bin/pip install -r requirements.txt

Guardar el token a salvo

Crea un archivo .env con las variables que lea tu bot y bloquea su lectura a los demás usuarios:

DISCORD_TOKEN=pega_aqui_tu_token
sudo chown bot:bot /home/bot/mibot/.env
sudo chmod 600 /home/bot/mibot/.env

En el código, lee el token de la variable de entorno (por ejemplo process.env.DISCORD_TOKEN en Node o os.environ["DISCORD_TOKEN"] en Python) y añade .env a tu .gitignore.

Dejarlo 24/7 con systemd

systemd arranca tu bot con el VPS y lo reinicia si se cae. Crea el servicio:

sudo nano /etc/systemd/system/mibot.service
[Unit]
Description=Mi bot de Discord
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=bot
WorkingDirectory=/home/bot/mibot
EnvironmentFile=/home/bot/mibot/.env
ExecStart=/usr/bin/node index.js
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

Para Python, cambia la línea de ExecStart por ExecStart=/home/bot/mibot/venv/bin/python bot.py (con el nombre de tu archivo principal). Comprueba la ruta de Node con which node. Actívalo:

sudo systemctl daemon-reload
sudo systemctl enable --now mibot
sudo systemctl status mibot

Si ves active (running), tu bot ya está conectado. Mira sus logs en directo con:

sudo journalctl -u mibot -f

Alternativa: PM2 (solo Node.js)

Si prefieres PM2:

sudo npm install -g pm2
sudo -u bot pm2 start index.js --name mibot
sudo -u bot pm2 save
sudo env PATH=$PATH:/usr/bin pm2 startup systemd -u bot --hp /home/bot

Actualizar y mantener

  • Actualiza el código, reinstala dependencias si hace falta y reinicia con sudo systemctl restart mibot.
  • Mantén el sistema al día: sudo apt update && sudo apt upgrade -y.
  • Haz copias de seguridad antes de cambios grandes y ten el firewall activo.

Si solo quieres tu bot encendido, sin administrar un servidor, mira nuestro Discord Bot Hosting.

Preguntas frecuentes

¿Necesito abrir algún puerto para el bot?

No. Los bots de Discord se conectan hacia fuera. Basta con tener abierto SSH. Solo abrirías un puerto si tu bot también ofrece una web o una API.

¿Cuánta RAM necesita un bot?

Un bot sencillo cabe en muy poca memoria; los grandes (música, muchos servidores) necesitan más. Mira el consumo con htop y ajusta.

El bot no arranca, ¿qué miro?

Los logs con sudo journalctl -u mibot -n 100. Los fallos típicos son un token mal copiado, una dependencia sin instalar o una ruta equivocada en ExecStart.