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.


