# Photo Server Servidor Express para visualización de fotos con autenticación Authentik y despliegue automático. ## Características - 📸 Visualización de fotos con zoom y pan - 🔐 Autenticación con Authentik (RBAC) - 📦 Descarga de todas las fotos como ZIP - 🐳 Despliegue automático con Gitea Actions - 🚀 Proxy inverso con Traefik + Let's Encrypt - 🏷️ Filtros por Finca, Altura y Arucos - 📊 Información EXIF (GPS, altitud, fecha, cámara) - 🌍 Interfaz en español y alemán - ⌨️ Navegación con teclado ## Arquitectura de Producción - **Backend**: Express.js (Node 20) - **Frontend**: Vue 3 + Vanilla JS - **Autenticación**: Authentik (forward-auth) - **Proxy**: Traefik con Let's Encrypt - **CI/CD**: Gitea Actions - **Registry**: Gitea Container Registry ## Requisitos de Despliegue ### 1. Directorio de fotos en el servidor El servidor de producción debe tener las fotos en: ```bash /srv/photo-server/photos/ ``` Este directorio se monta como volumen read-only en el contenedor. ### 2. Traefik configurado - Red Docker `principal` - Entrypoint `websecure` (puerto 443) - Let's Encrypt configurado como `letsencrypt` - Middleware `authentik-forward-auth@file` ### 3. Authentik configurado - Outpost para forward-auth - Aplicación para `photos.nucleoriofrio.com` - RBAC configurado ## Despliegue Automático El despliegue es **automático** al hacer push a `main`: 1. Gitea Actions construye la imagen Docker 2. Sube la imagen al registry: `gitea.nucleoriofrio.com/nucleo000/photo-server:latest` 3. Actualiza el stack en producción con `docker compose` ### Despliegue Manual ```bash # Build docker build -t gitea.nucleoriofrio.com/nucleo000/photo-server:latest . # Push docker push gitea.nucleoriofrio.com/nucleo000/photo-server:latest # Deploy docker compose pull docker compose --project-name photo-server down docker compose --project-name photo-server up -d ``` ## Desarrollo Local ### Instalación ```bash npm install ``` ### Agregar fotos ```bash cp /ruta/a/tus/fotos/*.jpg photos/ ``` ### Iniciar servidor local ```bash npm start ``` Servidor disponible en: http://localhost:3001 ### Detener servidor ```bash # Presiona Ctrl+C en la terminal donde está corriendo # O busca y termina el proceso pkill -f "node server.js" ``` ## URLs - **Producción**: https://photos.nucleoriofrio.com (con auth) - **Local**: http://localhost:3001 (sin auth) ## Estructura del proyecto ``` photo-server/ ├── .gitea/ │ └── workflows/ │ └── build.yml # CI/CD workflow ├── public/ # Archivos estáticos │ ├── index.html # Frontend Vue │ ├── main.js # Lógica de la aplicación │ └── styles.css # Estilos ├── photos/ # Fotos (ignorado en git) ├── server.js # Servidor Express ├── Dockerfile # Build del contenedor ├── docker-compose.yml # Despliegue en producción ├── .dockerignore # Archivos excluidos del build └── package.json # Dependencias ``` ## Configuración de Traefik El `docker-compose.yml` incluye labels de Traefik para: - **Router público** (sin auth): Assets estáticos (CSS, JS, favicon) - **Router protegido** (con Authentik): - `/` → Página principal - `/api/photos` → Lista de fotos - `/api/photos/zip` → Descarga ZIP - `/photos/:name` → Fotos individuales ## Variables de Entorno - `NODE_ENV=production` → Modo de producción - `PORT=3001` → Puerto interno del servidor ## Seguridad - Todas las APIs y fotos protegidas con Authentik - Solo assets estáticos (CSS/JS) son públicos - Headers de seguridad (X-Frame-Options, X-Content-Type-Options) - Límite de body de 500MB para descargas ZIP grandes