1121ab7199
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>
83 lines
2.7 KiB
Markdown
83 lines
2.7 KiB
Markdown
# 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).
|