741 - No Pierdas tus Fotos de Immich. El Método de Seguridad DEFINITIVO

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!

1:25
-3:15

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,

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *