Files
photo-server/README.md
josedario87 4c729866aa
All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 27s
Configurar despliegue con Docker, Traefik y Authentik
- 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
2025-10-27 12:00:05 -06:00

149 lines
3.7 KiB
Markdown

# 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