Un bot de Telegram que solo funciona mientras tu portátil está abierto no está realmente funcionando — está haciendo una demo. Para tenerlo de verdad en línea, respondiendo a las 3 de la madrugada, sobreviviendo a tus reinicios y a sus propios fallos, necesita vivir en un servidor. Aquí está todo el camino, de principio a fin, con los comandos.
Buenas noticias primero: un bot es un workload diminuto. Sobre todo reposa esperando mensajes, así que la máquina más barata lo ejecuta bien — sin IP dedicada, sin dominio, nada elaborado.
1. Consigue un token de BotFather
En Telegram, escribe a @BotFather, envía /newbot, elige un nombre y un nombre de usuario. Te entrega un token que se ve como 12345:AAH.... Trátalo como una contraseña — cualquiera que lo tenga controla tu bot.
2. Un bot mínimo
Conéctate por SSH al servidor, configura Python y la librería:
sudo apt update && sudo apt install -y python3-venv
mkdir ~/mybot && cd ~/mybot
python3 -m venv venv && source venv/bin/activate
pip install python-telegram-bot
Un bot que responde — ~/mybot/bot.py:
import os
from telegram.ext import ApplicationBuilder, CommandHandler
async def start(update, ctx):
await update.message.reply_text("Alive and on a server. 🟢")
app = ApplicationBuilder().token(os.environ["BOT_TOKEN"]).build()
app.add_handler(CommandHandler("start", start))
app.run_polling()
Fíjate en que lee el token de una variable de entorno — no codificado a fuego. Eso importa en el siguiente paso.
3. La parte que realmente lo mantiene funcionando: systemd
Si solo ejecutas python bot.py, muere en el momento en que cierras SSH. Un servicio systemd es lo que lo hace sobrevivir al cierre de sesión, los fallos y los reinicios. Crea /etc/systemd/system/mybot.service:
[Unit]
Description=Telegram bot
After=network-online.target
[Service]
WorkingDirectory=/home/youruser/mybot
Environment=BOT_TOKEN=12345:AAH...your-token
ExecStart=/home/youruser/mybot/venv/bin/python bot.py
Restart=always
RestartSec=5
User=youruser
[Install]
WantedBy=multi-user.target
Luego:
sudo systemctl daemon-reload
sudo systemctl enable --now mybot
sudo systemctl status mybot # debería decir active (running)
journalctl -u mybot -f # logs en vivo
Restart=always es la línea que hace el trabajo real — se cae, y vuelve en 5 segundos. enable significa que arranca tras un reinicio. Esa es toda la diferencia entre «ejecuté un bot una vez» y «mi bot está arriba».
4. Por qué no hay dominio ni puertos abiertos
El bot usa long polling — sale hacia Telegram por actualizaciones, así que nada necesita alcanzar hacia dentro. Sin URL pública, sin regla de firewall entrante, sin IP dedicada. Por eso un VPS NAT (IP compartida, SSH en un puerto) es un hogar válido y barato para un bot. Los webhooks existen para volumen muy alto, pero casi con seguridad no los necesitas para empezar.
Salvedades honestas
- Higiene del token: aquí está en línea en el archivo de unidad por claridad — bien en una máquina cerrada, pero para cualquier cosa compartida, cárgalo desde un
EnvironmentFilesolo-root en su lugar, y nunca lo subas a git. ¿Filtrado? Revócalo en BotFather, emite uno nuevo. - Bots pesados: si tu bot hace el trabajo él mismo (generación de imágenes, un modelo local), ya no es diminuto — sube el tamaño en consecuencia.
Eso es todo. Cierra la máquina primero con la checklist de seguridad, coloca el servicio, y tu bot sigue en línea estés o no. En un VPS pagado con cripto puedes tenerlo funcionando un minuto después de decidirlo.
Comentarios
Aún no hay comentarios. Sé el primero.