4c729866aa553d1cefaa126bb6aaee1d4db37b81
All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 27s
- Agregar Dockerfile para build multi-stage con Node 20 - Configurar docker-compose.yml con Traefik y Authentik exteriorlvl2 - Crear workflow de Gitea Actions para CI/CD automático - Configurar routers público (assets) y protegido (app + APIs) - Documentar arquitectura y proceso de despliegue
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:
/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:
- Gitea Actions construye la imagen Docker
- Sube la imagen al registry:
gitea.nucleoriofrio.com/nucleo000/photo-server:latest - Actualiza el stack en producción con
docker compose
Despliegue Manual
# 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
npm install
Agregar fotos
cp /ruta/a/tus/fotos/*.jpg photos/
Iniciar servidor local
npm start
Servidor disponible en: http://localhost:3001
Detener servidor
# 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ónPORT=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
Description
Languages
JavaScript
86.9%
CSS
10.7%
HTML
1.2%
Dockerfile
1.2%