Instalación de PhotoPrism: Gestión de Fotos con IA

PhotoPrism es una plataforma de gestión de fotos con inteligencia artificial que ofrece reconocimiento facial, clasificación automática por escenas, geoetiquetado y búsqueda semántica, todo ejecutándose en tu propio servidor. Como alternativa self-hosted a Google Photos, PhotoPrism indexa tu biblioteca sin enviar datos a terceros y soporta RAW, JPEG, HEIC y vídeo. Esta guía cubre el despliegue completo de PhotoPrism con Docker en Linux.

Requisitos Previos

  • Servidor con Ubuntu 20.04+, Debian 11+ o CentOS 8+
  • Docker y Docker Compose instalados
  • Mínimo 2 GB de RAM (4 GB recomendados para IA/ML)
  • 2+ núcleos de CPU (4+ para indexación rápida)
  • Almacenamiento para las fotos + 10% adicional para caché y miniaturas
  • El reconocimiento facial y clasificación IA requieren más recursos (GPU opcional)

Instalación con Docker Compose

# Crear estructura de directorios para PhotoPrism
mkdir -p ~/photoprism/{originals,storage,database}

# Crear el archivo docker-compose.yml
cat > ~/photoprism/docker-compose.yml << 'EOF'
version: '3.5'

services:
  photoprism:
    image: photoprism/photoprism:latest
    container_name: photoprism
    depends_on:
      - mariadb
    restart: unless-stopped
    security_opt:
      - seccomp:unconfined
      - apparmor:unconfined
    ports:
      - "2342:2342"
    environment:
      PHOTOPRISM_ADMIN_EMAIL: "[email protected]"
      PHOTOPRISM_ADMIN_PASSWORD: "contrasena-segura-admin"
      PHOTOPRISM_AUTH_MODE: "password"
      PHOTOPRISM_SITE_URL: "http://localhost:2342/"
      PHOTOPRISM_ORIGINALS_LIMIT: 5000
      PHOTOPRISM_HTTP_COMPRESSION: "gzip"
      PHOTOPRISM_LOG_LEVEL: "info"
      PHOTOPRISM_READONLY: "false"
      PHOTOPRISM_EXPERIMENTAL: "false"
      PHOTOPRISM_DISABLE_CHOWN: "false"
      PHOTOPRISM_DISABLE_WEBDAV: "false"
      PHOTOPRISM_DISABLE_SETTINGS: "false"
      PHOTOPRISM_DISABLE_TENSORFLOW: "false"
      PHOTOPRISM_DISABLE_FACES: "false"
      PHOTOPRISM_DISABLE_CLASSIFICATION: "false"
      PHOTOPRISM_DISABLE_VECTORS: "false"
      PHOTOPRISM_DISABLE_RAW: "false"
      PHOTOPRISM_RAW_PRESETS: "false"
      PHOTOPRISM_JPEG_QUALITY: 85
      PHOTOPRISM_DETECT_NSFW: "false"
      PHOTOPRISM_UPLOAD_NSFW: "true"
      PHOTOPRISM_DATABASE_DRIVER: "mysql"
      PHOTOPRISM_DATABASE_SERVER: "mariadb:3306"
      PHOTOPRISM_DATABASE_NAME: "photoprism"
      PHOTOPRISM_DATABASE_USER: "photoprism"
      PHOTOPRISM_DATABASE_PASSWORD: "frase-secreta-bd"
      PHOTOPRISM_SITE_CAPTION: "AI-Powered Photos App"
      PHOTOPRISM_SITE_DESCRIPTION: "Mi colección privada de fotos"
      PHOTOPRISM_SITE_AUTHOR: "Tu Nombre"
    working_dir: "/photoprism"
    volumes:
      - ./originals:/photoprism/originals
      - ./storage:/photoprism/storage

  mariadb:
    image: mariadb:11
    container_name: photoprism-db
    restart: unless-stopped
    security_opt:
      - seccomp:unconfined
      - apparmor:unconfined
    command: --innodb-buffer-pool-size=512M --transaction-isolation=READ-COMMITTED --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --max-connections=512 --innodb-rollback-on-timeout=OFF --innodb-lock-wait-timeout=120
    volumes:
      - ./database:/var/lib/mysql
    environment:
      MARIADB_AUTO_UPGRADE: "1"
      MARIADB_INITDB_SKIP_TZINFO: "1"
      MARIADB_DATABASE: "photoprism"
      MARIADB_USER: "photoprism"
      MARIADB_PASSWORD: "frase-secreta-bd"
      MARIADB_ROOT_PASSWORD: "frase-secreta-root"
