Sincronizar Nextcloud y un servidor de archivos automáticamente con rclone bisync
Si usas un Nextcloud alojado y además tienes un servidor de archivos en tu red local, conoces el problema: los portátiles se sincronizan rápido con el servidor de archivos, pero la sincronización con Nextcloud tarda mucho y se olvida con facilidad cuando hay que lanzarla a mano. nc-bisync.sh automatiza justo este paso con rclone bisync. Se ejecuta sin supervisión mediante cron y solo da la alarma cuando algo no cuadra.
Descarga: nc-bisync.sh (los comentarios y mensajes del script están en alemán)
El punto de partida
El servidor de archivos es el centro entre todos los dispositivos:
Portátiles ⇄ (Unison, manual) ⇄ Servidor de archivos ⇄ (rclone bisync, automático) ⇄ Nextcloud
│
└─ rsnapshot (diario, versionado) → disco externo
Los portátiles siguen con Unison. En la red local es rápido, y su interfaz gráfica ayuda con los conflictos. Para el tramo lento hacia Nextcloud se encarga rclone bisync. rclone habla WebDAV directamente y no necesita un montaje davfs. Además trae mecanismos de protección que, de otro modo, exigirían un script envoltorio propio.
Qué hace el script
Un par de directorios por carpeta compartida. Cada carpeta compartida del servidor de archivos se sincroniza con la carpeta del mismo nombre en Nextcloud, de forma independiente de las demás. Los pares pueden lanzarse por separado o en grupos, incluso con frecuencias distintas. Si hace falta, una subcarpeta concreta, por ejemplo un proyecto grande, pasa a ser un par propio y se excluye automáticamente del par superior.
Archivo solo cuando se pide. Una subcarpeta archiv dentro de un par nunca se sincroniza en una ejecución normal, solo con --archiv. Internamente es un par aparte con su propio estado. Eso es más estable que una carpeta que un filtro incluye unas veces y excluye otras.
Protección contra daños masivos. Tres mecanismos integrados protegen contra daños mayores:
--check-access: En cada raíz hay un archivoRCLONE_TEST. Si falta en un lado, porque una ruta es incorrecta o una unidad no está montada, la ejecución se interrumpe. Esto también evita que un bind mount vacío se transmita a Nextcloud como «todo borrado».--max-delete 10: Si se fuera a borrar más del 10 % de los archivos, no pasa nada.--backup-dir1: Los archivos sobrescritos o borrados en el servidor de archivos van a una carpeta diaria y se eliminan a los 30 días.
Conflictos. Si un archivo se modificó en ambos lados, gana la versión más reciente (--conflict-resolve newer). La más antigua se conserva con otro nombre.
Robustez. Con --resilient y --recover, bisync suele superar ejecuciones interrumpidas sin un --resync manual. Un archivo de bloqueo evita ejecuciones solapadas.
Notificaciones. Si hay errores llega un mensaje por correo o a través de ntfy. El script distingue si hace falta un resync, si se alcanzó el límite de borrado o si falló la comprobación de acceso. Cada ejecución queda registrada con su duración en summary.log.
Filtros. Los archivos temporales de Unison, Office, macOS y Windows nunca se sincronizan.
Instalación
El script no se ejecuta como root, sino como el usuario propietario de los archivos en el servidor de archivos. De lo contrario, los archivos traídos de Nextcloud pertenecerían a root y los demás usuarios de la carpeta compartida ya no podrían modificarlos. sudo solo hace falta para la instalación.
1. Instalar rclone
El script necesita rclone 1.66 o posterior. Muchas distribuciones traen paquetes más antiguos, así que es mejor usar el script de instalación oficial:
curl https://rclone.org/install.sh | sudo bash
rclone version
2. Configurar el remoto de Nextcloud
En Nextcloud, crea una contraseña de aplicación en Configuración → Seguridad. Después configura el remoto como el usuario con el que se ejecutará el script (sin sudo):
rclone config
# n) New remote
# name> nc
# Storage> webdav
# url> https://cloud.example.com/remote.php/dav/files/USUARIO/
# vendor> nextcloud
# user> USUARIO
# pass> (contraseña de aplicación)
Para probar:
rclone lsd nc:
3. Instalar y adaptar el script
sudo install -m 755 nc-bisync.sh /usr/local/bin/nc-bisync.sh
sudo install -d -o USUARIO /var/lib/nc-bisync /var/log/nc-bisync
sudo install -d -o USUARIO -m 700 /mnt/USB-Crucial/.bisync-backup
El modo 755 hace que todos los usuarios puedan ejecutar el script, pero solo root puede modificarlo. La segunda línea crea los directorios de estado y de registros y se los asigna al usuario con el que se ejecuta el script. La tercera crea el directorio de copias (BACKUP_ROOT); modo 700, porque allí van a parar los archivos sobrescritos de todas las carpetas compartidas y solo debe verlos el usuario del script.
En el bloque de configuración del principio introduces los pares, uno por línea con nombre, ruta local y ruta en Nextcloud:
PAIRS=(
"administration|/mnt/shares/administration|nc:Administration"
"bibliothek|/mnt/shares/bibliothek|nc:Bibliothek"
"dokumente|/mnt/shares/dokumente|nc:Dokumente"
"fotos|/mnt/shares/fotos|nc:Fotos"
"projekte|/mnt/shares/projekte|nc:Projekte"
"unternehmen|/mnt/shares/unternehmen|nc:Unternehmen"
)
Otros ajustes:
| Variable | Significado | Ejemplo |
|---|---|---|
ARCHIVE_SUBDIR |
Subcarpeta que solo se sincroniza con --archiv |
archiv |
BACKUP_ROOT |
Depósito de archivos sobrescritos | /mnt/USB-Crucial/.bisync-backup |
MAX_DELETE |
Límite de borrado en porcentaje | 10 |
NOTIFY_MAIL |
Destinatario de los avisos de error (opcional) | admin@example.com |
NTFY_URL |
Tema de ntfy para notificaciones push (opcional) | https://ntfy.sh/mi-tema |
Asegúrate de que BACKUP_ROOT queda fuera de todos los pares. Con nc-bisync.sh --list compruebas qué pares están configurados y cuáles tienen una subcarpeta de archivo.
4. Permisos de grupo en el servidor de archivos
El script crea los archivos nuevos con umask 002 para que el grupo pueda seguir modificándolos. Para que además reciban el grupo correcto y no el grupo principal del usuario, los directorios sincronizados deberían tener el bit setgid. El bit setgid en un directorio hace que los archivos y subcarpetas creados en él hereden automáticamente su grupo, en lugar de recibir el grupo principal de quien los crea.
Para los pares del ejemplo anterior, lo activas así en todos los directorios existentes:
for d in administration bibliothek dokumente fotos projekte unternehmen; do
sudo find "/mnt/shares/$d" -type d -exec chmod g+s {} +
done
Se reconoce que está activado por una s en los permisos de grupo:
$ ls -ld /mnt/shares/dokumente
drwxrws--- 10 stefan familie 4,0K 21. Jul 13:19 /mnt/shares/dokumente
5. Ajustar Unison en los portátiles
bisync detecta los cambios por fecha de modificación y tamaño. Para que una ejecución de Unison desde un portátil no haga parecer modificados todos los archivos, añade a cada perfil de Unison:
times = true
6. Sincronización inicial
Prueba primero con --dry-run y después lanza la sincronización inicial:
nc-bisync.sh --init --dry-run
nc-bisync.sh --init
--init crea los archivos RCLONE_TEST en cada par y en cada subcarpeta de archivo existente y lo sincroniza todo con --resync. Donde haya diferencias, gana el archivo más reciente. Con muchos datos conviene configurar los pares de uno en uno, por ejemplo nc-bisync.sh --init fotos.
En la prueba el script no cambia nada: tampoco crea los archivos RCLONE_TEST y por eso omite la comprobación de acceso.
7. Programación
Añade las tareas con crontab -e al crontab del usuario con el que se ejecuta el script. Como cada par tiene su propio bloqueo, las carpetas que cambian a menudo pueden sincronizarse con más frecuencia que las que cambian poco:
# cambia a menudo: cada 2 horas
0 */2 * * * /usr/local/bin/nc-bisync.sh dokumente fotos projekte unternehmen administration
# cambia poco: por la noche
30 2 * * * /usr/local/bin/nc-bisync.sh bibliothek
Con muchos archivos, lo que frena no es la transferencia sino el listado por WebDAV, y eso se hace completo en cada ejecución. Por eso empieza con dos horas y consulta las duraciones al cabo de unos días:
tail /var/log/nc-bisync/summary.log
Como regla general, el intervalo debería ser unas tres veces más largo que una ejecución. No sincronices con demasiada frecuencia, porque algunos proveedores limitan las peticiones WebDAV numerosas.
Uso diario
| Comando | Cuándo |
|---|---|
nc-bisync.sh |
sincronizar todos los pares, sin archivo |
nc-bisync.sh fotos dokumente |
sincronizar solo los pares indicados |
nc-bisync.sh --archiv projekte |
después de archivar archivos en projekte |
nc-bisync.sh --dry-run fotos |
ver antes qué pasaría |
nc-bisync.sh --archiv --force projekte |
cuando al archivar se alcanzó el límite de borrado |
nc-bisync.sh --list |
mostrar los pares configurados |
Las opciones de rclone que llevan un valor se indican siempre como --opcion=valor; si no, el script toma el valor por el nombre de un par.
Archivar archivos
Mueve los archivos dentro de la carpeta compartida a la subcarpeta archiv y lanza después la sincronización de esa carpeta:
nc-bisync.sh --archiv projekte
El script sincroniza primero el archivo y solo después el resto de la carpeta. Así los archivos ya están en el archivo de Nextcloud antes de desaparecer allí del resto de la carpeta. Si falla la sincronización del archivo, el resto de la carpeta no se toca.
Si mueves muchísimos archivos a la vez, puede saltar el límite de borrado. En ese caso revisa brevemente el registro y vuelve a lanzar con --force.
Para añadir un archivo más adelante, crea la carpeta archiv en local y ejecuta una vez nc-bisync.sh --init NOMBRE.
Subcarpetas concretas como par propio
Si una carpeta compartida crece demasiado para ejecuciones frecuentes, una subcarpeta puede tener su propio par:
"tango|/mnt/shares/projekte/Tango|nc:Projekte/Tango"
El script excluye entonces Tango automáticamente del par projekte. Como así cambia su filtro, hace falta ejecutar una vez nc-bisync.sh --init projekte tango. La subcarpeta tiene que estar en el lugar correspondiente de Nextcloud; si no, el script se detiene con un aviso.
Cuando llega una notificación
- Hace falta un resync: Consulta la causa en el registro indicado. Después,
nc-bisync.sh --init NOMBREsuele arreglar el estado, mejor primero con--dry-run. - Demasiados borrados: Comprueba si los borrados son intencionados. Si es así, lanza con
--force. - Falló la comprobación de acceso: Falta un archivo
RCLONE_TEST. Comprueba que la ruta es correcta, que Nextcloud está accesible y que la unidad está montada.
Límites
rclone bisync no es una copia de seguridad. La sincronización también transmite cambios accidentales; solo se interceptan los borrados masivos. Si, por ejemplo, un ransomware cifra archivos en un portátil, llegan a Nextcloud a través de Unison y bisync, porque se sobrescriben, no se borran. La verdadera protección la dan las copias versionadas de rsnapshot y las versiones de archivos de Nextcloud. El periodo de conservación debería ser más largo que el tiempo que se tarda en notar un daño.