Adrianistán

Sustituyendo Google Photos por mi propia solución local

28/05/2023

Uno de los productos de Google que más he usado ha sido Google Photos. Se trata de un servicio donde podemos subir imágenes y vídeos personales, que se sincroniza con nuestro dispositivo. No obstante, cada vez intento depender menos de servicios de Google y encima, con Photos, me estoy quedando sin espacio. Así que vamos a construir una alternativa.

Syncthing

Una de las aplicaciones más populares para sincronizar entre ordenadores es Syncthing. Se trata de un programa opensource con numerosas aplicaciones (Windows, Linux CLI, Android, MacOS, ...) que permite configurar sincronizar los archivos sin tener que hacer demasiadas configuraciones avanzadas de red. Es capaz de sincronizar archivos incluso entre dispositivos dentro de una NAT, a través de su sistema P2P.

Primero instalamos Syncthing en el ordenador (en mi caso, Arch Linux) y lo activamos


$ pacman -S syncthing
$ systemctl start syncthing@aarroyoc
$ systemctl enable syncthing@aarroyoc

Esto nos va a levantar Syncthing en nuestro sistema de forma permanente y la interfaz web de Syncthing, necesaria para configurarlo. Podemos acceder a ella desde nuestro navegador: http://127.0.0.1:8384.

Vemos tres secciones. En la primera tenemos un listado de carpetas que se van a sincronizar. Vamos a agregar una carpeta para las imágenes de la cámara de mi teléfono Android. La meteré dentro de Imágenes. Recordamos el ID que hemos metido.

En el apartado Avanzado podemos ajustar algunos detalles interesantes. Yo lo voy a dejar todo por defecto salvo el Tipo de Carpeta que en este dispositivo lo voy a poner a "Solo Recibir".

Vamos ahora al dispositivo Android, nos descargamos la aplicación de Syncthing disponible tanto en Google Play como en F-Droid. Veremos algo similar a esto:

En la app web, vamos al lado derecho "Este dispositivo" y hacemos click sobre el pequeño código para mostrar el código entero y un QR. Desde la app de Android lo escaneamos. En la app web se nos pedirá confirmación y ya tenemos enlazados los dispositivos.

En la app de Android creamos la carpeta seleccionando la ubicación de la carpeta de nuestra cámara. En tipo de carpeta dejamos "Solo enviar". Lo más importante es que el ID sea el mismo que el de la carpeta en nuestro otro dispositivo, en este caso puse android-camera

Una vez hecho esto deberemos aprobar el cambio en la app web. Una vez aprobado, ¡empezará el proceso de sincronización!

Ahora podríamos usar Syncthing para otras cosas pero como el objetivo era solo Google Photos. Ahí lo tenemos.

Ahora vamos a añadir un sistema de copia de seguridad en un disco duro externo.

Preparar el disco con Btrfs

Preparando el disco duro

El disco duro ya lo usaba para copias de seguridad, así que tenía datos. Usaba el sistema de archivos XFS. Para este nuevo uso, quería experimentar con Btrfs, así que tocaba formatear.

Lo primero, para saber si nuestro kernel Linux soporta Btrfs es ejecutar


$ cat /proc/filesystems

Y ver si aparece btrfs en el listado.

Lo segundo fue hacer una copia de los datos que ya tenía en el disco. Como sí que tenía espacio, hice una copia con rsync de los datos del HDD a otro disco.


$ rsync -ah --progress /run/media/aarroyoc/Almacen Almacen

Esto conserva todos los permisos y muestra una barra de progreso durante la copia

Ahora desmontamos el HDD. Vamos además a ejecutar fdisk para asegurarnos que el nombre del disco que vamos a formatear es el correcto. Un error aquí podría ser terrible.


