Files
labre-web/deploy/README.md
T
LakG 1121ab7199 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>
2026-08-14 19:37:49 -07:00

2.7 KiB

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

# 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

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):

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:

# 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).