Cómo funciona el sistema multi-tenant:
Ejemplo práctico:
Cada uno opera independientemente con sus propios clientes, citas, profesionales y configuraciones.
Sistema SaaS multi-tenant para gestión de reservas y turnos, segmentado en tres verticales: barberías, peluquerías y centros de estética.
git clone <repository-url>
cd Bookear
cp .env.example .env
# Editar .env con valores reales
CREATE DATABASE bookingprodb;
CREATE USER postgres WITH PASSWORD 'password123';
GRANT ALL PRIVILEGES ON DATABASE bookingprodb TO postgres;
docker-compose up --build
O ejecutar individualmente:
cd src/backend/BookingPro.API
dotnet restore
dotnet run
cd src/frontend
npm install
npm start
.do/app.yamlmaster# Instalar doctl CLI
doctl apps create --spec deploy.yaml
# En Digital Ocean App Platform
DATABASE_URL=${db.DATABASE_URL} # Auto-generada
JWT_KEY=your-production-jwt-secret-32-chars-minimum
ASPNETCORE_ENVIRONMENT=Production
REACT_APP_API_URL=/api
REACT_APP_APP_NAME=BookingPro
verticals - Configuración de verticales (barbershop, beautysalon, aesthetics)tenants - Información de inquilinosplans - Planes de suscripciónusers - Usuarios del sistemasubscriptions - Suscripciones activasservices - Servicios ofrecidosprofessionals - Profesionalescustomers - Clientesbookings - Reservas/Turnosservice_categories - Categorías de serviciosPOST /api/auth/login - Iniciar sesiónPOST /api/auth/register - Registrar usuarioPOST /api/auth/validate - Validar tokenGET /api/tenant/config - Configuración del tenantGET /api/tenant/info - Información del tenantGET /api/bookings - Listar reservasGET /api/bookings/{id} - Obtener reservaPOST /api/bookings - Crear reservaPUT /api/bookings/{id} - Actualizar reservaDELETE /api/bookings/{id} - Eliminar reservaPOST /api/admin/tenantmanagement/provision - Provisionar nuevo tenantGET /api/admin/tenantmanagement/tenants - Listar tenantsGET /api/admin/tenantmanagement/check-subdomain - Verificar disponibilidadCada vertical tiene su propia configuración:
barbershop.combeautysalon.comaesthetics.com/super-admin/loginadmin@bookingpro.comBookingPro2024! (cambiar después del primer login)/super-admin/dashboard para gestión de tenantsTenantId a nivel DbContext# Backend
cd src/backend/BookingPro.API
dotnet test
# Frontend
cd src/frontend
npm test
Bookear/
├── .do/
│ └── app.yaml # Configuración DO App Platform
├── src/
│ ├── backend/
│ │ └── BookingPro.API/
│ │ ├── Controllers/ # API Controllers
│ │ ├── Data/ # DbContexts
│ │ ├── Models/ # Entidades
│ │ ├── Services/ # Servicios de negocio
│ │ ├── DTOs/ # Data Transfer Objects
│ │ ├── Utilities/ # Helpers y middleware
│ │ └── Dockerfile.prod # Docker para producción
│ └── frontend/
│ ├── src/
│ │ ├── components/ # Componentes React
│ │ ├── pages/ # Páginas
│ │ ├── services/ # API client
│ │ ├── store/ # Redux store
│ │ ├── types/ # TypeScript types
│ │ └── contexts/ # React contexts
│ ├── Dockerfile.prod # Docker para producción
│ └── nginx.prod.conf # Nginx para producción
├── nginx/
│ └── nginx.conf # Nginx para desarrollo
├── docker-compose.yml # Desarrollo local
├── deploy.yaml # DO deployment config
└── README.md
Los logs estructurados se envían a:
DATABASE_URL en variables de entornodocker-compose down -vdocker-compose up --buildgit checkout -b feature/nueva-funcionalidad)git commit -m 'Agregar nueva funcionalidad')git push origin feature/nueva-funcionalidad)Este proyecto está bajo la Licencia MIT - ver el archivo LICENSE para detalles.
Para soporte técnico:
⚡ Desarrollado con .NET 8, React 18 y desplegado en Digital Ocean App Platform