$ umount /run/media/aarroyoc/Almacen
$ lsblk -p
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
/dev/sda      8:0    0 931,5G  0 disk 
├─/dev/sda1   8:1    0   260M  0 part /boot
├─/dev/sda2   8:2    0    16M  0 part 
├─/dev/sda3   8:3    0 139,7G  0 part 
├─/dev/sda4   8:4    0    25G  0 part 
├─/dev/sda5   8:5    0  1000M  0 part 
└─/dev/sda6   8:6    0 765,6G  0 part /
/dev/sdb      8:16   0   3,6T  0 disk 
└─/dev/sdb1   8:17   0   3,6T  0 part 
/dev/sr0     11:0    1  1024M  0 rom  
$ fdisk -l /dev/sdb
Disco /dev/sdb: 3,64 TiB, 4000752599040 bytes, 7813969920 sectores
Modelo de disco: Elements 25A1   
Unidades: sectores de 1 * 512 = 512 bytes
Tamaño de sector (lógico/físico): 512 bytes / 4096 bytes
Tamaño de E/S (mínimo/óptimo): 4096 bytes / 4096 bytes
Tipo de etiqueta de disco: gpt
Identificador del disco: 964D5ABA-35C4-495F-94EC-26699CB99391

Disposit.  Comienzo      Final   Sectores Tamaño Tipo
/dev/sdb1      2048 7813967871 7813965824   3,6T Sistema de ficheros de Linux

Finalmente ejecutamos el comando que creará la partición.


$ mkfs.btrfs -f -L Almacen /dev/sdb1

Por defecto en Btrfs va a usar un tamaño de nodo para metadatos de 16K. Valores pequeños aumentan la fragmentación del disco pero las operaciones son más baratas en uso de memoria. Valores altos, propiedades inversas. También vamos a tener Copy-On-Write y checksums. En principio, no lo vamos a desactivar.

Otra opción muy interesante de Btrfs es la compresión automática. Btrfs soporta varios algoritmos: LZO, ZLIB y ZSTD. En Btrfs esta compresión no aplica al disco entero, sino que se puede ir configurando a demanda. Para ello, cada vez que montemos un disco con mount, podemos especificar con que algoritmo de compresión queremos que trabajen las escrituras nuevas.


$ mount -o compress=zstd /dev/sdb1 /mnt/

Si ya teníamos datos, podemos aplicar una recompresión durante la desfragmentación.


$ btrfs filesystem defragment -r -v -czstd /mnt/

Sí, Btrs puede requerir desfragmentar, aunque existen opciones para que se vaya haciendo automáticamente. Si queremos forzarlo, sin tener en cuenta la compresión:


$ btrfs filesystem defragment -r /mnt/

Otras características de Btrfs son los sistemas para encontrar errores (scrub), el soporte RAID (en este caso no aplica) y los snapshots y subvolúmenes. Muy interesante y os recomiendo leer sobre ello.

Finalmente volvemos a copiar de vuelta los datos:


$ cd Almacen
$ rsync -ah --progress * /mnt/

Backups con Borg

Ahora vamos a hacer backups sobre nuestras fotos usando Borg. Los backups creados usando Borg están encriptados y son eficientes, ya que van comprimidos y se deduplicacan de forma inteligente. Voy a hacer un backup de toda la carpeta Imágenes, para hacer backup no solo de las imágenes del teléfono sino de otras.

Borg se encuentra en los repos de la mayoría de distros Linux. En Arch Linux es tan sencillo como:


$ pacman -S borg

Una vez lo tengamos instalado, lo primero será crear un repo de backups en el disco duro externo. Lo voy a ubicar en "/mnt/imagenes" y tendrá una contraseña.


$ borg init --encryption=repokey /mnt/imagenes

Ya podemos crear el backup de toda la carpeta Imágenes del sistema (que recordemos, incluye la carpeta Android Camera que tiene las que sacamos del teléfono)


$ borg create --stats --progress /mnt/imagenes::backup-2023-05-28 ~/Imágenes

El comando nos mostrará al acabar unas estadísticas del backup. La primera vez que hagamos un backup tardará bastante, las siguientes ocasiones, el sistema será inteligente y solo añadirá los cambios respecto a backups anteriores, siendo mucho más rápido.

En cualquier momento podemos listar los backups guardados con borg list.


$ borg list /mnt/imagenes

Podríamos usar extract para extraer el contenido de un backup entero, o de un fichero únicamente. Con delete podemos eliminar backups que ya no queramos. Y con compact podemos optimizar el espacio que usan los backups.

Conclusión

Con todo esto ya tenemos nuestro sustituto a Google Photos, controlado al 100% por nosotros, sin depender de Google. Espero que este post os haya servido de utilidad. ¡Hasta la próxima!

Tags: programacion borg syncthing linux tutorial photos