feat: CRM Clinicas SaaS - MVP completo

- Auth: Login/Register con creacion de clinica
- Dashboard: KPIs reales, graficas recharts
- Pacientes: CRUD completo con busqueda
- Agenda: FullCalendar, drag-and-drop, vista recepcion
- Expediente: Notas SOAP, signos vitales, CIE-10
- Facturacion: Facturas con IVA, campos CFDI SAT
- Inventario: Productos, stock, movimientos, alertas
- Configuracion: Clinica, equipo, catalogo servicios
- Supabase self-hosted: 18 tablas con RLS multi-tenant
- Docker + Nginx para produccion

Co-Authored-By: claude-flow <ruv@ruv.net>
This commit is contained in:
Consultoria AS
2026-03-03 07:04:14 +00:00
commit 79b5d86325
1612 changed files with 109181 additions and 0 deletions

39
scripts/backup.sh Executable file
View File

@@ -0,0 +1,39 @@
#!/bin/bash
# CRM Clinicas — Daily PostgreSQL Backup Script
# Runs via cron: 0 3 * * * /root/CrmClinicas/scripts/backup.sh >> /root/CrmClinicas/backups/backup.log 2>&1
set -euo pipefail
BACKUP_DIR="/root/CrmClinicas/backups"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
KEEP_DAYS=7
mkdir -p "$BACKUP_DIR"
echo "[$(date)] Starting backup..."
# Dump PostgreSQL
docker exec docker-db-1 pg_dump \
-U supabase_admin \
-d postgres \
--format=custom \
--compress=9 \
-f /tmp/backup_${TIMESTAMP}.dump 2>&1
# Copy dump from container
docker cp docker-db-1:/tmp/backup_${TIMESTAMP}.dump \
"$BACKUP_DIR/db_${TIMESTAMP}.dump"
# Clean up temp file in container
docker exec docker-db-1 rm -f /tmp/backup_${TIMESTAMP}.dump
# Remove old backups (keep last N days)
find "$BACKUP_DIR" -name "db_*.dump" -mtime +${KEEP_DAYS} -delete 2>/dev/null || true
# Show backup size
BACKUP_SIZE=$(du -h "$BACKUP_DIR/db_${TIMESTAMP}.dump" | cut -f1)
echo "[$(date)] Backup completed: db_${TIMESTAMP}.dump (${BACKUP_SIZE})"
# Count remaining backups
BACKUP_COUNT=$(ls -1 "$BACKUP_DIR"/db_*.dump 2>/dev/null | wc -l)
echo "[$(date)] Total backups retained: ${BACKUP_COUNT}"

43
scripts/deploy.sh Executable file
View File

@@ -0,0 +1,43 @@
#!/bin/bash
# CRM Clinicas — Production Deployment Script
# Usage: ./scripts/deploy.sh
set -euo pipefail
echo "=== CRM Clinicas — Deploy ==="
# 1. Build Next.js Docker image
echo "[1/4] Building Next.js Docker image..."
docker build -t crm-clinicas-app:latest -f Dockerfile .
# 2. Ensure Supabase is running
echo "[2/4] Checking Supabase stack..."
cd docker
docker compose --env-file .env.supabase up -d
cd ..
# 3. Run migrations
echo "[3/4] Running database migrations..."
for f in supabase/migrations/*.sql; do
echo " -> $f"
cat "$f" | docker exec -i -e PGPASSWORD=CrmCl1n1c4s2026SecretPwd docker-db-1 psql -U supabase_admin -d postgres > /dev/null 2>&1 || true
done
# 4. Start/restart Next.js
echo "[4/4] Starting Next.js app..."
docker stop crm-app 2>/dev/null || true
docker rm crm-app 2>/dev/null || true
docker run -d \
--name crm-app \
--network docker_default \
-p 3000:3000 \
-e NEXT_PUBLIC_SUPABASE_URL=http://kong:8000 \
-e NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0 \
-e SUPABASE_SERVICE_ROLE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImV4cCI6MTk4MzgxMjk5Nn0.EGIM96RAZx35lJzdJsyH-qQwv8Hdp7fsn3W0YpN81IU \
crm-clinicas-app:latest
echo ""
echo "=== Deploy complete ==="
echo " App: http://localhost:3000"
echo " Studio: http://localhost:3001"
echo " API: http://localhost:8000"