rclone — backup de surface-wsl a Google Drive
Respaldo periódico de /home/esteban (todo el home de la sesión WSL en surface-wsl) hacia Google Drive, usando rclone y un cron cada 15 minutos. Complementa a IDrive — backup de vm-playground: mismo objetivo general (respaldo automatizado en la nube), pero surface-wsl usa rclone contra Drive en vez de IDrive, porque es la cuenta de Google (ehalsou@gmail.com) la que ya centraliza el resto del almacenamiento personal de Esteban.
Instalación
rclone v1.75.0 instalado con el script oficial (curl https://rclone.org/install.sh | sudo bash), que requiere unzip como dependencia previa. Queda en /usr/bin/rclone — ruta estándar que cron encuentra sin tocar el PATH del script.
Remote de Google Drive
Remote gdrive-backup:, tipo drive, creado con rclone config create gdrive-backup drive y autorizado por OAuth contra la cuenta personal de Google. El flujo interactivo estándar (rclone config) funciona sin nada especial en WSL2: rclone levanta un servidor local en 127.0.0.1:53682 y WSL2 reenvía ese puerto al localhost de Windows automáticamente, así que el link que imprime rclone se abre tal cual en el navegador de Windows.
Si el mismo flujo se necesitara en un WSL sin esa capa de reenvío (por ejemplo un WSL remoto/servidor sin GUI), la alternativa headless es correr rclone authorize "drive" en una máquina con navegador y pegar el bloque de token JSON que imprime en rclone config → Edit existing remote de la máquina sin navegador.
rclone avisa en cada operación que el client_id compartido que usa por default para Drive se retira durante 2026 (sin fecha exacta anunciada todavía). El reemplazo es crear un client ID propio tipo “Desktop app” en Google Cloud Console (APIs & Services → Credentials) — no existe forma de automatizar esa parte específica con gcloud CLI: ni gcloud iam oauth-clients create (Workforce Identity Federation) ni gcloud iap oauth-clients create (exclusivo de Identity-Aware Proxy, y de hecho en proceso de discontinuación) generan el tipo de credencial OAuth de consumidor que rclone necesita. Solo la pantalla de consentimiento OAuth y el client ID en sí requieren la consola web; el resto (crear proyecto, habilitar drive.googleapis.com) sí es scripteable si hace falta.
Backup set
Origen /home/esteban completo → destino gdrive-backup:Workstations/surface-ehas_backup (la carpeta Workstations no existía en el Drive antes del primer run; rclone copy la crea sola, junto con la subcarpeta, en la primera sincronización).
Exclusiones
~/rclone-excludes.txt, formato --filter-from de rclone (reglas evaluadas en orden, la primera que matchea gana — por eso las exclusiones van antes del + ** final que incluye todo lo demás):
- .config/rclone/**
- .cache/**
- .npm/**
- .npm-global/**
- .cargo/**
- .rustup/**
- .local/**
- go/**
+ **
Dos motivos distintos detrás de esta lista, no uno solo:
- Cachés y toolchains reinstalables (
.cache,.npm,.cargo,.rustup,.local,go) — entre las seis sumaban ~5 GiB y ~250,000 archivos de los ~6.5 GiB / ~254,000 archivos totales del home sin filtrar. Con el rate limit de la API de Drive, sincronizar esa cantidad de archivos pequeños hubiera tomado horas por poco beneficio real (nada ahí es irremplazable). .config/rclone/— ahí viverclone.conf, que contiene el refresh token con acceso completo a este mismo Drive. Subir ese archivo al backup significaría dejar la credencial que abre la cuenta dentro de la cuenta que protege — conflicto técnico, no cuestión de preferencia, así que esta exclusión no es opcional.
Deliberadamente sí se incluyen .ssh, .config/gcloud y .config/gh (llaves SSH y tokens de gcloud/GitHub CLI) — a diferencia de rclone.conf, ahí no hay conflicto técnico, y la decisión (consultada explícitamente) fue priorizar tener esas credenciales recuperables desde Drive sobre el riesgo de que queden en texto plano ahí.
Para agregar una exclusión nueva (por ejemplo, algo que se borró a mano en Drive y no debe volver a subirse en el siguiente run): editar ~/rclone-excludes.txt y agregar una línea - patrón/** antes del + ** final. No hace falta reiniciar nada — el próximo disparo de cron (máximo 15 min después) ya la respeta.
Script y programación
~/rclone-backup.sh (ejecutable) corre:
rclone copy /home/esteban gdrive-backup:Workstations/surface-ehas_backup --update \
--filter-from ~/rclone-excludes.txt \
--log-file ~/rclone-backup.log --log-level INFOenvuelto en un flock no bloqueante sobre /tmp/rclone-backup.lock: si una corrida anterior sigue viva cuando cron dispara la siguiente (esperable en el primer sync completo, que puede tardar más de 15 minutos), la nueva corrida se aborta de inmediato en vez de lanzar un segundo rclone copy en paralelo contra el mismo destino.
Cron: */15 * * * * /home/esteban/rclone-backup.sh (crontab -e).
Persistencia de cron en WSL
surface-wsl tiene systemd habilitado (systemd=true en /etc/wsl.conf), así que cron.service arranca solo junto con el resto del sistema al iniciar la distro — no depende de que se abra una terminal, y sobrevive a cerrar todas las ventanas de WSL mientras la distro siga corriendo en segundo plano. Si algún día se corre esto en un WSL sin systemd habilitado, cron no arranca solo y hay que forzarlo desde ~/.bashrc (sudo service cron status >/dev/null || sudo service cron start) cada vez que se abre una terminal — no es el caso actual.
Revisar el log
tail -f ~/rclone-backup.log # seguir en vivo
grep ERROR ~/rclone-backup.log # solo errores
grep "Copied (new)" ~/rclone-backup.log | wc -l # archivos subidos en la corrida más recienteGotcha: rclone-backup.log se respalda a sí mismo
El log vive dentro de /home/esteban, la misma raíz que se respalda, así que cada corrida intenta subir su propio log mientras sigue escribiéndolo. Es normal ver un ERROR: rclone-backup.log: ... source file is being updated (size changed from X to Y) ocasional al final de una corrida — no es un fallo real, se resuelve solo en la siguiente corrida una vez que el archivo deja de cambiar de tamaño a mitad de la subida.
Véase también
- IDrive — backup de vm-playground — mismo propósito (backup automatizado en la nube) en otro host, con otra herramienta; comparten el patrón de excluir cachés/toolchains reinstalables antes de respaldar