Immich en Proxmox: La Guía Definitiva para Separar Computación y Almacenamiento (NFS)

Por Jose FYS

Si eres como yo, tu homelab no para de crecer. Empiezas con un servidor, luego otro, y de repente te encuentras con el dilema clásico: ¿Dónde pongo los datos y dónde ejecuto las aplicaciones?

En mi caso, tengo un escenario bastante común pero que puede dar dolores de cabeza si no se planifica bien:

  • Servidor A (Storage): Un Proxmox con un DATA-pool de varios TB donde quiero que vivan mis fotos.
  • Servidor B (Compute): Otro Proxmox donde corre Immich en un contenedor LXC (instalado con los scripts maravillosos de ProxmoxVE Community Scripts).

La misión es clara: Immich (en B) tiene que leer y escribir sus datos en el Servidor A. Y como no tengo un cluster con Ceph (aún), la solución más robusta y estándar es NFS.

Pero ojo, que aquí entra en juego el “villano” de esta historia: los contenedores LXC Unprivileged y sus mapeos de usuarios. Si alguna vez te has peleado con un “Permission denied” en Proxmox, sabes de lo que hablo.

Vamos a resolverlo paso a paso.

El Esquema de la Solución

Para que no te pierdas, esto es lo que vamos a construir:

  1. Servidor A: Exporta /DATA-pool/Immich por NFSv4.
  2. Servidor B (Host): Monta ese NFS en /mnt/immich_nfs.
  3. LXC Immich: Recibe ese montaje en /mnt/immich (o /photos) usando “bind mounts”.
  4. Immich: Escribe felizmente en esa ruta, creyendo que es local.

Diagrama de arquitectura: Immich en Proxmox con almacenamiento NFS separado


Paso 1: Configurar el Servidor A (El Almacén)

Primero, necesitamos que nuestro servidor con los discos comparta la carpeta.

1.1 Instalar el servidor NFS

Entra por SSH a tu Servidor A e instala lo necesario:

apt update
apt install -y nfs-kernel-server
systemctl enable --now nfs-server

1.2 Crear la carpeta

Si no la tienes ya, crea el directorio donde vivirán tus recuerdos:

mkdir -p /DATA-pool/Immich

1.3 Exportar con NFS

Aquí es donde definimos quién puede entrar. Editamos /etc/exports:

nano /etc/exports

Añadimos la siguiente línea. Truco: Restringe el acceso a la IP del Servidor B por seguridad.

/DATA-pool/Immich  IP_DEL_HOST_B(rw,sync,no_subtree_check,root_squash)

Aplicamos los cambios para que el sistema se entere:

exportfs -ra
exportfs -v

1.4 Firewall (No te olvides de esto)

Si tienes el firewall de Proxmox activado, asegúrate de permitir el tráfico TCP por el puerto 2049 desde la IP del Servidor B. Si no, te volverás loco pensando que es un problema de NFS cuando es un simple bloqueo de red.


Paso 2: Configurar el Servidor B (El Host de Proxmox)

Ahora nos vamos al servidor donde corre el contenedor de Immich. Ojo, estamos en el host Proxmox, no dentro del LXC todavía.

2.1 Instalar el cliente NFS

apt update
apt install -y nfs-common

2.2 Montaje de prueba

Vamos a ver si conecta. Creamos el punto de montaje y probamos:

mkdir -p /mnt/immich_nfs
mount -t nfs -o vers=4.2 IP_DEL_HOST_A:/DATA-pool/Immich /mnt/immich_nfs

Prueba a escribir algo:

touch /mnt/immich_nfs/test && rm /mnt/immich_nfs/test

Si no te dio error, ¡felicidades! La conexión NFS funciona.

2.3 Hacerlo persistente

No queremos que esto se rompa si reinicias el servidor. Añadelo a /etc/fstab:

IP_DEL_HOST_A:/DATA-pool/Immich  /mnt/immich_nfs  nfs  vers=4.2,_netdev,nofail,hard,timeo=600  0  0

Y verifica que monta todo bien:

mount -a

Paso 3: Pasar el almacenamiento al LXC

Ahora tenemos los datos en el Host B, pero el contenedor de Immich no los ve. Necesitamos “pasárselos”.

Identifica el ID de tu contenedor (CTID). Digamos que es 105.

En la terminal del Host B:

pct set 105 -mp0 /mnt/immich_nfs,mp=/mnt/immich

