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
149 lines
3.7 KiB
Markdown
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
|