741 - No Pierdas tus Fotos de Immich. El Método de Seguridad DEFINITIVO
Asegura tus fotos de Immich con Docker. Aprende el método DEFINITIVO para la seguridad de datos usando mi herramienta rubadb. ¡No pierdas tus recuerdos!
Como comenté en episodios anteriores, uno de los objetivos para este año era montar mi propio servidor de fotografías, algo que hasta el momento no he querido hacer por las implicaciones que tiene. Sin embargo, el proyecto de Immich está realmente muy maduro, y es una excelente oportunidad para hacerlo. Pero por supuesto, algo que me preocupaba, como a cualquiera de nosotros que monte su propio servicio de fotografías es la posibilidad de perder todas esas fotografías, todos esos recuerdos. Así que antes de lanzarme a meter todos mis recuerdos en Immich, he querido asegurar toda esa información, para lo que he estado probando un par de servicios con los que realizar esas copias de seguridad de Immich de forma automática y segura. Y esto es precisamente de lo que te voy a hablar en este episodio.

No Pierdas tus Fotos de Immich. El Método de Seguridad DEFINITIVO
Un poquito de contexto
Hace unos días escuché a Alberto, del podcast PapaFriki que había tenido problemas con Immich, a la hora de recuperar una copia de seguridad. Y es que, aunque Immich es un proyecto realmente maduro, y que funciona realmente bien, no deja de ser un proyecto joven, y como tal, puede tener sus fallos.
Actualmente tengo varias bases de datos Postgresql de las que hago copias de seguridad de forma automática, y que en caso de desastre, puedo recuperar sin problemas. Se trata de un servicio que te contaré mas adelante que es de producción propia, rubadb.
Sin embargo, conforme contaba Alberto sus peripecias con Immich caí en que el problema no reside en hacer la copia de seguridad, sino en la recuperación de la misma. El proceso que implementé no es visible para el ojo humano, y esto siempre da mucho miedo. No sabemos si se está haciendo, si no se está haciendo, pero además no sabemos si podremos recuperarlo. Así que, si bien, me gusta, siempre me queda el ahí.
Así que el otro día, cuando descubrí Postgresus, me gustói mucho la idea de tener una herramienta que me permita hacer copias de seguridad de las bases de datos Postgresql de forma sencilla y rápida, y sobre todo, que me permita recuperar esas copias de seguridad de forma sencilla y rápida.
Inicialmente no caí en Immich, para aplicar este servicio, lo puse en Shuul, esta herramienta que he implementado para reducir las visitas indesaeadas a mis servidores, y que utiliza una base de datos Postgresql para almacenar la información. Pero rápidamente me di cuenta de que Immich también utiliza Postgresql, así que no tardé en implementarlo allí.
Instalando Immich
La cosa es que caí en la utilizar Posgtresus para hacer las copias de seguridad de Immich justo en el proceso de instalación de Immich. Cuando estas en la guía de instalación, directamente te hablan de la estrategia 3-2-1 para hacer copias de seguridad… Y claro, blanco y en botella, fue justo en ese momento cuando caí en que podía utilizar Postgresus para hacer las copias de seguridad de Immich. Pero sobre todo, para tener una visión clara de que es lo que se está haciendo y como se está haciendo.
rubadb
Sobre rubadb te hablé en el episodio 695, y es un servicio que tengo en producción desde hace varios meses, y que me permite hacer copias de seguridad de las bases de datos Postgresql de forma automática y segura. El servicio es realmente sencillo, utiliza rustic y cron, para hacer las copias de seguridad, no solo de la base de datos sino también puedes configurar aquellos directorios sobre los que quieres hacer copia de seguridad.
En este caso con rustic, puedes configurar tantos backends como quieras, y en mi caso, tengo configurados dos, uno local, y otro remoto, en un servidor que tengo en otro lugar. De esta forma, cumplo con la estrategia 3-2-1, ya que tengo dos copias de seguridad, una local y otra remota.
Y si, rubadb está muy bien, pero tiene un problema grave, desde mi punto de vista, y es que tienes que recurrir a la terminal para realizar la configuración, y por otro lado, es que se trata de un proceso totalmente oscuro, no sabes si se está haciendo, no sabes si no se está haciendo, y sobre todo, no sabes si podrás recuperar la copia de seguridad cuando la necesites. Y, por otro lado, la recuperación no es nada sencilla.
Postgresus
Postgresus es un a herramienta Open Source pensada para el mundo del self-hosting, con la que realizar tus copias de seguridad de Posgtrsql de forma sencilla, pero sobre todo gráfica. Te permite hacer copias de seguridad en diferentes almacenamiento y además con notificaciones.
- Copias de Seguridad Programadas (Scheduled backups). Permite definir la frecuencia de las copias de seguridad con total flexibilidad, desde intervalos cada hora hasta mensuales. Esto es crucial para ajustar los dumps a momentos de bajo tráfico en tu base de datos y evitar picos de carga.
- Autoalojado a través de Docker (Self hosted via Docker). El servicio se ejecuta en tu propio servidor (PC o VPS), lo que garantiza que toda tu información es de tu propiedad y está segura. El despliegue es notablemente rápido, tardando unos dos minutos en estar operativo.
- Múltiples Destinos de Almacenamiento (Many destinations to store). No te limita al almacenamiento local. Puedes guardar los archivos de backup en tu VPS, así como en varios servicios en la nube como S3, Google Drive, Dropbox y NAS, facilitando el cumplimiento de estrategias de seguridad como la Regla 3-2-1.
- Notificaciones de Estado (Notifications). Recibirás alertas sobre el estado del proceso de backup. El sistema te notifica cuando el proceso ha sido un éxito o ha fallado, permitiendo una reacción inmediata ante cualquier incidente (ideal para la monitorización).
- Comprobaciones de Salud Configurables (Configurable health checks). El sistema realiza pings periódicos a la base de datos para verificar su disponibilidad. Si la base de datos no responde (por ejemplo, después de 3 intentos fallidos), se considera inactiva y te lo notifica. También te avisa cuando vuelve a estar en línea.
- Amplio Soporte de Versiones de PostgreSQL (Many PostgreSQL versions). Soporta un amplio rango de versiones de PostgreSQL, incluyendo 13, 14, 15, 16, 17 y 18. Esto asegura la compatibilidad con casi cualquier instancia moderna que puedas tener.
- Código Abierto y Gratuito (Open source and free). El proyecto es completamente Open Source bajo la licencia MIT. Esto te da la libertad de auditar, modificar y bifurcar (fork) el código si necesitas una personalización avanzada.
El compose de immich
El compose.yml de Immich es el siguiente,
name: immich
services:
immich-server:
container_name: immich_server
image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
restart: unless-stopped
init: true
environment:
DB_HOSTNAME: immich_db
DB_PASSWORD: ${DB_PASSWORD}
DB_USERNAME: ${DB_USERNAME}
DB_DATABASE_NAME: ${DB_DATABASE_NAME}
volumes:
- library:/data
- /etc/localtime:/etc/localtime:ro
depends_on:
redis:
condition: service_healthy
restart: true
immich_db:
condition: service_healthy
restart: true
healthcheck:
disable: false
networks:
- proxy
- internal
labels:
traefik.enable: true
traefik.http.routers.immich.rule: Host(`fotos.tuservidor.es`)
traefik.http.routers.immich.entrypoints: https
traefik.http.services.immich.loadbalancer.server.port: 2283
immich-machine-learning:
container_name: immich_machine_learning
image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
restart: unless-stopped
init: true
environment:
DB_HOSTNAME: immich_db
DB_PASSWORD: ${DB_PASSWORD}
DB_USERNAME: ${DB_USERNAME}
DB_DATABASE_NAME: ${DB_DATABASE_NAME}
volumes:
- model-cache:/cache
networks:
- internal
healthcheck:
disable: false
redis:
container_name: immich_redis
image: docker.io/valkey/valkey:8@sha256:81db6d39e1bba3b3ff32bd3a1b19a6d69690f94a3954ec131277b9a26b95b3aa
restart: unless-stopped
init: true
healthcheck:
test: redis-cli ping || exit 1
networks:
- internal
- shuul
immich_db:
container_name: immich_db
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:bcf63357191b76a916ae5eb93464d65c07511da41e3bf7a8416db519b40b1c23
restart: unless-stopped
init: true
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_DB: ${DB_DATABASE_NAME}
POSTGRES_INITDB_ARGS: --data-checksums
PG_USER: ${DB_USERNAME}
healthcheck:
test: pg_isready --dbname='${DB_DATABASE_NAME}' --username='${DB_USERNAME}' ||
exit 1
start_period: 30s
start_interval: 10s
interval: 30s
timeout: 5s
retries: 3
volumes:
- pgdata:/var/lib/postgresql/data
shm_size: 128mb
networks:
- internal
- shuul
volumes:
model-cache: {}
library: {}
pgdata: {}
networks:
internal: {}
proxy:
external: true
shuul:
external: true
x-dockge:
urls:
- https://fotos.tuservidor.es
Mientras que el compose.yml de Postgresus es el siguiente,
postgresus:
container_name: postgresus
image: rostislavdugin/postgresus:latest
restart: unless-stopped
init: true
volumes:
- postgresus-data:/postgresus-data
networks:
- shuul
- proxy
labels:
traefik.enable: true
traefik.http.routers.postgresus.rule: Host(`postgresus.tuservidor.es`)
traefik.http.routers.postgresus.entrypoints: https
traefik.http.services.postgresus.loadbalancer.server.port: 4005
Más información,