← Blog

Auto-hospeda Immich para tu biblioteca de fotos

Railyard

5 de junio de 2026 · 8 min de lectura

Sigue esto en tu propio servidor. Empieza gratis, sin tarjeta

Google Photos respalda tu biblioteca gratis hasta que deja de serlo, y en el momento en que deja de ser gratis, cada cara y cada lugar donde tomaste tus fotos también queda indexado en hardware que no controlas. Immich es una alternativa de código abierto que hace el mismo trabajo (respaldo automático desde tu teléfono, línea de tiempo, reconocimiento facial, búsqueda por objeto o lugar) como app autoalojada: una imagen principal, un worker de machine learning para las funciones de IA, Redis para tareas en segundo plano, y Postgres con una extensión vectorial para la búsqueda. Esta guía monta todo eso desde un servidor vacío, y luego muestra el atajo en un clic si prefieres no correr los contenedores tú mismo.

Al final tendrás Immich accesible en tu propio dominio por HTTPS, tu teléfono respaldando automáticamente, y un plan de respaldo para las dos cosas que realmente importan: tus fotos y la base de datos que las indexa.

Lo que necesitas

  • Un servidor con memoria de sobra. El worker de machine learning de Immich (detección de caras, búsqueda de objetos) necesita CPU y RAM reales además de la app web y la base de datos, así que un Hetzner CX33 (4 vCPU, 8 GB de RAM, 80 GB NVMe) a €8.99/mes sin IVA es un punto de partida más seguro que el nivel más pequeño; un servidor de tamaño similar en cualquier otro proveedor funciona igual.
  • Un dominio o subdominio con un registro DNS A que puedas apuntar al servidor (esta guía usa photos.example.com).
  • La app móvil de Immich (iOS o Android) una vez que el servidor esté arriba.
  • Acceso SSH y unos 20 minutos.

Paso 1: aprovisiona el servidor y apunta el DNS

Crea el servidor con Ubuntu 24.04 (o cualquier distribución reciente basada en Debian), anota su dirección IPv4 pública, y crea un registro DNS A:

photos.example.com.  A  203.0.113.20

Conéctate por SSH y actualiza el sistema:

ssh root@203.0.113.20
apt update && apt upgrade -y

Paso 2: instala Docker

curl -fsSL https://get.docker.com | sh
systemctl enable --now docker
docker --version
docker compose version

Deberías ver una versión del motor Docker y una versión de Compose v2.x, sin errores.

Paso 3: escribe el archivo de entorno

Los documentos oficiales de Immich apuntan a un par docker-compose.yml y .env mantenido en su repositorio de GitHub; esta guía usa la versión actual, Immich v3.3.5. Crea un directorio de trabajo y el archivo .env:

mkdir -p /opt/immich && cd /opt/immich
UPLOAD_LOCATION=./library
DB_DATA_LOCATION=./postgres
DB_PASSWORD=change-this-to-a-random-alnum-string
DB_USERNAME=postgres
DB_DATABASE_NAME=immich
IMMICH_VERSION=v3.3.5
TZ=America/Mexico_City

DB_PASSWORD tiene una restricción real que conviene saber antes de generarla: los documentos de Immich piden solo letras y números, sin puntuación, porque la contraseña se inserta directamente en una cadena de conexión. UPLOAD_LOCATION es donde viven de verdad cada foto y video en disco, así que trata esa ruta como el único directorio de este servidor que no te puedes dar el lujo de perder.

Paso 4: escribe el archivo Docker Compose

Esto refleja el archivo compose oficial de Immich, con Caddy agregado al frente para el HTTPS:

services:
  caddy:
    image: caddy:2
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - caddy-data:/data
      - caddy-config:/config

  immich-server:
    image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-v3.3.5}
    restart: always
    volumes:
      - ${UPLOAD_LOCATION}:/data
      - /etc/localtime:/etc/localtime:ro
    env_file:
      - .env
    depends_on:
      - redis
      - database

  immich-machine-learning:
    image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-v3.3.5}
    restart: always
    volumes:
      - model-cache:/cache
    env_file:
      - .env
    environment:
      MACHINE_LEARNING_MODEL_REVISION: v2

  redis:
    image: docker.io/valkey/valkey:9
    restart: always
    healthcheck:
      test: ["CMD-SHELL", "redis-cli ping | grep -q PONG || exit 1"]

  database:
    image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0
    restart: always
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_USER: ${DB_USERNAME}
      POSTGRES_DB: ${DB_DATABASE_NAME}
      POSTGRES_INITDB_ARGS: "--data-checksums"
    volumes:
      - ${DB_DATA_LOCATION}:/var/lib/postgresql/data
    shm_size: 128mb