EOF

# Iniciar los servicios
cd ~/photoprism
docker compose up -d

# Ver los logs de inicio (la primera vez tarda varios minutos)
docker compose logs -f photoprism

Configuración de Variables de Entorno

Las variables más importantes para ajustar el rendimiento:

# Editar el docker-compose.yml para ajustar la configuración

# Límite de tamaño de archivos originales (en MB)
PHOTOPRISM_ORIGINALS_LIMIT: 5000  # 5 GB por archivo

# Calidad de las miniaturas JPEG (0-100)
PHOTOPRISM_JPEG_QUALITY: 85

# Tamaño de caché de miniaturas
PHOTOPRISM_CACHE_SIZE: "2gb"

# Número de trabajadores para indexación (0 = automático)
PHOTOPRISM_WORKERS: 0

# Versiones de miniaturas a generar
PHOTOPRISM_THUMB_SIZE: 2048
PHOTOPRISM_THUMB_SIZE_UNCACHED: 7680

# Habilitar modo solo lectura (para bibliotecas compartidas)
PHOTOPRISM_READONLY: "true"

Aplicar cambios de configuración:

cd ~/photoprism
docker compose down
docker compose up -d

Importación e Indexación de la Biblioteca

# Copiar fotos al directorio de originales
rsync -av /ruta/local/fotos/ ~/photoprism/originals/

# También puedes montar un directorio externo modificando el volumen en docker-compose.yml:
# volumes:
#   - /mnt/fotos:/photoprism/originals

# Iniciar el indexado desde la CLI del contenedor
docker exec -ti photoprism photoprism index

# Indexar solo archivos nuevos (más rápido)
docker exec -ti photoprism photoprism index --cleanup

# Importar fotos desde el directorio de importación
docker exec -ti photoprism photoprism import

# Ver el estado de la indexación
docker exec -ti photoprism photoprism status

Para indexación automática al agregar nuevas fotos:

# PhotoPrism incluye vigilancia del directorio de originales
# Activar en el panel: Configuración > Biblioteca > Escaneo automático

# O forzar re-indexación desde el panel:
# Biblioteca > Indexar > Iniciar

Reconocimiento Facial y IA

PhotoPrism usa TensorFlow para clasificación automática de imágenes y reconocimiento facial:

# Verificar que el módulo TensorFlow está activo
docker exec photoprism photoprism tensorflow

# Iniciar el reconocimiento facial (proceso largo la primera vez)
docker exec -ti photoprism photoprism faces index

# El reconocimiento se puede activar desde el panel:
# Personas > Iniciar reconocimiento facial

# Ver el progreso
docker exec -ti photoprism photoprism faces stats

Para acelerar el procesamiento de IA con GPU NVIDIA:

# Agregar soporte NVIDIA al docker-compose.yml
# (requiere nvidia-container-toolkit instalado en el host)

# En el servicio photoprism, agregar:
# deploy:
#   resources:
#     reservations:
#       devices:
#         - capabilities: [gpu]

# Verificar uso de GPU durante indexación
nvidia-smi dmon

Geoetiquetado

PhotoPrism puede mostrar las fotos en un mapa según sus coordenadas GPS:

# Las fotos con datos GPS en el EXIF se muestran automáticamente en el mapa
# Para ver el mapa: Lugares (en el menú lateral)

# Buscar fotos por ubicación desde la búsqueda:
# Buscar: "type:photo city:Madrid"
# O por coordenadas: "lat:40.41 lng:-3.70"

