Immich: Backup de Fotos y Vídeos Self-Hosted

Immich es la alternativa open-source más popular a Google Photos, con aplicaciones nativas para iOS y Android que sincronizan automáticamente tu cámara al servidor. Incluye funciones de machine learning para reconocimiento facial, búsqueda por objetos, biblioteca compartida entre usuarios y soporte para fotos RAW y vídeos en alta resolución. Esta guía cubre el despliegue completo de Immich en Linux con Docker.

Requisitos Previos

  • Servidor con Ubuntu 20.04+, Debian 11+ o CentOS 8+
  • Docker y Docker Compose instalados
  • Mínimo 4 GB de RAM (8 GB recomendados para ML activo)
  • 4+ núcleos de CPU
  • Almacenamiento suficiente para fotos y vídeos (SSD para la base de datos)
  • Puerto 2283 accesible (o proxy inverso con SSL)

Instalación con Docker Compose

Immich proporciona un docker-compose oficial con todos los servicios necesarios:

# Crear directorio de instalación
mkdir -p ~/immich && cd ~/immich

# Descargar el docker-compose y el archivo .env oficial
wget -O docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env

# Ver el archivo .env para configuración
cat .env

Editar el archivo .env:

nano ~/immich/.env
# Ruta donde se guardan los archivos subidos
UPLOAD_LOCATION=./library

# Ruta para la base de datos PostgreSQL
DB_DATA_LOCATION=./postgres

# Zona horaria del servidor
TZ=Europe/Madrid

# Credenciales de la base de datos (cambiar en producción)
DB_PASSWORD=contrasena-postgres-segura
DB_USERNAME=postgres
DB_DATABASE_NAME=immich

# Versión de Immich (dejar en "release" para actualizaciones automáticas)
IMMICH_VERSION=release
# Iniciar todos los servicios
docker compose up -d

# Ver el progreso de inicio (tarda varios minutos la primera vez)
docker compose logs -f immich-server

# Verificar que todos los servicios están activos
docker compose ps

Los servicios que se inician:

  • immich-server: Servidor principal API y web
  • immich-microservices: Procesamiento de trabajos en segundo plano
  • immich-machine-learning: Modelos de IA para reconocimiento
  • redis: Caché y cola de trabajos
  • database: PostgreSQL con extensión pgvecto.rs

Configuración Inicial

Acceder al panel web en http://TU-SERVIDOR:2283:

  1. Crear la primera cuenta de administrador
  2. Configurar el servidor (nombre, logo, etc.)
  3. Ajustar los ajustes de machine learning si es necesario
# Abrir el puerto en el firewall (si no usas proxy inverso)
sudo ufw allow 2283/tcp comment "Immich"
sudo ufw reload

Configuración recomendada desde el panel (Administración):

  • Almacenamiento: Verificar la ruta de subida
  • Machine Learning: Ajustar modelos según recursos disponibles
  • Tareas: Configurar horarios de procesamiento nocturno
  • Notificaciones: Configurar email si se desea

Configuración de la App Móvil

Descargar la app de Immich en iOS o Android:

  • iOS: App Store > Immich
  • Android: Google Play / F-Droid > Immich

Configuración en la app:

  1. Abrir la app > Introducir la URL del servidor: https://fotos.tu-dominio.com
  2. Iniciar sesión con las credenciales creadas
  3. Ir a Configuración de backup:
    • Tipo de red: WiFi y datos móviles (o solo WiFi)
    • Frecuencia de backup: En background automático
    • Formatos: Incluir HEIC, RAW, vídeos
# Verificar que las subidas de la app móvil llegan al servidor
docker exec -it immich-server /bin/bash -c "ls /usr/src/app/upload/upload/ | wc -l"

# Ver el log de subidas recientes
docker logs immich-microservices 2>&1 | grep "upload" | tail -20

Machine Learning y Reconocimiento Facial

Immich incluye modelos de ML para:

  • Reconocimiento facial con agrupación automática de personas
  • CLIP para búsqueda semántica (buscar "perro en la playa")
  • Clasificación de escenas
# Ver los modelos de ML descargados
docker exec immich-machine-learning ls /cache/

# Los modelos se descargan automáticamente en el primer uso
# Para forzar la descarga de un modelo específico
docker exec immich-machine-learning python3 -c "
from app.models.clip import OpenCLIPEncoder
model = OpenCLIPEncoder('ViT-B-32__openai')
print('Modelo CLIP cargado correctamente')
"

Gestionar personas reconocidas:

  • Ir a Personas en el panel web
  • Asignar nombres a las caras reconocidas
  • Fusionar personas duplicadas

Para ajustar el modelo de reconocimiento (desde el panel Administración > Machine Learning):

  • Modelo de reconocimiento facial: buffalo_l (más preciso) o buffalo_s (más rápido)
  • Umbral de detección mínima: 0.7 (reducir para detectar más caras)
  • Umbral de reconocimiento: 0.6 (reducir para agrupar más agresivamente)

Bibliotecas Compartidas y Almacenamiento Externo

Immich permite montar carpetas externas existentes sin copiarlas:

