Autoalojar Immich en un VPS con Docker Compose

17 min de lectura·Matthieu·photo-managementself-hostingimmichdocker-composegoogle-photos-alternative|

Despliega Immich en un VPS como alternativa autoalojada a Google Photos. Configuración con Docker Compose, backup móvil, planificación de almacenamiento con cifras reales, machine learning en CPU, backup y restauración de base de datos, y un flujo de actualización seguro.

Immich es una plataforma de código abierto y autoalojada para la gestión de fotos y vídeos. Se encarga del backup automático desde el móvil, reconocimiento facial, búsqueda inteligente y compartición de álbumes. Si quieres dejar de enviar tus fotos a Google, Immich es el equivalente autoalojado más completo.

Ejecutar Immich en un VPS europeo significa que tus fotos permanecen en una infraestructura que tú controlas. Sin escaneos de terceros, sin datasets de entrenamiento, sin cambios de política sorpresa. A efectos del RGPD, eres a la vez responsable del tratamiento y encargado del tratamiento, lo que simplifica el cumplimiento cuando los datos nunca abandonan tu servidor.

Esta guía despliega Immich en un VPS remoto usando Docker Compose. Asume que ya tienes Docker Engine con el plugin Compose instalado y un reverse proxy funcionando. Si necesitas instalarlos primero, consulta Docker en producción en un VPS: qué falla y cómo solucionarlo y Traefik vs Caddy vs Nginx: reverse proxy Docker comparado.

¿Qué necesitas para ejecutar Immich en un VPS?

Immich necesita al menos 6 GB de RAM y 2 núcleos de CPU para un despliegue completo con machine learning activado. Sin ML, 4 GB son suficientes. El almacenamiento depende de tu biblioteca de fotos: calcula el tamaño bruto de tu biblioteca más un 10-20 % de overhead para miniaturas y vídeo transcodificado, más 1-3 GB para la base de datos PostgreSQL. Se requiere Docker Engine con el plugin Compose. Immich solo funciona en Linux.

Componente Mínimo Recomendado
RAM 4 GB (ML desactivado) 8 GB
CPU 2 núcleos 4 núcleos
Almacenamiento 50 GB (biblioteca pequeña) 250 GB+
Software Docker Engine + plugin Compose Igual
SO Cualquier Linux con Docker Ubuntu 22.04/24.04, Debian 12

PostgreSQL necesita almacenamiento SSD local. Nunca pongas la base de datos en un recurso compartido de red. En un VPS Virtua, NVMe es el estándar, así que esto ya está cubierto.

¿Cómo desplegar Immich con Docker Compose?

Descarga el archivo Docker Compose oficial y el archivo de entorno de ejemplo desde la página de releases de Immich, configura tus rutas de almacenamiento y la contraseña de la base de datos, y arranca el stack.

Crear el directorio del proyecto

mkdir -p /opt/immich && cd /opt/immich

Descargar los archivos oficiales

Descarga siempre estos archivos desde la última release. No copies y pegues desde blogs (este incluido) porque Immich actualiza su archivo Compose con frecuencia para adaptarse a cambios en las imágenes de base de datos.

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

Configurar el entorno

Abre el archivo .env:

nano .env

Establece estos valores:

UPLOAD_LOCATION=/opt/immich/data
DB_DATA_LOCATION=/opt/immich/postgres
IMMICH_VERSION=v2.6.1
DB_PASSWORD=<tu-contraseña-fuerte>
TZ=Europe/Berlin

Genera una contraseña de base de datos fuerte solo con caracteres alfanuméricos (A-Za-z0-9). Los caracteres especiales causan problemas de parsing en Docker Compose con archivos .env:

openssl rand -base64 32 | tr -dc 'A-Za-z0-9' | head -c 32; echo

Copia la salida y pégala como valor de DB_PASSWORD.

Fija IMMICH_VERSION a una etiqueta de release específica como v2.6.1 en lugar de usar el metatag v2. Esto previene actualizaciones inesperadas cuando ejecutas docker compose pull para otros servicios. Tú controlas cuándo se actualiza Immich.

Crear los directorios de datos

mkdir -p /opt/immich/data /opt/immich/postgres

Eliminar el puerto expuesto

El archivo Compose por defecto expone el puerto 2283 directamente. Como usas un reverse proxy, elimina o comenta la sección ports en docker-compose.yml para que Immich solo sea accesible a través del proxy:

