Immich en Proxmox: instala tu galería autohospedada
Immich es un gestor de fotos y vídeos autohospedado con apps móviles, reconocimiento facial y búsqueda semántica. Aquí cuento cómo lo monté en Proxmox con Docker Compose y qué fricción real tiene el proceso.
Si ya tienes servidor en casa, esto te interesa
Llevas tiempo pagando el plan de Google Fotos —o acumulando el miedo a que un día te avisen de que tu cuota se ha agotado— mientras tienes un servidor Proxmox en casa que pasa el 80 % del tiempo sin sudar. Ya has virtualizado cosas, ya sabes lo que es un compose.yml, ya tienes disco de sobra. La pieza que falta es saber exactamente cómo montar el stack de Immich sin que se te quede a medias por culpa de los permisos de volumen o de un contenedor que no levanta.
Immich no es magia ni está terminado al 100 %; el propio proyecto lo dice sin rodeos. Pero sí funciona como servicio diario real: backup automático desde el móvil, reconocimiento de caras, búsqueda por texto, soporte RAW. Lo que encontrarás aquí es la instalación paso a paso con los problemas reales que aparecen, no la versión de marketing de «dos comandos y ya está».
Si tienes Proxmox y quieres saber si desplegarlo en LXC o en VM, qué poner en el .env para que los volúmenes no den guerra y cómo dejarlo funcionando con las apps del móvil, estás en el sitio correcto.
Por qué importa
Stack Docker oficial
Immich se despliega con Docker Compose; cinco contenedores (server, microservices, ML, Postgres, Redis) listos con un compose pull.
ML sin configurar
Reconocimiento facial, detección de objetos y búsqueda semántica por texto funcionan desde el primer arranque, sin instalar nada extra.
RAW y vídeo soportados
Además de JPEG, HEIC y PNG, ingesta RAW de cámara directamente. Tus originales, intactos, en volúmenes que controlas tú.
Licencia AGPL-3.0
Código abierto con garantía legal: nadie puede redistribuirlo como servicio cerrado. Sin lock-in, sin suscripción.
Qué necesitas antes de empezar
Para montar Immich en casa hay que tener claro el hardware disponible. No voy a darte una cifra de RAM sin haberlo probado en tu máquina, porque depende mucho de si activas el módulo de machine learning o lo dejas apagado. En mi caso, con un N100 y 16 GB de RAM compartida con otros contenedores, funciona cómodo con ML activo.
Lo imprescindible antes de arrancar:
- Un host con Proxmox (o cualquier Linux con Docker)
- Espacio en disco suficiente — las fotos van a volúmenes locales que controlas tú
- Docker y Docker Compose instalados en el LXC o VM
- Acceso a internet para descargar las imágenes la primera vez
LXC vs VM en Proxmox
Ambas opciones funcionan sin problemas. Yo uso un LXC Debian 12 sin privilegios con Docker dentro. La ventaja del LXC es que comparte el kernel del host, lo que simplifica el paso de dispositivos para hardware transcoding. La VM es más aislada pero añade overhead. Para la mayoría de homelabs, el LXC es suficiente.
Si quieres pasar una iGPU para transcoding de vídeo (VAAPI, QuickSync), el LXC necesita configuración adicional en /etc/pve/lxc/<id>.conf. No es imprescindible para empezar — puedes añadirlo después.
Preparar el LXC con Docker
Crea un LXC Debian 12 desde la interfaz de Proxmox. Dale al menos 2 núcleos y la memoria que tengas disponible según tus planes con el módulo ML. Dentro del contenedor, instala Docker:
apt update && apt install -y curl
curl -fsSL https://get.docker.com | sh
Docker Compose viene incluido con Docker Engine moderno como plugin. Comprueba que funciona:
docker compose version
Crea el directorio de trabajo antes de arrancar nada:
mkdir -p /opt/immich
cd /opt/immich
Un detalle que se pasa por alto: los directorios de datos deben existir antes de levantar los contenedores, o Docker los crea como root y luego tienes problemas de permisos al intentar acceder a los archivos desde fuera del contenedor. Es uno de esos pasos que se omiten en guías rápidas y luego toca depurar a mano.
Instalación con Docker Compose
Immich distribuye su docker-compose.yml y el .env de ejemplo directamente desde el repositorio oficial. Descárgalos así:
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
Editar el .env
Abre .env y ajusta al menos estas tres variables antes de levantar nada:
UPLOAD_LOCATION: ruta local donde se guardarán las fotos originalesDB_DATA_LOCATION: directorio para los datos de PostgreSQLDB_PASSWORD: cambia la contraseña por defecto, aunque sea solo para tu red local
El archivo .env también controla la versión de Immich fijada para tu instalación. El proyecto lanza versiones con frecuencia y advierte explícitamente que la API puede cambiar entre releases. Conviene fijar la versión en lugar de dejarla como latest si quieres controlar cuándo actualizas.
Levantar el stack
docker compose up -d
Este comando descarga y arranca todos los servicios del stack: immich-server, immich-microservices, immich-machine-learning, PostgreSQL con la extensión pgvecto.rs ya incluida en la imagen oficial, y Redis. La extensión pgvecto.rs es la que habilita la búsqueda vectorial; la imagen oficial de Postgres de Immich la trae precompilada, no hay nada que instalar a mano.
Comprueba que todo está corriendo:
docker compose ps
Si algún servicio aparece como restarting, lo primero es revisar los logs:
docker compose logs immich-server --tail 50
El problema más habitual en este punto son permisos incorrectos en los directorios de datos o una variable de entorno mal definida en .env.
Configuración inicial y apps móviles
Accede a http://<IP-del-LXC>:2283 desde tu red local. La primera vez te pide crear la cuenta de administrador. Rellena el formulario y ya estás dentro de la interfaz, que está bastante pulida para ser un proyecto en desarrollo activo.
Ajustes básicos de administrador
Desde el panel de administración puedes configurar usuarios adicionales, política de almacenamiento por usuario, opciones del módulo de machine learning y tareas programadas de mantenimiento de la base de datos. Si el hardware es justo, desactiva ML desde aquí — las fotos siguen subiendo y siendo accesibles, solo pierdes las funciones de búsqueda inteligente.
Conectar las apps móviles
Las apps oficiales están disponibles en App Store y Google Play. Instálalas, apunta a la URL de tu servidor y conéctate con tus credenciales. El backup automático funciona en segundo plano y sube fotos nuevas cuando el móvil está en WiFi. Puedes elegir qué álbumes sincronizar y si quieres incluir vídeos.
Un aviso práctico: si el servidor solo es accesible desde la red local, el backup no funcionará cuando estés fuera de casa. Para eso necesitas un reverse proxy (Nginx Proxy Manager, Caddy, Traefik) con un dominio propio, o un túnel como Tailscale si no quieres exponer el servidor directamente a internet.
Machine learning: búsqueda facial y semántica
El servicio immich-machine-learning es el más pesado del stack. Se encarga de tres cosas que marcan la diferencia respecto a un NAS con carpetas:
- Reconocimiento facial: agrupa fotos por persona, que luego puedes etiquetar con nombres desde la interfaz
- Detección de objetos y escenas: etiqueta automáticamente contenido como «perro», «playa» o «montaña» sin que toques nada
- Búsqueda semántica: puedes escribir «cumpleaños en el jardín» y encuentra fotos relevantes aunque no tengan esa etiqueta manual
La primera vez que sube una foto, el pipeline de ML se ejecuta en segundo plano. Si tienes una biblioteca grande de fotos acumuladas, la tarea inicial puede tardar horas. Es normal — el servidor sigue siendo usable mientras tanto.
Hardware transcoding (opcional)
Si tu CPU o GPU soporta VAAPI, QuickSync (Intel) o NVENC (NVIDIA), puedes configurar transcoding por hardware para la generación de miniaturas de vídeo. Requiere pasar el dispositivo al contenedor en el docker-compose.yml y, en el caso del LXC, ajustar los permisos del dispositivo en /etc/pve/lxc/<id>.conf. No es imprescindible para empezar; configúralo después si notas que la generación de miniaturas de vídeo va especialmente lenta.
Mantenimiento y actualizaciones
Actualizar Immich es tan sencillo como tirar del registry. Antes de hacerlo, revisa el changelog del release — el proyecto es explícito cuando hay cambios de API o migraciones que requieren atención:
docker compose pull
docker compose up -d
Las migraciones de base de datos se ejecutan automáticamente al arrancar la nueva versión. Los datos — fotos originales, miniaturas, modelos de ML y la base de datos PostgreSQL — viven en los directorios que definiste en .env. Haz backup de esos directorios regularmente; un script de rsync o restic apuntando a esas rutas es suficiente para tener una copia de seguridad funcional.
Si importas fotos desde Google Takeout, el proceso funciona razonablemente bien, pero algunos metadatos — especialmente fechas en formatos poco estándar o estructuras de álbumes complejas — pueden no migrarse perfectamente. El propio proyecto documenta las limitaciones conocidas de este proceso; revísalas antes de dar por terminada la migración para no llevarte sorpresas.
Preguntas frecuentes
Q: ¿Funciona Immich en un LXC de Proxmox o necesito VM?
A: Ambas opciones son válidas. Un LXC con Docker es más ligero y suficiente para uso doméstico; una VM dedicada da más aislamiento y facilita pasar hardware de transcoding. Si quieres usar VAAPI o QuickSync, la VM simplifica bastante el paso del dispositivo al contenedor.
Q: ¿Cuánta RAM necesita el stack completo con machine learning?
A: Depende de si tienes el módulo de ML activo. Con reconocimiento facial y búsqueda semántica corriendo, el consumo sube notablemente respecto al stack mínimo. No hay una cifra universal: varía según el hardware y la carga de fotos, así que conviene monitorizarlo en tu propio setup antes de dimensionar.
Q: ¿Qué pasa si actualizo Immich y algo se rompe?
A: El proyecto avisa explícitamente de que la API puede cambiar entre versiones, así que las actualizaciones exigen atención. Antes de cada update conviene leer las release notes y hacer backup de los volúmenes de datos y de la base de datos PostgreSQL. No es un software congelado: tiene releases frecuentes y mejoras constantes, pero también cambios que pueden afectar clientes móviles.
Q: ¿Vale la importación de Google Fotos Takeout para migrar todo?
A: La importación de takeout funciona, pero con matices: algunos metadatos pueden perderse en el proceso, especialmente títulos o descripciones editadas en Google Fotos. Las fotos y álbumes básicos migran bien en la mayoría de casos, pero no esperes una paridad perfecta con el historial de ediciones o metadatos más elaborados.
Q: ¿Por qué usa PostgreSQL y no SQLite como otras apps self-hosted?
A: Immich necesita la extensión pgvecto.rs para habilitar la búsqueda semántica por texto e imágenes similares. Esa extensión solo existe para PostgreSQL, así que no es una elección arbitraria. La imagen oficial immich-postgres ya incluye pgvecto.rs precompilada, así que no tienes que instalarla manualmente; simplemente usas esa imagen en el compose.











Deja una respuesta