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 webimmich-microservices: Procesamiento de trabajos en segundo planoimmich-machine-learning: Modelos de IA para reconocimientoredis: Caché y cola de trabajosdatabase: PostgreSQL con extensión pgvecto.rs
Configuración Inicial
Acceder al panel web en http://TU-SERVIDOR:2283:
- Crear la primera cuenta de administrador
- Configurar el servidor (nombre, logo, etc.)
- 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:
- Abrir la app > Introducir la URL del servidor:
https://fotos.tu-dominio.com - Iniciar sesión con las credenciales creadas
- 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) obuffalo_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.