volumes:
  model-cache:
  caddy-data:
  caddy-config:

La imagen de base de datos no es Postgres genérico: es la versión propia de Immich con las extensiones vectorchord y pgvecto.rs ya integradas, que es lo que hace rápida la búsqueda por cara y por objeto a gran escala. No la cambies por una imagen postgres genérica aunque las variables de entorno se vean idénticas.

Valida antes de levantar todo:

docker compose config

Paso 5: escribe el Caddyfile

photos.example.com {
    reverse_proxy immich-server:2283

    request_body {
        max_size 10GB
    }
}

El bloque request_body importa particularmente aquí: el límite de tamaño de solicitud por defecto de Caddy es cómodo para una página web pero no para un video 4K de un teléfono, así que sin subirlo, las subidas de videos grandes fallan a mitad de camino con un reinicio de conexión confuso en vez de un error claro.

Paso 6: levanta el stack

docker compose up -d
docker compose ps

Deberías ver caddy, immich-server, immich-machine-learning, redis y database listados como running. Revisa los logs del servidor la primera vez para confirmar que terminó sus propias migraciones de arranque:

docker compose logs -f immich-server

Visita https://photos.example.com; deberías llegar a la pantalla de creación de cuenta de Immich con un certificado HTTPS válido. Crea la primera cuenta, que se vuelve la administradora del servidor.

Paso 7: conecta la app móvil

