Sistema SaaS Multi-Tenant de Reservas Odontológicas
# 1. Inicializar backend de Terraform
cd terraform
./scripts/init-backend.sh
# 2. Deploy ambiente dev
cd environments/dev
terraform init
terraform plan
terraform apply
# 3. Build y deploy lambdas
cd ../../../backend
cargo lambda build --arm64 --release
cp target/lambda/*/bootstrap.zip ../terraform/environments/dev/lambda-assets/
cd ../terraform/environments/dev
terraform apply
# 4. Deploy frontend
cd ../../../frontend
npm run build
BUCKET=$(terraform -chdir=../../terraform/environments/dev output -raw frontend_bucket_name)
aws s3 sync build/ "s3://${BUCKET}/"
# Frontend
cd frontend
npm run dev
# http://localhost:5173
# Backend (tests)
cd backend
cargo test --workspace
Estado: ✅ OPERATIVO (v2.2.0)
| Workflow | Trigger | Descripción |
|---|---|---|
terraform-plan |
PR a main | Plan automático en PR |
terraform-apply-dev |
Push a main | Deploy automático en dev |
terraform-apply-qas |
Manual | Deploy controlado en qas |
terraform-apply-prd |
Manual | Deploy a producción |
backend-ci |
Cambios en backend/ | Tests + build lambdas |
frontend-ci |
Cambios en frontend/ | Tests + build Svelte |
# 1. Crear feature branch
git checkout -b feature/nueva-funcionalidad
# 2. Hacer cambios y push
git push origin feature/nueva-funcionalidad
# 3. Crear PR en GitHub
# → terraform-plan se ejecuta automáticamente
# → Comentario con plan aparece en PR
# 4. Merge a main (después de aprobación)
# → terraform-apply-dev se ejecuta automáticamente
# → Dev se actualiza en ~10 minutos
# 5. Deploy a producción (manual)
gh workflow run terraform-apply-prd.yml -f confirm=yes
Para configurar los workflows por primera vez:
Configurar Secrets de AWS
# Ver: .github/SECRETS_SETUP.md
# Configurar AWS_ROLE_TO_ASSUME en GitHub Settings
Crear Environments
dev, qas, prdPrimera Ejecución
# Test del workflow
gh workflow run terraform-plan.yml
Ver documentación completa: .github/workflows/README.md
| Capa | Tecnología |
|---|---|
| Frontend | SvelteKit 5 + TypeScript + TailwindCSS |
| Backend | Rust 1.89 + AWS Lambda |
| Database | DynamoDB (single-table) |
| Auth | Cognito User Pool + JWT |
| IaC | Terraform 1.9 |
| CI/CD | GitHub Actions |
| Monitoring | CloudWatch + X-Ray |
Language: Rust 1.89
Runtime: AWS Lambda AL2023 ARM64
Framework: lambda_http 0.13
Database: DynamoDB (single-table)
Architecture: 8 Lambdas serverless
Lambdas Implementados:
health - Health checkavailability - Consulta disponibilidadtenants - CRUD tenantstreatments - CRUD tratamientosprofessionals - CRUD profesionalesbookings - CRUD completo + reprogramaciónsend-notification - Emails con templates HTMLschedule-reminder - EventBridge SchedulerFramework: SvelteKit 5 (Runes)
Language: TypeScript 5.6
Build Tool: Vite 7
Styling: TailwindCSS (inline)
Calendar: FullCalendar
PWA: vite-plugin-pwa
Páginas:
/ - Home con navegación/booking - Wizard 3 pasos/my-appointments - Portal paciente/admin - Panel admin/calendar - Calendario FullCalendar ⭐/auth/callback - OAuth callbackIaC: Terraform 1.9
Módulos: 9 módulos reutilizables
Ambientes: dev, qas, prd
Region: us-east-1
Módulos Terraform:
iam - Roles y políticasdynamodb - Tabla con GSIscognito - User Pool + Clientlambda - Funciones genéricasapi-gateway - HTTP API + JWT Authorizers3-cloudfront - Frontend hostingwaf - Protección DDoScloudwatch - Dashboard + Alarmasses - Email sending// Transacción atómica garantizada
TransactWriteItems [
Put(slot) + ConditionExpression("attribute_not_exists(PK)"),
Put(booking)
]
Templates HTML:
booking-confirmation.html - Confirmación de citabooking-reminder.html - Recordatorio T-24h y T-2hbooking-cancelled.html - CancelaciónCaracterísticas:
| Ambiente | URL | Estado |
|---|---|---|
| Dev | https://dev.turnaki.nexioq.com | ✅ Activo |
| QAS | https://qas.turnaki.nexioq.com | 🚧 Configurado |
| PRD | https://turnaki.nexioq.com | ⏸️ Pendiente |
GET /health → Health check
# Bookings
GET /bookings?tenant_id=... → Listar citas
POST /bookings → Crear cita
DELETE /bookings/{id} → Cancelar cita
PUT /bookings/{id} → Reprogramar cita
# Availability
POST /booking/availability → Consultar disponibilidad
# Tenants
GET /tenants?... → Listar clínicas
POST /tenants → Crear clínica
GET /tenants/{id} → Obtener clínica
# Treatments
GET /treatments?tenant_id=... → Listar tratamientos
POST /treatments → Crear tratamiento
# Professionals
GET /professionals?tenant_id=... → Listar profesionales
POST /professionals → Crear profesional
cd backend
cargo test --workspace
# 8 tests, 100% passing, 70% coverage
cd frontend
npm run test # Unit tests (Vitest)
npm run test:e2e # E2E tests (Playwright)
# 6 unit tests, 12 E2E scenarios, 85% passing
Ver docs/TESTING.md para más detalles.
tk-nq-api-metrics.github/SECRETS_SETUP.md)Ver docs/ROADMAP.md para el plan completo de mejoras.
# Fork el repo
git clone <your-fork>
# Crear rama
git checkout -b feature/nueva-funcionalidad
# Commits
git commit -m "feat: agregar nueva funcionalidad"
# Push
git push origin feature/nueva-funcionalidad
# Crear PR
MIT License - Ver LICENSE para detalles
| Métrica | Valor |
|---|---|
| Sistema funcional | 100% ✅ |
| Infraestructura | Terraform (3 ambientes) |
| CI/CD | GitHub Actions (5 workflows) |
| Lambdas | 8/8 (100%) |
| Endpoints | 11/20 (55%) |
| Tests passing | 85% |
| Módulos Terraform | 9/9 (100%) |
Construido con:
Desarrollado por: Equipo Turnaki-NexioQ
Última actualización: 6 de Octubre de 2025
Versión: 2.0.0 (Terraform)
Estado: Production Ready 🚀