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

3.7 KiB

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:

  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

# 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

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