# Para fotos sin GPS, PhotoPrism puede estimar la ubicación
# basándose en la fecha y el dispositivo (si está configurado)

Compartir y Álbumes

# Compartir álbumes via URL pública (sin requerir autenticación)
# Panel: Álbumes > Seleccionar álbum > Compartir > Crear enlace

# Los enlaces de compartir pueden tener:
# - Contraseña opcional
# - Fecha de expiración
# - Visualización o descarga habilitada

# Crear álbumes desde la línea de comandos
docker exec -ti photoprism photoprism albums create "Vacaciones 2024"

# Ver álbumes existentes
docker exec -ti photoprism photoprism albums ls

Configuración de Almacenamiento

# Montar almacenamiento NFS para la biblioteca de fotos
sudo apt install -y nfs-common

# Agregar al /etc/fstab
echo "servidor-nfs:/fotos /mnt/fotos nfs defaults,_netdev 0 0" | sudo tee -a /etc/fstab
sudo mount -a

# Actualizar el volumen en docker-compose.yml
# - /mnt/fotos:/photoprism/originals:ro  # :ro = solo lectura

# Para almacenamiento WebDAV (Nextcloud, etc.)
# PhotoPrism soporta WebDAV como fuente de originales

# Verificar el espacio disponible
df -h ~/photoprism/originals/
docker exec photoprism du -sh /photoprism/originals /photoprism/storage

Proxy Inverso con Nginx

# Obtener certificado SSL
sudo certbot --nginx -d fotos.tu-dominio.com

# Configuración de Nginx para PhotoPrism
sudo tee /etc/nginx/sites-available/photoprism << 'EOF'
server {
    listen 443 ssl http2;
    server_name fotos.tu-dominio.com;

    ssl_certificate /etc/letsencrypt/live/fotos.tu-dominio.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/fotos.tu-dominio.com/privkey.pem;

    # Aumentar el tamaño máximo para subida de fotos y vídeos
    client_max_body_size 500M;

    location / {
        proxy_pass http://127.0.0.1:2342;
        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 https;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        # Para streaming de vídeo
        proxy_buffering off;
        proxy_read_timeout 600s;
    }
}
EOF

# Actualizar PHOTOPRISM_SITE_URL en docker-compose.yml
# PHOTOPRISM_SITE_URL: "https://fotos.tu-dominio.com/"
# Y PHOTOPRISM_TRUSTED_PROXY: "172.0.0.0/8"  # Rango de Docker

sudo ln -s /etc/nginx/sites-available/photoprism /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

docker compose down && docker compose up -d

Solución de Problemas

PhotoPrism no inicia o falla:

# Ver logs detallados
docker compose logs photoprism --tail 50

# Comprobar la base de datos
docker compose logs mariadb --tail 20

# Verificar que la base de datos está accesible
docker exec -it photoprism-db mariadb -u photoprism -p photoprism -e "SELECT VERSION();"

La indexación se detiene o es muy lenta:

# Ver progreso de la indexación
docker exec photoprism photoprism index status

# Verificar uso de recursos
docker stats photoprism

# Reducir workers si el servidor está sobrecargado
# PHOTOPRISM_WORKERS: 2  # Reducir de automático a 2 workers

Problemas de permisos en los archivos:

# Verificar los permisos del directorio de originales
ls -la ~/photoprism/originals/

# Corregir permisos (UID 1000 es el usuario por defecto de PhotoPrism)
sudo chown -R 1000:1000 ~/photoprism/originals ~/photoprism/storage

# Si usas un UID diferente, configurar en docker-compose.yml:
# user: "UID:GID"

Conclusión

PhotoPrism ofrece una experiencia de gestión fotográfica comparable a Google Photos, pero con el control total que ofrece el autoalojamiento. Su integración con IA para clasificación y reconocimiento facial, combinada con el geoetiquetado automático, lo convierte en una solución completa para preservar y organizar colecciones fotográficas personales o familiares de forma privada en tu propio servidor.