Sistema de préstamos LabRe UABC — implementación inicial

Sistema web para gestión de préstamos de material del Laboratorio de
Sistemas Computacionales de la UABC.

- Backend: Supabase self-hosted, schema aislado `prestamos` con RLS,
  triggers de stock y audit log (supabase/migrations/0001_init.sql).
- Auth: Google OAuth restringido a @uabc.edu.mx, verificado en
  middleware y como segunda línea en trigger de DB.
- Frontend: Astro 7 (SSR con adapter Node) + React islands + Tailwind
  v4 con paleta UABC (primary #00723F, secondary #DD971A) bajo regla
  60/30/10.
- Interfaz alumno mobile-first: catálogo con filtro por categorías,
  solicitud de préstamos, historial personal.
- Interfaz admin desktop-first: panel con KPIs, bandeja de solicitudes
  (aprobar/rechazar/devolver), CRUD de inventario y categorías,
  reportes filtrables con export CSV nativo.
- Modales con `<dialog>` nativo, cero librerías de UI adicionales.
- Deploy: Dockerfile multi-stage node:22-alpine + docker-compose para
  publicar bajo prestamos.buglabs.dev vía Cloudflare Tunnel.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-08-14 19:37:49 -07:00
parent 6bbd6d3a6b
commit 1121ab7199
58 changed files with 6281 additions and 252 deletions
+82
View File
@@ -0,0 +1,82 @@
# Despliegue LabRe web (buglabs)
App Astro SSR (Node adapter) empaquetada como contenedor. Corre en el mismo host que Supabase self-hosted; Cloudflare Tunnel la publica en `prestamos.buglabs.dev`.
## Primer despliegue
```bash
# 1. Subir código al server (git clone o rsync) a ~/labre-web/
git clone <repo> ~/labre-web && cd ~/labre-web
# 2. Crear .env.production a partir del ejemplo y rellenar secretos
cp .env.production.example .env.production
$EDITOR .env.production # PUBLIC_SUPABASE_ANON_KEY, SUPABASE_SERVICE_ROLE_KEY
# 3. Build + up (compose construye la imagen local)
docker compose up -d --build
# 4. Añadir hostname al Cloudflare Tunnel
# Editar /etc/cloudflared/config.yml (root) e insertar ANTES del catch-all
# "service: http_status:404":
#
# - hostname: prestamos.buglabs.dev
# service: http://localhost:8082
#
sudo systemctl restart cloudflared
# 5. En dashboard Cloudflare: crear CNAME
# prestamos → <TUNNEL_ID>.cfargotunnel.com (proxied)
# 6. Auth OAuth (Google):
# - En Supabase Studio > Auth > URL Config:
# Site URL = https://prestamos.buglabs.dev
# Redirect URLs += https://prestamos.buglabs.dev/api/auth/callback
# - En Google Cloud Console (mismo project del CLIENT_ID Supabase):
# confirmar https://supabase.buglabs.dev/auth/v1/callback ya existe
# (no hace falta añadir el dominio de la app, Google redirige a Supabase)
# 7. Verificar
docker compose ps
docker compose logs -f --tail=50 labre-web
curl -sI https://prestamos.buglabs.dev/login # esperado: 200
```
## Actualizaciones
```bash
cd ~/labre-web
git pull
docker compose up -d --build
docker image prune -f
```
`restart: unless-stopped` reinicia el contenedor si crashea o si el host reboota.
## Rollback
Compose no versiona imágenes por sí solo. Dos opciones:
**A) Volver al commit anterior (más simple):**
```bash
cd ~/labre-web
git log --oneline -n 10
git checkout <sha-bueno>
docker compose up -d --build
```
**B) Etiquetar imágenes manualmente antes de cada deploy:**
```bash
# Antes de subir cambios:
docker tag labre-web-labre-web:latest labre-web:$(date +%Y%m%d-%H%M)
docker images labre-web
# Para volver:
# editar docker-compose.yml -> image: labre-web:<tag> (quitar 'build: .')
docker compose up -d
```
## Troubleshooting
- **502 en el subdominio**: Tunnel no encuentra el puerto. `curl -I http://127.0.0.1:8082/login` en el host; revisar `cloudflared` logs (`journalctl -u cloudflared -f`).
- **Contenedor en `unhealthy`**: `docker compose logs labre-web`. Suele ser env var faltante (`SUPABASE_SERVICE_ROLE_KEY`) o Supabase caído.
- **Callback OAuth falla**: verificar Site URL en Supabase y que `PUBLIC_APP_URL` coincida exactamente (con https, sin barra final).