Instala Immich desde el App Store o Play Store, ábrela, y escribe la URL de tu servidor (https://photos.example.com) en la pantalla de inicio de sesión, luego entra con la cuenta del paso 6. Activa el respaldo en segundo plano en los ajustes de la app. Deberías ver que tu carrete empieza a subirse, visible como un indicador de progreso en la app y como fotos nuevas apareciendo en el panel web en un minuto o dos.

Paso 8: respalda lo que de verdad importa

Dos cosas no se pueden regenerar: la base de datos Postgres (el índice: álbumes, caras, metadatos) y la carpeta library (los archivos de foto y video en sí). Respalda ambas, en un horario, fuera de este servidor:

docker compose exec -T database pg_dumpall -U postgres | gzip > /opt/immich/backups/immich-db-$(date +%F).sql.gz
tar -czf /opt/immich/backups/immich-library-$(date +%F).tar.gz -C /opt/immich library

Copia ambos archivos fuera del servidor (almacenamiento de objetos, otra máquina) con una tarea cron. Restaurar la base de datos solo con el dump basta para que la app vuelva a funcionar; restaurar la carpeta library junto con ella es lo que hace que la app restaurada muestre tus fotos de verdad otra vez.

Paso 9: actualizaciones

Cambia IMMICH_VERSION en .env a la nueva etiqueta, luego:

docker compose pull
docker compose up -d

Immich publica versiones con frecuencia, y la app móvil y el servidor están versionados juntos: si la app muestra una advertencia de incompatibilidad de versión después de actualizar, actualiza primero la app desde su tienda, en vez de intentar resolverlo en el servidor.

El atajo: hazlo con Railyard

Todo lo anterior, los cuatro contenedores, el archivo de entorno, el proxy inverso, el horario de respaldo, es lo que la plantilla de stack de Immich en Railyard configura por ti. Conecta un servidor, luego elige Immich en el catálogo de plantillas: https://app.railyard.run/deploy?stack=immich. Railyard aprovisiona los cuatro servicios juntos, conecta automáticamente las cadenas de conexión de la base de datos y de Redis, y emite el certificado HTTPS para tu dominio.

Un límite honesto que vale la pena saber: el worker de machine learning consume mucho CPU y memoria igual que en la configuración manual, así que dimensiona el servidor para eso en vez de elegir la opción más pequeña disponible, exactamente como en el paso 1. Y una peculiaridad que verás en los logs de cualquier forma: el log de arranque de Immich siempre imprime 127.0.0.1 para un servidor enlazado a 0.0.0.0, que es una sustitución de visualización propia del framework, no una señal de que algo está mal configurado.

Una vez corriendo, los respaldos de base de datos cubren el lado de Postgres en un horario; el volumen library igual merece su propia copia fuera del servidor, como en la configuración manual de arriba.

Solución de problemas

El HTTPS nunca se emite. El DNS todavía no apunta al servidor. dig +short photos.example.com debería devolver la IP del servidor; Caddy reintenta solo una vez que es correcto.

Las subidas fallan a mitad de camino, especialmente los videos. Esto casi siempre es el límite de tamaño de solicitud de Caddy, cubierto en el paso 5. Confirma que el bloque request_body está realmente en el Caddyfile activo con docker compose exec caddy caddy fmt --overwrite /etc/caddy/Caddyfile seguido de un reinicio.

El contenedor de machine learning está lento o se cae. Revisa docker stats mientras corre un respaldo. Si immich-machine-learning está atascado en 100% de CPU o el contenedor se cierra, el servidor está subdimensionado para tareas en segundo plano como el reconocimiento facial en una biblioteca grande; un CX33 alcanza para uso normal, pero el primer escaneo completo de una biblioteca existente muy grande se beneficia de más recursos.

La app móvil muestra una incompatibilidad de versión. Immich liga bastante de cerca la compatibilidad entre la app y el servidor. Actualiza la que esté atrasada, usualmente la app, desde su tienda.

La pantalla de inicio de sesión carga pero la cuenta admin no se crea. Revisa docker compose logs database buscando una migración fallida, usualmente causada por un DB_PASSWORD con un carácter fuera de A-Za-z0-9 que rompió la cadena de conexión que advierte el paso 3.

Preguntas frecuentes

¿Cuánto almacenamiento necesito en realidad? Lo que tu biblioteca de fotos y videos ocupe hoy, más margen para que crezca; Immich no comprime ni recodifica los originales por defecto, así que el volumen library crece casi al mismo ritmo que tu carrete.

¿Puede usar la misma instancia más de una persona? Sí. Crea cuentas adicionales desde el panel de administración; cada una tiene su propia biblioteca y ajustes de compartir, con cuotas de almacenamiento por usuario controladas por el admin si las quieres.

¿El worker de machine learning necesita GPU? No, corre en CPU por defecto y eso es lo que esta guía configura; la documentación de Immich cubre aceleración de hardware opcional (NVIDIA, Intel, AMD) para bibliotecas grandes, lo cual cambia más complejidad de configuración por una indexación más rápida.

¿Qué pasa si pierdo el servidor sin respaldo? Todo desaparece: las fotos y el índice. El paso 8 no es opcional para nada que de verdad extrañarías.

¿Esto realmente es gratis de correr? El software sí, el servidor no; un CX33 a unos nueve euros al mes es el costo real recurrente, sin cargo por foto ni por gigabyte encima como en algunos planes de almacenamiento en la nube.

Immich te da la mayor parte de lo que ofrece un servicio de fotos hospedado, en hardware que controlas, por el precio de un servidor pequeño en vez de una suscripción que crece con cuántas fotos tomas. La configuración aquí cabe en un archivo de entorno, un archivo compose y un proxy inverso; de ahí en adelante es la misma app en tu teléfono, respaldando de la misma forma, hacia un servidor con tu nombre en la factura en vez del de alguien más.

Por qué eligen Railyard para esto

  • Tu propia cuenta en la nube. Despliega en DigitalOcean, Hetzner, Vultr, AWS, OVHcloud, o cualquier servidor Linux por SSH, facturado directamente por tu proveedor, sin márgenes adicionales.
  • Un precio fijo por equipo. El plan Free es gratis para siempre: un servidor más un servidor de base de datos, tres apps, sin tarjeta. Pro cuesta $19 al mes por hasta cinco servidores y apps ilimitadas. Team cuesta $49 al mes con servidores ilimitados. Sin cargos por app, por despliegue, por asiento ni por gigabyte.
  • Plantillas de un clic. Despliega apps de código abierto, como bases de datos, analítica y herramientas de desarrollo, en tu propio servidor con un clic.
  • Bases de datos administradas. Postgres, MySQL y Redis, con copias de seguridad programadas y verificadas por restauración, y recuperación a un punto en el tiempo.
  • Despliegue con git push. Despliega desde GitHub, GitLab o la CLI, con HTTPS automático y lanzamientos sin tiempo de inactividad.

Sáltate la configuración del servidor

Despliega Immich desde el catálogo de plantillas en Railyard, con la base de datos y el worker de machine learning ya conectados.

Plan gratis, sin tarjeta, y 14 días de Pro para cada equipo nuevo. Un precio fijo por equipo.