Sincronización de la carpeta files en instalaciones Drupal usando rsync

Si bien Git soluciona con creces el control de versiones de todos los archivos php en el proceso de desarrollo siempre ha sido un tema pendiente y -un dolor de cabeza- la actualización de la carpeta 'files', la carpeta que contiene todos los archivos que se van almacenando.

La solución normalmente es comprimir esta carpeta cada cierto tiempo y hacerla disponible para su descarga de modo que el desarrollador tenga que descargarla cada vez que la necesite. Generalmente se hace para actualizar el servidor de desarrollo (development server) y el servidor de pre-producción (stage server) con los archivos que el usuario va publicando el servidor de producción (production server). Debido a su tamaño (pueden ser muchos GBs) muchas veces el desarrollador evita descargarlo y usa otros módulos para "reemplazar" aquellos archivos que condicionen la implementación de las plantillas (theming). Tal es el caso del módulo http://drupal.org/project/dummyimage que se usa para "reemplazar" imágenes por ejemplo.

Frente a este problema podemos usar una vez más la potencia de los comandos de Linux, en especial del comando rsync.
La idea es usarlo para sincronizar la carpeta 'files' del servidor de producción con el servidor de desarrollo de acuerdo al esquema siguiente

rsync [--param] SOURCE -> DEST

donde

SOURCE = la carpeta 'files' en el servidor de producción
DEST = la carpeta 'files' en el servidor de desarrollo (tu localhost)
[--param] = son los parámetros que se usan con rsync

La primera recomendación es cambiar la fecha de todos los archivos de su carpeta local a una fecha más reciente que la fecha que tienen los mismos archivos en el servidor remoto. Así rsync sólo comparará SOLO tamaños y pasará por alto aquellos que tienen la fecha más reciente (en el servidor local) que sus pares en el servidor remoto.

Se puede usar el siguiente comando para lograrlo:

find . -exec touch -am {} \;
user@linux:/var/www/myweb/sites/default/files$ find . -exec touch -a -d '25 Apr 2012 12:34' {} \;

No olviden que deben poner la fecha y hora actual y aplicarlo SOLO sobre los contenidos de la carpeta 'files'. Tambien pueden usar

user@linux:find . -exec touch -am {} \;

Después lo que tenemos que hacer es aplicar el comando rsync. Por ejemplo, para un esquema como

Servidor remoto = remote_user@myweb.com:/home/remote_user/www/
Servidor local = /var/www/myweb/

El comando rsync será

user@linux:/var/www/myweb$ rsync -arvuz --size-only --progress --log-file=FILE.txt remote_user@myweb.com:/home/remote_user/www/sites/default/files/ /var/www/myweb/sites/default/files/

Sin embargo, es recomendable ejecutar antes el comando rsync en modo DRY RUN (modo de pruebas), es decir sin aplicar cambios, sólo para saber que archivos sobreescribiría si lo ejecutáramos. Para este caso, se agrega el parámetro -n de la siguiente forma

user@linux:/var/www/myweb$ rsync -arvuzn --size-only --progress --log-file=FILE.txt remote_user@myweb.com:/home/remote_user/www/sites/default/files/ /var/www/myweb/sites/default/files/

Eso es todo, chequean si los cambios que hará están bien y si está bien entonces vuelven a ejecutar el comando sin el parámetro -n, con eso tendrán actualizado su carpeta 'files' cada vez que lo deseen porque rsync sólo descargará los archivos que se hayan agregado desde la última vez ó que no existan en su carpeta local 'files'.

Debajo coloco algunas variantes al uso de rsync para otros casos:

a) La conexión ssh usa un puerto diferente al puerto 22

rsync -arvuz --size-only --progress --rsh='ssh -p3456' user@172.34.345.45:/home/remote_user/www/myweb/sites/default/files/ /var/www/myweb/sites/default/files/

b) No me interesa descargar archivos pdf, ni css, ni js

rsync -arvuz --size-only --progress --exclude '*.pdf' --exclude '*.js' --exclude '*.css' remote_user@myweb.com:/home/remote_user/www/sites/default/files/ /var/www/myweb/sites/default/files/

c) Actualizando los archivos borrados en el servidor remoto en el servidor local

rsync -arvuzn --size-only --progress --delete remote_user@myweb.com:/home/remote_user/www/sites/default/files/ /var/www/myweb/sites/default/files/

d) Estoy ejecutando el rsync en modo de prueba pero la lista de salida es muy larga y no me deja ver el inicio de los cambios

rsync -arvuzn --size-only --progress remote_user@myweb.com:/home/remote_user/www/sites/default/files/ /var/www/myweb/sites/default/files/ 2>&1 | more

Referencias

http://notemagnet.blogspot.com/2009/10/getting-started-with-rsync-for-p…
http://lists.samba.org/archive/rsync/2007-April/017616.html
http://www.linuxask.com/questions/how-to-change-files-modification-acce…
http://www.thegeekstuff.com/2011/01/rsync-exclude-files-and-folders/
http://danubuntu.wordpress.com/2007/10/27/copia-de-archivos-con-rsync/

Actualización
También es posible contar los archivos que tienes en tu carpeta local y en tu carpeta remota usando el comando siguiente, así sabrás cuantos archivos adicionales tendrás que descargar

find . -type f | wc -l

Etiquetas