Una de las tareas más críticas, y a veces olvidadas, para cualquiera que gestione un servidor es mantener copias de seguridad fiables. Las soluciones pueden ser caras o complejas, pero hoy te voy a mostrar un método ingenioso, práctico y de coste cero utilizando un script para tu copia de seguridad en Telegram.
Telegram permite subir archivos de hasta 2 GB con cuentas estándar y 4 GB con Premium, según confirman los límites oficiales de la plataforma. Esta característica lo convierte en un almacenamiento práctico y seguro para mis copias de seguridad. Aquí te muestro un script que automatiza el respaldo de la base de datos MySQL y el código fuente de tu sitio web, enviándolo directamente a un chat de Telegram para que lo gestiones desde la app.
Esta guía es ideal para desarrolladores, administradores de sistemas o dueños de sitios web que gestionan su propio servidor VPS y buscan una solución de backup web en Telegram simple y automatizada.
Para crear un script de copia de seguridad en Telegram, necesitas dos componentes principales: un script de Python con la librería Telethon para enviar archivos a la API de Telegram, y un script de Bash que comprima tu web y base de datos MySQL. Finalmente, automatizas la ejecución de este último con un cronjob.
Requisitos Previos para el Script
Antes de sumergirnos en el código, asegúrate de que tu sistema tiene todo lo necesario. Esta guía está probada en Ubuntu/Debian y CentOS 7.
- Paquetes del Sistema:
- Para Debian/Ubuntu: Necesitarás Python 3,
pip, y las herramientaszip,unzipymysql-client.
sudo apt update && sudo apt install -y python3 python3-pip zip unzip mysql-client- Para CentOS 7 / AlmaLinux / Rocky:
Nota para usuarios de CentOS 7 (EOL desde 2024): Si yum falla con errores 404, tus repositorios están apuntando a espejos que ya no existen. Debes apuntarlos al archivo histórico (vault de CentOS) antes de continuar. Ejecuta esto primero:
sed -i 's/mirror.centos.org/vault.centos.org/g' /etc/yum.repos.d/*.repo
sed -i 's|^#baseurl=http|baseurl=http|g' /etc/yum.repos.d/*.repo
sed -i 's|^mirrorlist=http|#mirrorlist=http|g' /etc/yum.repos.d/*.repo
yum clean allAhora, instala los paquetes necesarios. mariadb es el cliente compatible con MySQL en estas distribuciones.
yum install -y epel-release
yum install -y python3 python3-pip zip unzip mariadb- Librería de Python: El script que se conecta a Telegram depende de la librería
Telethon. Para instalarla, ejecuta:
pip3 install telethonConfiguración del Script para Copia de Seguridad en Telegram
El proceso es sencillo y se divide en tres partes:
- Script para subir archivos a Telegram.
- Script para crear la copia de seguridad.
- Programar ejecuciones automáticas.
Paso 1: Crear el Script de Python para Enviar Archivos a Telegram
Primero, crearemos el script de Python para enviar archivos a Telegram, que se encargará de la comunicación con su API. Debes completar estos cuatro campos:
api_id =api_hash =phone_number =group_id =
Cómo obtenerlos:
- Entra en my.telegram.org, inicia sesión con tu número de Telegram y crea una nueva app en “API development tools”. Ahí obtendrás
api_idyapi_hash. phone_number: tu número completo con código de país (ej. +519XXXXXXXX).group_id: la opción más simple y privada es usar Mensajes guardados. Para obtener tu ID personal, habla con @userinfobot o @myidbot en Telegram y envía cualquier mensaje; te responderá con tu ID (número positivo, ej. 866845458).
Guarda el siguiente archivo como tele.py en un directorio seguro, por ejemplo, /root/code/. Puedes consultar la documentación oficial de Telethon para más detalles.
from telethon import TelegramClient
import asyncio
import os
import sys
from datetime import datetime, timezone, timedelta
# --- Configuración de credenciales ---
api_id = xxx # Tu api_id de my.telegram.org
api_hash = 'xxxxxx' # Tu api_hash de my.telegram.org
phone_number = '+519XXXXXXXX' # Tu número de Telegram con código de país
group_id = 866845458 # Tu ID personal (Mensajes guardados) o ID de grupo con -100...
log_file = '/root/code/backup_telegram.log'
def get_utc_time():
return datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S")
def write_log(message):
with open(log_file, 'a') as f:
f.write(f"{get_utc_time()} - {message}\n")
async def main(upload_directory):
client = TelegramClient('user_session', api_id, api_hash)
await client.start(phone=phone_number)
if not os.path.isdir(upload_directory):
msg = f"❌ No se encontró el directorio: {upload_directory}"
write_log(msg)
print(msg)
return
files = [os.path.join(upload_directory, f) for f in os.listdir(upload_directory) if os.path.isfile(os.path.join(upload_directory, f))]
if not files:
msg = "📂 El directorio está vacío, no hay archivos para subir."
write_log(msg)
print(msg)
return
write_log(f"📦 Iniciando subida de {len(files)} archivo(s) desde {upload_directory}")
for idx, file_path in enumerate(files, start=1):
filename = os.path.basename(file_path)
upload_time = get_utc_time()
file_size_mb = os.path.getsize(file_path) / (1024 * 1024)
if file_size_mb > 1900:
warning = f"⚠️ Archivo grande ({file_size_mb:.2f} MB), la subida podría fallar."
write_log(warning)
print(warning)
try:
print(f"🚀 [{idx}/{len(files)}] Subiendo {filename} ({file_size_mb:.2f} MB)")
await client.send_file(
group_id,
file_path,
caption=f"📄 Archivo: {filename}\n🕒 Subido: {upload_time} UTC\n📦 Tamaño: {file_size_mb:.2f} MB"
)
write_log(f"✅ Subida correcta: {filename}")
except Exception as e:
error_message = f"❌ Error al subir {filename}: {e}"
write_log(error_message)
print(error_message)
await client.send_message(group_id, f"❌ Error al subir {filename}\n{e}")
await client.disconnect()
print("🎉 Subida completada.")
write_log("Subida completada.")
if __name__ == '__main__':
if len(sys.argv) != 2:
print("❌ Uso: python3 tele.py /ruta/del/directorio")
sys.exit(1)
upload_directory = sys.argv[1]
asyncio.run(main(upload_directory))Prueba rápida:
Antes de automatizar, asegúrate de que la conexión funciona.
cd /root/code
echo "Prueba de conexión" > prueba.txt
python3 tele.py .La primera vez te pedirá un código de autenticación en la terminal. Una vez completado, si ves prueba.txt en tu chat de Telegram, ¡la conexión está funcionando correctamente!
Paso 2: Desarrollar el Script Bash para el Backup
Ahora, el script principal. Si no estás familiarizado con la creación de scripts, te recomiendo mi guía de introducción a Bash. Antes de crearlo, una nota sobre la ruta SOURCE_DIR: en un servidor estándar es /var/www/html, pero si usas un panel como cPanel o Plesk, podría ser /home/usuario/public_html o /var/www/vhosts/tudominio.com/httpdocs. Verifica tu ruta antes de continuar.
Crea el archivo backup.sh en /root/code/:
#!/bin/bash
# --- ÁREA DE CONFIGURACIÓN ---
WEBSITE_NAME="adictosalinux.com" # Nombre para el zip
SOURCE_DIR="/var/www/html" # Ruta de tu sitio (¡verifica que sea la correcta!)
CACHE_TO_EXCLUDE="$SOURCE_DIR/wp-content/cache/**\*"
# --- FIN DE CONFIGURACIÓN ---
TIMESTAMP=$(date +"%F")
BACKUP_DIR="/root/backup/$TIMESTAMP"
MYSQLDUMP=/usr/bin/mysqldump
mkdir -p "$BACKUP_DIR/mysql"
# Backup de todas las bases de datos (excepto sistema)
databases=$(mysql -e "SHOW DATABASES;" 2>/dev/null | grep -Ev "(Database|information_schema|performance_schema|mysql|sys)")
for db in $databases; do
$MYSQLDUMP --force --opt $db | gzip > "$BACKUP_DIR/mysql/$db.gz"
done
# Backup del código fuente
zip -r "$BACKUP_DIR/$WEBSITE_NAME.zip" "$SOURCE_DIR" -q -x "$CACHE_TO_EXCLUDE"
# Subir a Telegram
cd /root/code
python3 tele.py "$BACKUP_DIR"
size=$(du -sh "$BACKUP_DIR" | awk '{print $1}')
echo "Backup completado: $size en $BACKUP_DIR"Este script realiza primero el backup de MySQL y luego comprime el código fuente de la web, excluyendo directorios pesados como la caché. Para más información sobre cómo funciona la compresión, puedes consultar mi guía sobre cómo usar zip y tar.gz en Linux.
Haz que ambos scripts sean ejecutables:
chmod +x /root/code/*Consideraciones de Seguridad
Guardar credenciales en un script es funcional, pero no es la práctica más segura. En un entorno profesional, considera usar variables de entorno para almacenar tu api_id y api_hash, algo que explico en mi artículo sobre cómo establecer variables de entorno en Linux.
Paso 3: Automatizar la Tarea con Cron
Finalmente, automatizamos la tarea con cron. Si quieres dominar su sintaxis, mi guía completa de cron es un buen punto de partida.
Ejecuta crontab -e y añade la siguiente línea al final:
0 1 * * * /root/code/backup.sh > /dev/null 2>&1Guarda y sal. Esto ejecutará el script todos los días a la 1:00 AM. Puedes usar una herramienta como Crontab Guru para verificar o generar otras frecuencias.
Preguntas Frecuentes sobre el Backup en Telegram
¿Qué respalda exactamente el script?
Respalda dos cosas: una copia completa de todas tus bases de datos MySQL (excluyendo las de sistema) y un archivo .zip con todo el código fuente de tu sitio web (excluyendo la carpeta de caché).
¿Cómo cambio la frecuencia del backup?
Edita tu cronjob con crontab -e. Si quieres un backup cada 12 horas, por ejemplo, puedes cambiar la línea a 0 */12 * * *.
El script de Python falla con un error “database is locked”. ¿Qué hago?
Este error a veces ocurre con la librería. Simplemente borra el archivo de sesión (rm /root/code/user_session.session) y vuelve a ejecutar el script de prueba. Te pedirá el código de nuevo y creará una sesión limpia.
¿Cómo restauro una de estas copias de seguridad?
Descarga los archivos desde Telegram a tu servidor. Descomprime el código fuente con unzip nombre_del_sitio.zip. Para la base de datos, usa un comando como: gunzip < basededatos.gz | mysql -u TU_USUARIO -p NOMBRE_BBDD.
¡Listo! Con estos pasos, tendrás un sistema de copia de seguridad en Telegram diario, automático y seguro. Una solución simple, gratuita y muy eficaz.
Mateo TuxMaster
Amigos! Si buscan una alternativa, aquí también hay un script: https://github.com/azerothcore/telegram-automated-db-backup
El funcionamiento es el mismo 😉
Pingback: rm -rf linux: Qué Pasa Realmente y Cómo Protegerte