Esto le dice a Proxmox: “Coge lo que hay en /mnt/immich_nfs del host y pónselo al contenedor 105 en /mnt/immich.

Entra al contenedor para verificar:

pct enter 105
ls -la /mnt/immich

Si ves los archivos, ya casi estamos. Solo falta el jefe final: Los Permisos.


Paso 4: La Parte “Delicada” (Privileged vs Unprivileged)

Aquí es donde la gente suele atascarse.

Si tu contenedor es Privileged, la vida es fácil. Normalmente con un chown 1000:1000 en el servidor A basta, porque el root del contenedor es el root del host.

Pero si usas un contenedor Unprivileged (que deberías, por seguridad), el usuario root dentro del contenedor NO es el root fuera. Se mapea a un UID alto (usualmente 100000). Por eso, aunque des permisos 777, a veces falla o se ve raro.

La Solución Práctica: all_squash

Para no complicarnos la vida con mapeos de subgid (que dan para otro post entero), la forma más sencilla de que esto funcione en un homelab es decirle al servidor NFS que trate a todos los invitados como un usuario específico.

En el Servidor A, volvemos a editar /etc/exports. Vamos a usar all_squash y mapear todo al usuario anónimo (o a uno específico que controlemos).

Si quieres que dentro del LXC se pueda escribir sin problemas (que suele verlo como root o usuario 1000), un truco es mapear al UID que Proxmox usa para sus contenedores unprivileged (100000) o simplemente forzar un usuario común.

Pero para simplificar al máximo y evitar errores de “permission denied” en un entorno controlado, podemos usar esta configuración en el exports del Servidor A:

/DATA-pool/Immich  IP_DEL_HOST_B(rw,sync,no_subtree_check,all_squash,anonuid=100000,anongid=100000)

Nota: El UID 100000 es el que Proxmox suele asignar al root dentro de un contenedor unprivileged. Al hacer esto, cuando Immich escriba como “root” dentro del LXC, el Servidor A verá esos archivos como propiedad del usuario 100000, cerrando el círculo de confianza.

Aplica los cambios en A:

exportfs -ra

IMPORTANTE: Ajustar el dueño de la carpeta

Para que el mapeo funcione, la carpeta en el Servidor A debe pertenecer al usuario 100000 (o al que hayas definido en anonuid). Si la creó root, Immich no podrá escribir aunque el NFS le deje pasar.

Ejecuta esto en el Servidor A:

chown 100000:100000 /DATA-pool/Immich
chmod 770 /DATA-pool/Immich

Opción B: Convertir a Privileged

Si esto te da muchos dolores de cabeza y prefieres estabilidad sobre el aislamiento estricto, puedes hacer backup de tu LXC, restaurarlo y marcar la casilla “Privileged”. Ahí los permisos funcionan como en un Linux normal: chown 1000:1000 en el origen y listo.


Recomendación Final para Immich

Un detalle importante: usa el NFS solo para las fotos y vídeos (la “Library” y “Uploads”).

La base de datos de Immich (Postgres) debería vivir en el disco local del Servidor B (o en el disco virtual del LXC). Las bases de datos sobre NFS pueden ser lentas y propensas a corrupción si la red flaquea.

Recordatorio de Seguridad: Mover los datos a un NAS o servidor dedicado (Servidor A) no significa que estén seguros. ¡Un RAID no es un backup! Asegúrate de tener una estrategia 3-2-1 para tus fotos, copiándolas a otra ubicación o nube.

Resumen del Checklist de Éxito

Si algo falla, revisa esto:

  1. En B (Host): mount | grep immich_nfs ¿Está montado?
  2. En A: exportfs -v ¿Está exportada la IP correcta?
  3. Puertos: telnet IP_A 2049 desde B. ¿Llega?
  4. Permisos: Si ves los archivos pero no puedes escribir, revisa el mapeo de UIDs en el /etc/exports (all_squash).

¡Y listo! Ya tienes tu Immich separado en dos máquinas, escalando almacenamiento barato en A y usando la potencia de CPU/GPU en B.


Perfecto. Con esto ya tendrás tu instancia de Immich corriendo sobre Proxmox con almacenamiento NFS, combinando lo mejor de los dos mundos: potencia de cómputo y capacidad de almacenamiento. Rápido, robusto y escalable.

Y como siempre me gusta decir: Si este post te ha ayudado, compártelo con otros administradores que puedan beneficiarse. Y sígueme para más experiencias reales desde las trincheras del homelab.