Immich es una aplicación autoalojada de fotos y vídeos con apps nativas para Android e iOS que suben automáticamente el carrete del móvil a tu servidor. Incluye línea de tiempo, álbumes compartidos, reconocimiento facial y búsqueda por contenido ("perro en la playa") mediante aprendizaje automático local. En este tutorial instalarás Immich con Docker Compose en Ubuntu 24.04, lo publicarás en un dominio con HTTPS, configurarás la app móvil y dejarás programadas las copias de seguridad.
Requisitos previos
- Un servidor con Ubuntu 24.04 LTS de 64 bits con al menos 4 núcleos y 8 GB de RAM (el mínimo oficial es de 6 GB), por ejemplo un VPS de CubePath. El servicio de aprendizaje automático es el que más memoria consume.
- Un usuario no root con privilegios
sudo. - Docker Engine y el plugin de Docker Compose instalados desde el repositorio oficial de Docker.
- Espacio en disco para tu biblioteca. La base de datos debe ir en un disco local (SSD), nunca en un recurso de red como NFS o SMB.
- Un dominio con un registro A apuntando a la IP del servidor, por ejemplo
fotos.tu_dominio.
Paso 1: Descargar los ficheros oficiales
Immich publica en cada versión un docker-compose.yml y un fichero de entorno de ejemplo. Usa siempre esos ficheros en lugar de escribir el tuyo desde cero: los servicios y sus versiones cambian entre versiones.
mkdir -p ~/immich-app
cd ~/immich-app
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
Comprueba que tienes los dos ficheros:
ls -la ~/immich-app
El fichero de Compose define cuatro servicios: immich-server (API, web y trabajos en segundo plano), immich-machine-learning (reconocimiento facial y búsqueda inteligente), redis (cola de trabajos) y database (PostgreSQL con extensión de búsqueda vectorial).
Paso 2: Configurar el fichero de entorno
Genera una contraseña para la base de datos. Immich recomienda usar solo letras y números para evitar problemas de escapado:
openssl rand -hex 16
Edita el fichero .env:
nano ~/immich-app/.env
Ajusta estas variables y deja el resto con su valor por defecto:
# Carpeta donde se guardan las fotos y vídeos subidos
UPLOAD_LOCATION=./library
# Carpeta de los datos de PostgreSQL (disco local, nunca NFS/SMB)
DB_DATA_LOCATION=./postgres
# Zona horaria de los contenedores
TZ=Europe/Madrid
# Contraseña de la base de datos generada antes
DB_PASSWORD=tu_contraseña_bd
La variable IMMICH_VERSION también está en este fichero. Déjala con el valor que trae: apunta a la versión principal actual y evita que un pull te lleve a una versión mayor con cambios incompatibles sin que lo decidas tú. TZ viene comentada en el ejemplo; quita el # al principio de la línea.
Protege el fichero, ya que contiene la contraseña:
chmod 600 ~/immich-app/.env
Paso 3: Limitar el puerto a localhost
Por defecto, el servicio immich-server publica el puerto 2283 en todas las interfaces. Docker gestiona sus propias reglas de iptables, así que ese puerto quedaría abierto a internet aunque UFW no lo permita. Como Nginx será la única entrada, publícalo solo en 127.0.0.1:
nano ~/immich-app/docker-compose.yml
En el servicio immich-server, cambia la línea de ports:
ports:
- '127.0.0.1:2283:2283'
Paso 4: Arrancar Immich
Descarga las imágenes y arranca los servicios:
cd ~/immich-app
docker compose up -d
La primera vez tarda unos minutos en descargar las imágenes. Comprueba que los cuatro contenedores están en marcha:
docker compose ps --format "table {{.Name}}\t{{.Status}}"
NAME STATUS
immich_machine_learning Up 2 minutes (healthy)
immich_postgres Up 2 minutes (healthy)
immich_redis Up 2 minutes (healthy)
immich_server Up 2 minutes (healthy)
Verifica que la API responde en local:
curl -s http://127.0.0.1:2283/api/server/ping
{"res":"pong"}
Paso 5: Publicar Immich por HTTPS con Nginx
La app móvil necesita una URL estable y con HTTPS. Instala Nginx y Certbot, y abre los puertos web en UFW:
sudo apt install nginx certbot python3-certbot-nginx
sudo ufw allow OpenSSH
sudo ufw allow "Nginx Full"
sudo ufw enable
Crea el sitio para Immich:
sudo nano /etc/nginx/sites-available/immich
server {
listen 80;
listen [::]:80;
server_name fotos.tu_dominio;
# Permite subir vídeos grandes desde la app
client_max_body_size 50000M;
location / {
proxy_pass http://127.0.0.1:2283;
proxy_http_version 1.1;
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 para las actualizaciones en tiempo real
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect off;
# Subidas largas sin cortes
proxy_read_timeout 600s;
proxy_send_timeout 600s;
send_timeout 600s;
}
}
Activa el sitio, valida la configuración y pide el certificado:
sudo ln -s /etc/nginx/sites-available/immich /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
sudo certbot --nginx -d fotos.tu_dominio
Comprueba el acceso por HTTPS desde el propio servidor:
curl -s https://fotos.tu_dominio/api/server/ping
{"res":"pong"}
Paso 6: Crear la cuenta de administrador
Abre https://fotos.tu_dominio en el navegador y pulsa Getting Started. El primer usuario que se registra es el administrador. Después, el asistente te pide elegir idioma, tema y la plantilla de almacenamiento (cómo se organizan los ficheros en disco); los valores por defecto son adecuados.
Desde Administración > Usuarios puedes crear cuentas para el resto de la familia o del equipo. Cada usuario tiene su propia biblioteca y puedes asignarle una cuota de almacenamiento.
Paso 7: Configurar la app móvil
Instala la app Immich desde Google Play, F-Droid o App Store y sigue estos pasos:
- Introduce la URL del servidor:
https://fotos.tu_dominio. - Inicia sesión con tu correo y contraseña.
- Pulsa el icono de nube de la parte superior y selecciona los álbumes del dispositivo que quieres copiar (normalmente el de la cámara).
- Activa la copia en primer plano y en segundo plano. En Android puedes limitarla a wifi y a cuando el móvil esté cargando.
Para comprobar que las fotos llegan al servidor, mira el tamaño de la carpeta de subida mientras la app sincroniza:
du -sh ~/immich-app/library
En la web, las fotos aparecen en la línea de tiempo en cuanto terminan de subirse. Las miniaturas, las caras y la búsqueda inteligente se procesan después en segundo plano; puedes seguir el progreso en Administración > Trabajos.
Paso 8: Añadir una biblioteca externa existente
Si ya tienes fotos en el servidor (por ejemplo, en un disco montado en /mnt/fotos), Immich puede indexarlas sin copiarlas como biblioteca externa. Edita docker-compose.yml y añade el volumen al servicio immich-server, en modo solo lectura:
volumes:
- ${UPLOAD_LOCATION}:/data
- /etc/localtime:/etc/localtime:ro
- /mnt/fotos:/mnt/fotos:ro
Añade solo la última línea; las anteriores ya están en el fichero y su ruta exacta depende de la versión de Immich. Recrea el contenedor:
cd ~/immich-app
docker compose up -d
En la web, ve a Administración > Bibliotecas externas, crea una biblioteca, asígnale un propietario, añade la ruta /mnt/fotos (la ruta dentro del contenedor) y pulsa Escanear. Immich volverá a escanearla periódicamente para detectar cambios.
Paso 9: Copias de seguridad
Una copia de Immich tiene dos partes: la base de datos (usuarios, álbumes, caras, metadatos) y los ficheros de UPLOAD_LOCATION. Immich hace automáticamente un volcado diario de la base de datos en library/backups, configurable en Administración > Configuración > Copia de seguridad. Comprueba que existen:
ls -lh ~/immich-app/library/backups/
Para tener también un volcado propio antes de cada actualización, este es el comando recomendado por Immich:
mkdir -p ~/backups
docker exec -t immich_postgres pg_dumpall --clean --if-exists --username=postgres | gzip > ~/backups/immich-db-$(date +%F).sql.gz
Copia toda la carpeta library (que incluye los volcados) a otro servidor o a un almacenamiento de objetos con una herramienta de copias incrementales como restic o borg. Una copia que solo está en el mismo servidor no te protege de un fallo de disco.
Actualizar Immich
Immich publica versiones con frecuencia y algunas incluyen cambios que requieren pasos manuales. Antes de actualizar, lee las notas de la versión en GitHub y haz un volcado de la base de datos (paso 9). Después:
cd ~/immich-app
docker compose pull
docker compose up -d
docker image prune -f
Comprueba en docker compose ps que todos los contenedores vuelven a estar healthy y que la versión mostrada en la esquina de la web es la nueva.
Solución de problemas
La app móvil no conecta. Comprueba desde fuera del servidor que https://fotos.tu_dominio/api/server/ping devuelve {"res":"pong"}. Si el navegador funciona pero la app no, revisa que usas https:// y que el certificado es válido (no autofirmado).
Los vídeos grandes fallan al subir. Suele ser client_max_body_size o los timeouts de Nginx. Revisa /var/log/nginx/error.log y comprueba que el sitio tiene los valores del paso 5. Si usas un proxy o CDN delante del servidor, puede tener su propio límite de tamaño.
El contenedor de aprendizaje automático se reinicia. Normalmente es falta de memoria. Revisa docker compose logs immich-machine-learning --tail 50 y free -h. Puedes elegir un modelo de búsqueda inteligente más ligero en Administración > Configuración > Aprendizaje automático o ampliar la RAM del servidor.
database no arranca tras cambiar DB_PASSWORD. La contraseña solo se aplica al crear la base de datos. Vuelve a poner la contraseña original en .env o cámbiala dentro de PostgreSQL antes de modificar el fichero.
Conclusión
Tienes Immich funcionando con Docker, publicado por HTTPS con Nginx, recibiendo las fotos del móvil y con volcados diarios de la base de datos. Como siguientes pasos puedes configurar el envío de correos en Administración > Configuración > Notificaciones, crear álbumes compartidos con otros usuarios o automatizar la copia externa de library con restic y un timer de systemd.