# Editar docker-compose.yml para agregar un volumen de almacenamiento externo
# En el servicio immich-server, agregar en volumes:
# - /mnt/fotos-existentes:/mnt/media/fotos-existentes:ro
# Y en immich-microservices también:
# - /mnt/fotos-existentes:/mnt/media/fotos-existentes:ro

# Reiniciar después de modificar el compose
docker compose down && docker compose up -d

Desde el panel web:

  • Ir a Administración > Bibliotecas externas
  • Agregar nueva biblioteca con la ruta /mnt/media/fotos-existentes
  • Configurar la importación periódica

Compartir biblioteca con otros usuarios:

  • Ir a Compartir (en el menú lateral)
  • Seleccionar fotos o álbumes a compartir
  • Invitar a otros usuarios registrados

Backup y Estrategia de Almacenamiento

# Directorios críticos a hacer backup:
# ~/immich/library/     - Los archivos originales subidos
# ~/immich/postgres/    - Base de datos PostgreSQL

# Hacer backup de la base de datos
docker exec -t immich-postgres pg_dumpall -U postgres | \
  gzip > ~/backups/immich-db-$(date +%Y%m%d).sql.gz

# Backup de los archivos originales con rsync
rsync -av --progress \
  ~/immich/library/ \
  usuario@servidor-backup:/backups/immich/library/

# Script de backup automatizado
tee ~/scripts/immich-backup.sh << 'EOF'
#!/bin/bash
FECHA=$(date +%Y%m%d_%H%M)
BACKUP_DIR="/mnt/backup/immich"

mkdir -p "$BACKUP_DIR"

# Backup de la base de datos
docker exec immich-postgres pg_dumpall -U postgres | \
  gzip > "$BACKUP_DIR/db-$FECHA.sql.gz"

# Mantener solo los últimos 7 backups de BD
ls -t "$BACKUP_DIR"/db-*.sql.gz | tail -n +8 | xargs rm -f

echo "Backup completado: $FECHA"
EOF
chmod +x ~/scripts/immich-backup.sh

# Programar backup diario a las 3 AM
(crontab -l 2>/dev/null; echo "0 3 * * * ~/scripts/immich-backup.sh") | crontab -

Proxy Inverso con Nginx

# Obtener certificado SSL
sudo certbot --nginx -d fotos.tu-dominio.com

# Configuración de Nginx para Immich
sudo tee /etc/nginx/sites-available/immich << 'EOF'
server {
    listen 443 ssl http2;
    server_name fotos.tu-dominio.com;

    ssl_certificate /etc/letsencrypt/live/fotos.tu-dominio.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/fotos.tu-dominio.com/privkey.pem;

    # Tamaño máximo de subida para vídeos (ajustar según necesidad)
    client_max_body_size 50000M;

    location / {
        proxy_pass http://127.0.0.1:2283;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        # Sin timeout para subidas largas
        proxy_read_timeout 600s;
        proxy_send_timeout 600s;
        proxy_request_buffering off;
    }
}
EOF

sudo ln -s /etc/nginx/sites-available/immich /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

Actualización de Immich

Immich se actualiza frecuentemente. El proceso es sencillo:

cd ~/immich

# Descargar la nueva versión del docker-compose
wget -O docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml

# Hacer backup antes de actualizar
docker exec immich-postgres pg_dumpall -U postgres | \
  gzip > ~/backups/immich-pre-update-$(date +%Y%m%d).sql.gz

# Actualizar las imágenes y reiniciar
docker compose pull
docker compose up -d

# Verificar que la actualización fue exitosa
docker compose logs immich-server --tail 20

Solución de Problemas

Los servicios no inician:

# Ver el estado de todos los servicios
docker compose ps

# Ver logs de un servicio específico
docker compose logs immich-server --tail 50
docker compose logs database --tail 30

# Verificar la configuración del .env
cat ~/immich/.env

La app móvil no puede conectar:

# Verificar la URL del servidor (debe ser accesible externamente)
curl -I https://fotos.tu-dominio.com

# Comprobar que el proxy Nginx está configurado correctamente
sudo nginx -t
sudo systemctl status nginx

# Ver los intentos de conexión en los logs de Nginx
sudo tail -f /var/log/nginx/access.log | grep fotos

El reconocimiento facial no funciona:

# Verificar el estado del servicio ML
docker logs immich-machine-learning --tail 30

# Comprobar los recursos disponibles (ML requiere más RAM)
free -h
docker stats immich-machine-learning

# Reiniciar el servicio ML
docker compose restart immich-machine-learning

Falta espacio en disco:

# Ver el uso de espacio de Immich
du -sh ~/immich/library/ ~/immich/postgres/

# Verificar el espacio del disco
df -h

# Limpiar miniaturas huérfanas (desde el panel Administración > Tareas)
# O via CLI:
docker exec -it immich-server /bin/bash
# Dentro del contenedor: immich media:clean

Conclusión

Immich ofrece una experiencia de galería fotográfica moderna y completa, con backup automático desde el móvil comparable a Google Photos pero con privacidad total. Su arquitectura basada en microservicios permite escalar el procesamiento ML de forma independiente, y el soporte activo de la comunidad garantiza actualizaciones frecuentes con nuevas funcionalidades.