Lalabase
Tickets, Doku, Zeiterfassung und Kundengespräche an einem Ort, durchsuchbar per KI. Für Softwarefirmen mit Kundenprojekten. Open Source: auf deinem eigenen Server oder in unserer Cloud in Deutschland.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
Tentare es un SaaS de gestión para estudios de Pilates. La aplicación centraliza la gestión de estudios, alumnos, clases, reservas, pagos, equipo y automatizaciones en una única plataforma. Este repositorio contiene la aplicación web de Tentare. • PostgreSQL • Authentication • Row Level Security (RLS) • Edge Functions • Cron • Stripe • Vercel • Cloudflare Turnstile • Resend • Supabase CLI • Docker / Colima para desarrollo local En macOS se puede utilizar Colima como alternativa ligera a Docker Desktop: Clona el repositorio e instala las dependencias: Nunca subas .env.local a Git.檢視完整 README ↗
Tentare es un SaaS de gestión para estudios de Pilates.
La aplicación centraliza la gestión de estudios, alumnos, clases, reservas, pagos, equipo y automatizaciones en una única plataforma.
Este repositorio contiene la aplicación web de Tentare.
Next.js
React
TypeScript
Supabase
Stripe
Vercel
Cloudflare Turnstile
Resend
Supabase CLI
Docker / Colima para desarrollo local
Para ejecutar Tentare localmente necesitas:
En macOS se puede utilizar Colima como alternativa ligera a Docker Desktop:
brew install colima docker
colima start
Comprueba que Docker está funcionando:
docker ps
Clona el repositorio e instala las dependencias:
npm install
Inicia el servidor de desarrollo:
npm run dev
La aplicación estará disponible en:
http://localhost:3000
Crea un archivo:
.env.local
Nunca subas .env.local a Git.
Las variables exactas necesarias pueden variar según el entorno.
Ejemplo para desarrollo local:
NEXT_PUBLIC_SUPABASE_URL=http://127.0.0.1:54321
NEXT_PUBLIC_SUPABASE_ANON_KEY=<LOCAL_SUPABASE_ANON_KEY>
# No configurar Turnstile en Supabase local
# NEXT_PUBLIC_TURNSTILE_SITE_KEY=<TURNSTILE_SITE_KEY>
# Opcional en local
# TURNSTILE_SECRET_KEY=<TURNSTILE_SECRET_KEY>
Las variables con prefijo:
NEXT_PUBLIC_
pueden ser utilizadas por el navegador.
Por ejemplo:
NEXT_PUBLIC_SUPABASE_URL
NEXT_PUBLIC_SUPABASE_ANON_KEY
NEXT_PUBLIC_TURNSTILE_SITE_KEY
Que una variable sea pública no significa que todas las variables de configuración sean seguras para publicar.
Nunca deben exponerse en el cliente ni almacenarse en el repositorio:
TURNSTILE_SECRET_KEY
SUPABASE_SERVICE_ROLE_KEY
STRIPE_SECRET_KEY
STRIPE_WEBHOOK_SECRET
RESEND_API_KEY
DATABASE_PASSWORD
Los valores reales deben configurarse mediante las variables de entorno del proveedor correspondiente.
El registro y el login no deben ejecutarse contra la Supabase de producción durante el desarrollo normal.
Supabase Auth puede exigir Cloudflare Turnstile a nivel de proyecto.
Cuando Supabase recibe una petición sin un token válido, puede devolver:
captcha protection: request disallowed (no captcha_token found)
Esto afecta tanto al:
La configuración recomendada es utilizar una instancia local de Supabase.
La configuración de Supabase local se encuentra en:
supabase/config.toml
En el entorno local:
La configuración utiliza:
enable_confirmations = false
y el captcha local permanece desactivado.
Asegúrate de que Docker o Colima están funcionando.
Después:
npx supabase start
Este comando inicia el stack local de Supabase y aplica las migraciones y el seed del proyecto.
Las migraciones se encuentran en:
supabase/migrations/
El seed se encuentra en:
supabase/seed.sql
Supabase mostrará en la terminal las credenciales locales necesarias.
Utiliza esas credenciales en .env.local.
Cuando se utiliza Supabase local, no configures:
NEXT_PUBLIC_TURNSTILE_SITE_KEY=...
La variable debe permanecer ausente o comentada:
# NEXT_PUBLIC_TURNSTILE_SITE_KEY=...
Esto es importante.
La Supabase local no requiere captcha, pero si la aplicación detecta NEXT_PUBLIC_TURNSTILE_SITE_KEY, puede montar el widget de Turnstile.
El formulario intentará entonces obtener un token que no corresponde al entorno local.
El resultado puede ser:
Enviando…
durante aproximadamente 30 segundos, seguido de:
No hemos podido comprobar que no eres un robot
Por tanto:
Desarrollo local + Supabase local = Turnstile desactivado en el frontend.
Tentare dispone de un mecanismo server-side para validar tokens de Cloudflare Turnstile.
La implementación se encuentra en:
lib/auth/captcha-servidor.ts
⚠️ Hoy ningún endpoint propio la usa. Su único consumidor era
/api/public/interes-lanzamiento (el formulario de lista de espera), que se
borró al abrir Tentare al público. El alta nueva (/crear-estudio) no pasa por
un endpoint propio: va directa a gotrue, que verifica el token de Turnstile a
nivel de PROYECTO en Supabase. La utilidad se conserva para el próximo endpoint
público que haga falta — pero si se pinta un captcha en un formulario nuevo,
hay que acordarse de llamarla desde el servidor, o el token será decoración
(fue exactamente el bug de #847).
Cuando se usa, el servidor valida el token con el mecanismo siteverify de Cloudflare.
La variable:
TURNSTILE_SECRET_KEY
es privada.
Nunca debe:
NEXT_PUBLIC_.En desarrollo local puede dejarse sin configurar.
Cuando no existe el secreto, el verificador local no realiza la validación externa contra Cloudflare.
Esto permite desarrollar sin depender de Turnstile.
Cuando se utiliza Turnstile en un entorno real deben existir las dos partes:
Site Key
↓
Navegador
↓
Token
↓
Servidor
↓
Secret Key
↓
Cloudflare
La Site Key puede ser pública.
La Secret Key debe permanecer privada.
Si se configura:
TURNSTILE_SECRET_KEY
pero no existe:
NEXT_PUBLIC_TURNSTILE_SITE_KEY
el navegador no podrá generar correctamente el token.
Los emails enviados durante el desarrollo no se envían a destinatarios reales.
Se interceptan mediante Mailpit.
La interfaz local de Mailpit está disponible normalmente en:
http://127.0.0.1:54324
Desde ahí se pueden consultar:
Esto permite probar los flujos de email sin enviar mensajes reales.
Puede ser necesario utilizar Supabase de producción para determinadas tareas que requieren datos reales.
Esto no es el flujo recomendado para el desarrollo diario.
Cuando se utiliza producción desde localhost, el navegador debe poder generar un token válido de Cloudflare Turnstile.
La variable debe configurarse como:
NEXT_PUBLIC_TURNSTILE_SITE_KEY=<TURNSTILE_PRODUCTION_SITE_KEY>
La Site Key es pública y puede aparecer en el bundle del navegador.
No debe confundirse con el Secret Key.
La clave de prueba de Cloudflare Turnstile no debe utilizarse cuando Supabase está configurado para validar contra el secreto real del proyecto.
Para utilizar Turnstile desde:
http://localhost:3000
es necesario añadir localhost al apartado de hostnames del widget correspondiente en Cloudflare Turnstile.
Sin esta configuración pueden aparecer errores de Turnstile o el botón de envío puede permanecer deshabilitado.
Añadir localhost al widget utilizado para producción permite que se generen tokens desde el entorno local.
Aunque Turnstile sigue realizando su desafío, no se recomienda utilizar este método como configuración habitual de desarrollo.
Siempre que sea posible, utiliza Supabase local.
Las Preview Deployments de Vercel utilizan dominios dinámicos similares a:
*.vercel.app
Cloudflare Turnstile no permite resolver este escenario simplemente utilizando un wildcard de subdominio.
Por tanto, no se recomienda utilizar el login real de producción con Turnstile para probar las previews.
Para probar las pantallas autenticadas se utiliza la suite E2E.
La suite se encuentra en:
e2e/
Los tests pueden:
Tentare utiliza PostgreSQL a través de Supabase.
Los cambios de esquema deben realizarse mediante migraciones.
Ubicación:
supabase/migrations/
Los datos iniciales para desarrollo se encuentran en:
supabase/seed.sql
Al iniciar Supabase local:
npx supabase start
se aplican las migraciones y el seed correspondientes.
La base de datos utiliza Row Level Security (RLS) para controlar el acceso a los datos.
Los cambios en tablas, políticas o permisos deben revisarse cuidadosamente.
Especialmente:
SUPABASE_SERVICE_ROLE_KEY.Tentare utiliza Supabase Auth.
El sistema de autenticación puede estar protegido mediante Cloudflare Turnstile dependiendo del entorno.
Arquitectura general:
Usuario
↓
Frontend Tentare
↓
Supabase Auth
↓
Cloudflare Turnstile
↓
Sesión autenticada
En local:
Usuario
↓
Frontend Tentare
↓
Supabase local
↓
Sesión local
El objetivo es que el desarrollo local no dependa de servicios de producción.
La estructura del proyecto sigue la arquitectura de Next.js App Router.
app/
├── page.tsx
├── api/
└── ...
lib/
├── auth/
│ └── captcha-servidor.ts
└── ...
supabase/
├── config.toml
├── migrations/
└── seed.sql
e2e/
La estructura puede evolucionar a medida que crece el proyecto.
Los flujos críticos deben probarse de forma reproducible.
Los tests E2E están ubicados en:
e2e/
La suite E2E está especialmente pensada para escenarios donde no resulta apropiado depender de:
Siempre que sea posible, los tests deben utilizar datos controlados y entornos aislados.
Algunos specs ("Modo B (bundle real)", p. ej. e2e/widget-config-params.spec.ts) montan el widget embebible sirviendo public/widget.js / public/widget-checkout.js tal cual. Esos ficheros están gitignorados y NO se generan solos: en CI los produce npm run build (que encadena build:widget), pero un checkout local nuevo, o uno donde solo cambió algo bajo components/checkout-widget o el bundle de reserva, no los tiene actualizados. Si esos tests fallan por no encontrar /widget.js o por servir una versión vieja, corre primero:
npm run build:widget
(tarda segundos, no hace falta el next build completo).
Tentare utiliza diferentes configuraciones según el entorno.
Next.js
+
Supabase local
+
PostgreSQL local
+
Mailpit
+
Turnstile desactivado
Vercel Preview
+
Configuración de Preview
+
Tests E2E
Vercel Production
+
Supabase Production
+
Cloudflare Turnstile
+
Servicios externos de producción
Cada entorno debe utilizar sus propias variables de configuración.
Instalar dependencias:
npm install
Iniciar desarrollo:
npm run dev
Iniciar Supabase local:
npx supabase start
Detener Supabase local:
npx supabase stop
Iniciar:
colima start
Detener:
colima stop
captcha protection: request disallowedSi aparece:
captcha protection: request disallowed (no captcha_token found)
comprueba:
NEXT_PUBLIC_TURNSTILE_SITE_KEY no esté configurada.NEXT_PUBLIC_SUPABASE_URL apunta a la instancia local..env.local.Si el formulario permanece aproximadamente 30 segundos en:
Enviando…
y posteriormente muestra:
No hemos podido comprobar que no eres un robot
comprueba si has configurado accidentalmente:
NEXT_PUBLIC_TURNSTILE_SITE_KEY=...
mientras utilizas Supabase local.
En Supabase local, la variable debe estar ausente o comentada.
Si necesitas trabajar contra producción desde localhost:
localhost está autorizado en Cloudflare Turnstile.No intentes solucionar el problema añadiendo:
*.vercel.app
como wildcard.
Para probar funcionalidades autenticadas utiliza:
e2e/
y los mecanismos de sesión/mock definidos por la suite de tests.
Antes de hacer commit, asegúrate de que no existen secretos en los archivos modificados.
Nunca subas:
.env
.env.local
.env.production
si contienen credenciales reales.
Tampoco subas:
SUPABASE_SERVICE_ROLE_KEY
TURNSTILE_SECRET_KEY
STRIPE_SECRET_KEY
STRIPE_WEBHOOK_SECRET
RESEND_API_KEY
DATABASE_PASSWORD
ni ninguna otra credencial privada.
Eliminarlo del archivo no es suficiente.
Si una clave privada ha sido subida alguna vez al repositorio, debe considerarse comprometida.
La acción correcta es:
Tentare se despliega en Vercel.
Las variables de entorno deben configurarse directamente en la configuración del proyecto correspondiente.
Nunca dependas de .env.local para producción.
Antes de realizar un deploy de producción:
Tentare prioriza la fiabilidad y estabilidad.
Los cambios en autenticación, base de datos, pagos, reservas o cualquier flujo crítico deben realizarse siguiendo este orden:
Producción no es un entorno de desarrollo.
Antes de subir cambios al repositorio:
[ ] No hay archivos .env con secretos
[ ] No hay API keys privadas
[ ] No hay Supabase Service Role Key
[ ] No hay Stripe Secret Keys
[ ] No hay Turnstile Secret Keys
[ ] No hay contraseñas
[ ] No hay credenciales de producción
[ ] Los tests relevantes pasan
[ ] Las migraciones están revisadas
[ ] RLS no ha sido desactivado accidentalmente
[ ] No se han introducido datos reales en seeds
Tentare es software propietario.
Todos los derechos reservados.