La tarea de copiar archivos entre servidores es algo muy común en los desarrollos, por ejemplo si estamos trabajando algún cambio específico en un entorno de desarrollo local y lo queremos pasar a un servidor de staging (demo visible para un cliente) deberíamos mover cada archivo a mano o incuso podríamos copiar toda la carpeta.
El problema con esto es que al ser un proceso manual puede ser que nos olvidemos de copiar algo, o incluso peor, que sobreescribamos un archivo y pisemos sus cambios.
Tabla de Contenidos
- ¿Porqué no usar Git?
- ¿Qué es rsync?
- Manos a la consola! ¿Cómo usar rsync?
- Sintaxis básica para sincronizar entre 2 directorios
- ¿Cómo excluir archivos en una transferencia con rsync?
¿Porqué no usar Git?
El camino más correcto sería usar Git, de eso no hay dudas. Pero me encontré en la situación de trabajar en servidores o repositorios con acceso restringido y tenía que pasar los cambios ASAP y no podía esperar a que me dieran los permisos necesarios.
Entonces encontré una solución intermedia entre el trabajo de copiado manual y Git, trabajar con rsync.
¿Qué es rsync?
rsync es una aplicación gratuita para sincronizar archivos y directorios de forma rápida entre 2 rutas distintas, pudiendo ser locales (2 carpetas en una misma máquina) o una local y un remota (el caso de nuestro ejemplo).
Debo recalcar que la sincronización se hace de una forma extremadamente rápida, ya que rsync los comprime antes de enviarlos y los descomprime al recibirlos.
La única “contra”, si es que se le puede llamar así, es que debemos usar la consola o terminal. Pero si trabajamos con desarrollos y aún no lo hacemos nos estamos perdiendo de un gran y maravilloso mundo. Y vamos que tampoco es tan complicado.
Algo también a destacar es que funciona de forma nativa en entornos Unix, es decir, en Linux y en Mac OS. Pero si usamos Windows también podemos usarla, lo explico en este otro post: https://blog.cesarmansilla.com.ar/utilizar-rsync-en-windows/
Manos a la consola! ¿Cómo usar rsync?
Verificar si lo tenemos instalado
Para ello ejecutar el siguiente comando, si nos muestra la versión significa que ya contamos con la herramienta, caso contrario deberemos instalarla.
rsync -v
Instalar rsync
Podemos hacerlo con los archivos descargados desde la web https://rsync.samba.org/download.html
O bien instalarlo desde consola, ejecutar una línea por vez, esperar a que termine una para ir a la siguiente.
Para Debian, Ubuntu, Linux Mint y derivados:
apt-get update && apt-get -y upgrade; apt-get -y install rsync;
Rhel, CentOS y derivados:
yum -y update; yum -y install rsync;
Sintaxis básica para sincronizar entre 2 directorios
rsync [OPCIONES] [RUTA_ORIGEN] [RUTA_DESTINO]
Sin complicarla, hay que reemplazar [OPCIONES] por algunos parámetros, les recomiendo que sea “-avz” sin comillas.
- a: para mantener usuarios y permisos
- v: para ver los resultados del proceso
- z: para comprimir la transferencia
Luego la [RUTA_ORIGEN] y [RUTA_DESTINO] dependerán de cada caso, pero les doy 2 ejemplos.
Sincronización entre 2 directorios locales
Esto va a copiar los archivos de una carpeta llamada “proyecto-web” a otra llamada “clon-proyecto-web“.
rsync -avz /Applications/XAMPP/htdocs/proyecto-web/ /Applications/XAMPP/htdocs/clon-de-proyecto-web/
Sincronización entre un directorio local y uno remoto
Esto va a copiar los archivos de una carpeta local llamada “proyecto-web” a un servidor remoto cuyo usuario SSH es “ssh_username” (nos lo deben dar o lo debemos generar nosotros), el host es 123.0.0.123 y la carpeta remota se encuentra en «/var/www/carpeta-proyecto-web-remoto/public_html/».
Parece complicado pero les prometo que no lo es ?
rsync -avz /Applications/XAMPP/htdocs/proyecto-web/ ssh_username@123.0.0.123:/var/www/carpeta-proyecto-web-remoto/public_html/
¿Cómo excluir archivos en una transferencia con rsync?
Una última cosa que es necesaria a veces. Si quisieramos excluir archivos o directorios del proceso, deberemos agregar una opción extra “–exclude [RUTA_A_EXCLUIR]“, veámoslo con un ejemplo.
Supongamos que vamos a sincronizar una instalación de WordPress y no queremos mover el archivo wp-config.php porque la info de conexión a base de datos es distinta y tampoco queremos mover la carpeta de uploads. Necesitamos excluir 2 cosas, la sintaxis sería:
rsync -avz --exclude wp-config.php --exclude wp-content/uploads/ /Applications/XAMPP/htdocs/proyecto-web/ ssh_username@123.0.0.123:/var/www/carpeta-proyecto-web-remoto/public_html/
A lo que vimos anteriormente agregué un comando –exclude por cada cosa que quiero excluir.
Nuevamente les reitero, no se abrumen porque parece mucho o complicado. Una vez que lo usen van a ver que es sencillo y súper útil.