sed -i "s/- '2283:2283'/# - '2283:2283'/" docker-compose.yml

En su lugar, conecta Immich a la red Docker de tu reverse proxy. Si tu red proxy se llama proxy:

cat >> docker-compose.yml << 'EOF'

networks:
  default:
  proxy:
    external: true
EOF

Después añade la red proxy al servicio immich-server. Edita docker-compose.yml y añade bajo el servicio immich-server:

    networks:
      - default
      - proxy

Esto mantiene la base de datos y Redis en la red interna mientras expone solo el servidor al reverse proxy.

Arrancar el stack

docker compose up -d

Observa los logs para confirmar que todos los servicios arrancan sin problemas:

docker compose logs -f --tail=50

Los logs del servidor muestran Immich Server is listening on http://[::1]:2283 cuando está listo. El servicio de machine learning carga sus modelos a continuación. Pulsa Ctrl+C para salir del flujo de logs.

Comprueba que los cuatro contenedores están funcionando:

docker compose ps
NAME                    STATUS
immich_server           Up (healthy)
immich_machine_learning Up (healthy)
immich_redis            Up (healthy)
immich_postgres         Up (healthy)

Los cuatro deberían mostrar Up (healthy) en un par de minutos. El contenedor ML tarda más porque descarga modelos en el primer arranque.

Restringir los permisos de archivos

El archivo .env contiene la contraseña de tu base de datos. Protégelo:

chmod 600 .env
ls -la .env
-rw------- 1 root root 245 Mar 20 10:00 .env

¿Cómo configurar un reverse proxy para Immich?

Immich necesita un reverse proxy para HTTPS y para gestionar las subidas de archivos grandes desde dispositivos móviles. Debes fijar el límite de tamaño del cuerpo de la petición lo suficientemente alto para subidas de vídeo. Sin esto, las subidas que superen el límite por defecto (normalmente 1 MB en Nginx) fallan silenciosamente.

Para una configuración completa del reverse proxy, consulta Traefik vs Caddy vs Nginx: reverse proxy Docker comparado. Aquí tienes los fragmentos específicos para Immich.

Caddy

En tu Caddyfile:

photos.example.com {
    reverse_proxy immich_server:2283
}

Caddy gestiona TLS automáticamente y no tiene límite de tamaño de cuerpo por defecto, así que las subidas de vídeo funcionan directamente.

Traefik

Añade labels al servicio immich-server en docker-compose.yml:

    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.immich.rule=Host(`photos.example.com`)"
      - "traefik.http.routers.immich.entrypoints=websecure"
      - "traefik.http.routers.immich.tls.certresolver=letsencrypt"
      - "traefik.http.services.immich.loadbalancer.server.port=2283"

Para subidas grandes con Traefik, añade un middleware para aumentar el límite de buffering o configura maxRequestBodyBytes en tu configuración estática de Traefik.

Nginx

Si usas Nginx como reverse proxy, la configuración clave es client_max_body_size. Sin ella, las subidas de vídeo fallan:

server {
    server_name photos.example.com;

    client_max_body_size 50000M;

    location / {
        proxy_pass http://immich_server: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 $scheme;

        # WebSocket support for real-time updates
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

Apunta tu registro DNS A (y AAAA si tienes IPv6) a la dirección IP de tu VPS. Tras la propagación DNS, accede a Immich en https://photos.example.com.

¿Cómo asegurar Immich tras el primer inicio de sesión?

Abre https://photos.example.com en tu navegador. Immich muestra una página de registro. Crea tu cuenta de administrador con una contraseña fuerte.

Después de crear tu cuenta de admin, desactiva el registro público inmediatamente. Ve a Administration > Settings > Server y desactiva Allow New Users. Cualquiera que descubra tu URL podría crear una cuenta y subir archivos a tu almacenamiento.

Ajustes del panel de administración a revisar

  • Administration > Settings > Storage Template: actívalo para organizar archivos por fecha ({{y}}/{{y}}-{{MM}}-{{dd}}/{{filename}}) en lugar de UUIDs aleatorios. Esto hace posible la navegación manual y las restauraciones selectivas.
  • Administration > Settings > Backup: los backups automáticos de la base de datos están activos por defecto, ejecutándose diariamente a las 2:00 con 14 días de retención. Confirma que está activo.
  • Administration > Settings > Server: establece la URL externa a tu dominio (https://photos.example.com). La app móvil y los enlaces compartidos la usan.

Hardening a nivel de contenedor

Añade opciones de seguridad al servicio immich-server en docker-compose.yml:

    security_opt:
      - no-new-privileges:true

Esto previene la escalada de privilegios dentro del contenedor. El flag no-new-privileges bloquea los binarios setuid para que no obtengan permisos elevados.

Para límites de recursos, añade restricciones de memoria para evitar que un contenedor consuma toda la RAM del VPS y active el OOM killer. Consulta Límites de recursos, healthchecks y políticas de reinicio en Docker Compose para la sintaxis completa. Un punto de partida práctico para un VPS de 8 GB:

    deploy:
      resources:
        limits:
          memory: 2G

Aplica esto a immich-server e immich-machine-learning. PostgreSQL y Redis rara vez necesitan límites explícitos en un VPS de 8 GB, pero se benefician de ellos en una instancia de 4 GB.

Ocultar información de versión

Immich expone su versión en las respuestas API por defecto. Aunque no es una vulnerabilidad directa, la divulgación de versión ayuda a los atacantes a apuntar a problemas conocidos. No hay un ajuste integrado para ocultarla, pero tu reverse proxy puede eliminar cabeceras de respuesta. En Nginx:

proxy_hide_header X-Powered-By;

¿Cómo conectar la app móvil de Immich para backup automático?

Instala la app de Immich desde la App Store (iOS) o Google Play (Android). En el primer inicio, introduce la URL de tu servidor (https://photos.example.com) e inicia sesión con tus credenciales de admin. La app te pide activar el backup automático.

Configurar el backup automático

  1. Abre la app, toca tu avatar en la esquina superior derecha y luego Backup Settings.
  2. Activa Background Backup. En iOS, activa también Background App Refresh en los ajustes del sistema. En Android, desactiva la optimización de batería para Immich para que el sistema no lo cierre.
  3. Elige qué álbumes respaldar. Por defecto, Immich respalda tu carrete de cámara. Puedes añadir otros álbumes (capturas de pantalla, imágenes de WhatsApp) desde la pantalla de selección de álbumes.
  4. Activa Cellular Backup solo si tu plan móvil lo permite. Las subidas de vídeo grandes pueden consumir varios GB.

Primera prueba de backup

Toma una foto, abre la app de Immich y desliza hacia abajo para refrescar. La foto debería aparecer en la línea temporal en segundos cuando estés en Wi-Fi. El indicador de estado del backup en la app muestra una marca verde cuando todas las fotos están sincronizadas.

Desde tu VPS, puedes confirmar que las subidas llegan:

ls /opt/immich/data/upload/

Verás un directorio nombrado con tu ID de usuario que contiene los archivos subidos.

¿Cuánto almacenamiento necesita Immich por foto?

La planificación de almacenamiento en un VPS importa más que en un NAS porque no puedes simplemente añadir otro disco. Aquí tienes cifras reales basadas en bibliotecas de fotos típicas de smartphones.

Almacenamiento por tipo de foto

Formato Tamaño medio Notas
Smartphone JPEG 3-5 MB Formato más común
HEIC (iPhone) 2-3 MB Formato por defecto de Apple desde iPhone 7
RAW (réflex) 25-50 MB Cámaras profesionales
Vídeo smartphone (1080p) ~150 MB/min Varía según el códec
Vídeo smartphone (4K) ~400 MB/min H.265 ahorra ~40 %

Almacenamiento total por tamaño de biblioteca

Esta tabla usa JPEGs de smartphone a 4 MB de media, más el overhead de Immich (miniaturas, transcodificaciones, base de datos).

Tamaño biblioteca Fotos brutas Miniaturas (~15 %) BD Total
10.000 fotos 40 GB 6 GB 1 GB ~47 GB
25.000 fotos 100 GB 15 GB 1,5 GB ~117 GB
50.000 fotos 200 GB 30 GB 2 GB ~232 GB
100.000 fotos 400 GB 60 GB 3 GB ~463 GB
200.000 fotos 800 GB 120 GB 4 GB ~924 GB

Si tu biblioteca incluye vídeo, multiplica las necesidades de almacenamiento en consecuencia. Una biblioteca con un 10 % de contenido en vídeo (por número de archivos) puede duplicar el requisito de almacenamiento porque los vídeos son 30-100 veces más grandes por archivo que las fotos.

Cuándo añadir más almacenamiento

En un VPS Virtua, puedes adjuntar volúmenes de almacenamiento en bloque adicionales cuando tu disco principal se llene. Monta el volumen y apunta UPLOAD_LOCATION a él. Para bibliotecas superiores a 500 GB, considera almacenamiento externo compatible con S3. Immich lo soporta a través de su configuración de almacenamiento, descargando los medios a almacenamiento de objetos mientras mantiene la base de datos y las miniaturas en local.

Monitoriza el uso de disco con una simple comprobación cron:

df -h /opt/immich/data

Configura una alerta cuando el uso supere el 80 %. Un disco lleno corrompe la base de datos PostgreSQL y puede hacer tu instancia de Immich irrecuperable sin un backup.

La función «Free Up Space» de la v2.5

Immich v2.5+ incluye un botón «Free Up Space» en la app móvil. Después de que las fotos se respaldan en tu servidor, la app puede eliminar las copias locales de tu teléfono para liberar espacio. Solo elimina archivos cuya subida está confirmada y que no están en la papelera de Immich. Funciona tanto en iOS como en Android.

¿Cómo funciona el machine learning de Immich sin GPU?

Las funciones ML de Immich (reconocimiento facial, búsqueda inteligente vía CLIP y detección de objetos) se ejecutan en CPU por defecto. No se necesita GPU. El contenedor immich-machine-learning carga modelos en RAM y procesa fotos en segundo plano sin bloquear las subidas ni la navegación.

En un VPS de 4 núcleos con 8 GB de RAM, estos son los tiempos aproximados de procesamiento para el escaneo inicial:

Tamaño biblioteca Detección facial Indexación CLIP Total (secuencial)
1.000 fotos ~15 min ~20 min ~35 min
10.000 fotos ~2,5 horas ~3,5 horas ~6 horas
50.000 fotos ~12 horas ~17 horas ~29 horas

Son costes de una sola vez. Tras el escaneo inicial, las nuevas subidas se procesan en segundos. El contenedor ML se ejecuta con baja prioridad y no bloquea las subidas ni la navegación mientras trabaja la cola.

Selección de modelos

Immich usa dos modelos ML principales:

  • Reconocimiento facial: detecta y agrupa caras en tu biblioteca. Se ejecuta automáticamente en cada subida.
  • CLIP (búsqueda inteligente): indexa fotos por contenido para que puedas buscar «atardecer» o «perro en la playa» sin etiquetas. Usa más RAM que el reconocimiento facial.

Ambos modelos se cargan en RAM cuando se necesitan por primera vez y se descargan tras 5 minutos de inactividad (MACHINE_LEARNING_MODEL_TTL=300 por defecto). En un VPS con memoria limitada, puedes reducir este valor para liberar RAM más rápido:

# In .env
MACHINE_LEARNING_MODEL_TTL=60

Recrea el contenedor después de cambiar variables de entorno (reiniciar no basta):

docker compose up -d --force-recreate immich-machine-learning

Distribución de RAM por componente

Componente Uso RAM (VPS 8 GB) Uso RAM (VPS 4 GB)
immich-server ~500 MB ~500 MB
immich-machine-learning ~1,5-2 GB desactivado
PostgreSQL ~500 MB-1 GB ~500 MB
Redis (Valkey) ~50 MB ~50 MB
SO + overhead Docker ~1 GB ~1 GB
Margen disponible ~3-4 GB ~2 GB

¿Cómo desactivar ML para ahorrar recursos en un VPS pequeño?

Si tienes un VPS de 4 GB o quieres ahorrar recursos, elimina o comenta el servicio immich-machine-learning de docker-compose.yml:

cd /opt/immich

Edita docker-compose.yml y comenta (o elimina) el bloque completo del servicio immich-machine-learning. Luego reinicia:

docker compose up -d

Pierdes reconocimiento facial, búsqueda inteligente y detección de objetos. La subida de fotos, navegación, compartición y gestión de álbumes siguen funcionando normalmente. Puedes reactivar ML más tarde descomentando el servicio y reiniciando.

¿Cómo hacer backup de la base de datos y fotos de Immich?

Haz backup de dos cosas: la base de datos PostgreSQL con pg_dump y el directorio de subidas con rsync. Programa ambos con cron. No uses rsync --delete en el destino de backup porque una corrupción en el origen se propagaría a tu backup. Almacena al menos una copia fuera del servidor. Prueba tu procedimiento de restauración periódicamente.

Backup de la base de datos

docker exec -t immich_postgres pg_dump \
  --clean --if-exists \
  --dbname=immich \
  --username=postgres | gzip > /opt/immich/backups/db-$(date +%Y%m%d-%H%M%S).sql.gz

Backup del directorio de subidas

rsync -a --info=progress2 \
  /opt/immich/data/ \
  /mnt/backup/immich-data/

Omite las miniaturas y el vídeo transcodificado para ahorrar espacio. Se regeneran automáticamente:

rsync -a --info=progress2 \
  --exclude='thumbs/' \
  --exclude='encoded-video/' \
  /opt/immich/data/ \
  /mnt/backup/immich-data/

Automatizar con cron

Crea un script de backup:

cat > /opt/immich/backup.sh << 'SCRIPT'
#!/bin/bash
set -euo pipefail

BACKUP_DIR="/mnt/backup/immich"
mkdir -p "$BACKUP_DIR/db"

# Database dump
docker exec -t immich_postgres pg_dump \
  --clean --if-exists \
  --dbname=immich \
  --username=postgres | gzip > "$BACKUP_DIR/db/immich-db-$(date +%Y%m%d).sql.gz"

# Keep last 14 database dumps
find "$BACKUP_DIR/db" -name "immich-db-*.sql.gz" -mtime +14 -delete

# Media sync (excludes regeneratable data)
rsync -a \
  --exclude='thumbs/' \
  --exclude='encoded-video/' \
  /opt/immich/data/ \
  "$BACKUP_DIR/media/"

echo "Backup completed: $(date)"
SCRIPT

chmod 700 /opt/immich/backup.sh

Prográmalo para ejecutarse cada noche a las 3:00 (después del backup interno de Immich a las 2:00):

(crontab -l 2>/dev/null; echo "0 3 * * * /opt/immich/backup.sh >> /var/log/immich-backup.log 2>&1") | crontab -

Backup fuera del servidor

Para una verdadera estrategia de backup 3-2-1, copia los backups fuera del servidor usando rclone hacia cualquier proveedor de almacenamiento compatible con S3:

rclone sync /mnt/backup/immich remote:immich-backup --transfers 4

Consulta la documentación de tu proveedor de almacenamiento para la configuración de rclone.

Probar la restauración

Un backup que no has probado no es un backup. Este es el procedimiento de restauración:

cd /opt/immich
docker compose down -v
rm -rf /opt/immich/postgres/*

docker compose pull
docker compose create
docker start immich_postgres
sleep 10

gunzip --stdout /mnt/backup/immich/db/immich-db-20260320.sql.gz | \
  sed "s/SELECT pg_catalog.set_config('search_path', '', false);/SELECT pg_catalog.set_config('search_path', 'public, pg_catalog', true);/g" | \
  docker exec -i immich_postgres psql \
    --dbname=immich \
    --username=postgres \
    --single-transaction \
    --set ON_ERROR_STOP=on

docker compose up -d

Tras la restauración, inicia sesión en la interfaz web. Navega por tu línea temporal y confirma que las fotos se cargan. Si faltan miniaturas (porque las excluiste del backup), ve a Administration > Job Queues y ejecuta Generate Thumbnails.

¿Cómo actualizar Immich de forma segura?

Immich sigue el versionado semántico y publica actualizaciones con frecuencia. Algunas releases incluyen migraciones de base de datos. No se puede hacer downgrade después de una actualización. Necesitas un flujo de actualización disciplinado.

Procedimiento de actualización paso a paso

  1. Lee el changelog. Revisa la página de releases en busca de breaking changes antes de hacer pull de nada.

  2. Haz backup de la base de datos. Ejecuta el script de backup o un pg_dump manual como se mostró arriba. No te saltes este paso.

  3. Actualiza el pin de versión. Edita /opt/immich/.env y cambia IMMICH_VERSION a la nueva versión:

# Example: updating from v2.6.1 to v2.7.0
sed -i 's/IMMICH_VERSION=v2.6.1/IMMICH_VERSION=v2.7.0/' /opt/immich/.env
  1. Pull y reinicio.
cd /opt/immich
docker compose pull
docker compose up -d
  1. Revisa los logs.
docker compose logs -f --tail=100

Busca mensajes de migración y confirma que el servidor arranca sin errores. Las migraciones de base de datos se ejecutan automáticamente al arrancar.

  1. Limpia las imágenes antiguas.
docker image prune -f

Rollback

Si algo falla, no puedes simplemente volver a la versión anterior porque la base de datos puede haber migrado. Restaura desde tu backup de base de datos previo a la actualización:

  1. Detén el stack: docker compose down -v
  2. Restaura la base de datos desde tu backup (consulta la sección de restauración arriba)
  3. Pon IMMICH_VERSION de vuelta a la versión anterior en .env
  4. Arranca el stack: docker compose up -d

Por eso haces backup antes de cada actualización.

¿Cómo importar fotos de Google Takeout a Immich?

La forma más fácil de importar una exportación de Google Photos es immich-go, una herramienta comunitaria que lee archivos ZIP de Google Takeout directamente. Preserva la estructura de álbumes, fechas y metadatos GPS de los archivos JSON sidecar.

Descarga immich-go en tu máquina local (no en el VPS). Genera una clave API en Immich: haz clic en tu avatar > Account Settings > API Keys > New API Key.

immich-go upload from-google-photos \
  --server=https://photos.example.com \
  --api-key=your-api-key \
  /path/to/takeout-*.zip

Ejecuta primero un dry run para ver qué se importará:

immich-go upload from-google-photos \
  --server=https://photos.example.com \
  --api-key=your-api-key \
  --dry-run \
  /path/to/takeout-*.zip

La herramienta deduplica por checksum. Si ejecutas la importación dos veces, nada se sube una segunda vez.

Para importaciones más pequeñas (menos de unos miles de fotos), usa la interfaz web de Immich. Arrastra y suelta archivos en la vista de línea temporal o haz clic en el botón de subida. El uploader web gestiona lotes pero es más lento que immich-go para bibliotecas grandes.

Montaje de biblioteca externa

Si tus fotos ya están en el sistema de archivos del VPS (de un backup o migración anterior), puedes montarlas como biblioteca externa en lugar de volver a subirlas. Añade la ruta como volumen en docker-compose.yml bajo immich-server:

    volumes:
      - ${UPLOAD_LOCATION}:/data
      - /etc/localtime:/etc/localtime:ro
      - /mnt/photos:/mnt/photos:ro

Luego en la interfaz web de Immich, ve a Administration > External Libraries y añade /mnt/photos como ruta de biblioteca. Immich indexa los archivos in situ sin copiarlos. El flag :ro mantiene el montaje en solo lectura para que Immich no pueda modificar tus originales.

Resolución de problemas

El contenedor se reinicia en bucle

Revisa los logs del contenedor específico:

docker compose logs immich-server --tail=50
docker compose logs database --tail=50

Causas comunes: DB_PASSWORD incorrecto en .env (el contenedor y la base de datos no coinciden), RAM insuficiente (OOM killer), o disco lleno.

Las subidas fallan silenciosamente

Casi siempre es un límite de tamaño del cuerpo de petición del reverse proxy. Revisa tu configuración de proxy para client_max_body_size (Nginx) o equivalente. Caddy no tiene límite por defecto. Los valores por defecto de Traefik varían según la versión.

Los modelos ML no se cargan

El contenedor ML descarga modelos en el primer arranque. Si tu VPS tiene ancho de banda limitado o la descarga se interrumpió, los modelos pueden estar corruptos. Elimina el contenedor, borra el volumen de caché de modelos y recréalo:

docker compose rm -sf immich-machine-learning
docker volume rm immich_model-cache
docker compose up -d immich-machine-learning

Las fotos se muestran pero las miniaturas están rotas

Regenera las miniaturas desde el panel de admin: Administration > Job Queues > Generate Thumbnails > Start.

Errores de conexión a la base de datos tras la restauración

Si ves errores relation already exists o foreign key constraint violated durante una restauración, la base de datos no estaba completamente limpia antes de la importación. Detén todos los contenedores, elimina el directorio DB_DATA_LOCATION, recrea el contenedor postgres, espera 10 segundos para la inicialización y ejecuta la restauración de nuevo.

Consultar los logs

Todos los logs de Immich pasan por el driver de logging de Docker:

docker compose logs -f

Para un servicio específico:

docker compose logs database -f
docker compose logs immich-machine-learning -f

Filtrar solo errores:

docker compose logs immich-server 2>&1 | grep -i error

Copyright 2026 Virtua.Cloud. Todos los derechos reservados. Este contenido es una obra original del equipo de Virtua.Cloud. La reproducción, republicación o redistribución sin permiso escrito está prohibida.

¿Listo para probarlo?

Despliega tu propio servidor en segundos. Linux, Windows o FreeBSD.

Ver planes VPS