Apariencia
Auditoría y soporte
Herramientas para rastrear qué pasa en el sistema y atender tickets de usuarios.
Logs de aplicación
Laravel logs
Archivos en humae_backend/storage/logs/laravel-YYYY-MM-DD.log.
- Rotación diaria.
- Retención: 14 días (configurable con
LOG_DAILY_DAYS). - Niveles:
debug,info,warning,error,critical. - En prod,
LOG_LEVEL=warningpor defecto.
Qué se loguea
- Errores 500 del API con stack trace.
- Webhooks de Stripe recibidos (con su tipo y resultado).
- Logins exitosos y fallidos.
- Cambios de rol de usuarios.
- Envío de correos (éxito/fallo).
Qué NO se loguea
- Contraseñas (nunca, ni hashed).
- Números de tarjeta (Stripe nunca los envía).
- Tokens de Sanctum completos (solo hash).
Activity log (Spatie)
El paquete spatie/laravel-activitylog está instalado pero no activado.
Para activarlo en un modelo crítico (ej. CandidateProfile):
php
use Spatie\Activitylog\Traits\LogsActivity;
use Spatie\Activitylog\LogOptions;
class CandidateProfile extends Model
{
use LogsActivity;
public function getActivitylogOptions(): LogOptions
{
return LogOptions::defaults()
->logOnly(['state', 'approved_at'])
->logOnlyDirty()
->dontSubmitEmptyLogs();
}
}Plan de activación (fase 2, mencionado en SECURITY.md):
CandidateProfile— cambios de estado.Vacancy— creación, transiciones.VacancyAssignment— movimientos de stage.Payment— trazabilidad financiera.
Una vez activo, el admin consulta la tabla activity_log con filtros por modelo, usuario, acción y fecha.
Panel de soporte
URL: /admin/soporte
Tickets (Fase 2)
Formulario en el frontend (candidatos/empresas/recruiters) → crea un SupportTicket:
SupportTicket
├─ user_id
├─ subject
├─ body
├─ status (open, in_progress, resolved, closed)
├─ priority
├─ assigned_admin_id
├─ category (billing, bug, feature_request, other)
├─ created_at, resolved_atTimeline de comentarios internos + respuesta al usuario.
Buzón de contacto público
Ya implementado en el MVP: /contacto en el frontend + POST /api/v1/contact.
- Guarda en
ContactSubmission. - Envía email al admin.
- Rate limit: 5 por hora por IP.
Health checks
Endpoint: GET /api/v1/health
json
{
"success": true,
"data": {
"app": "ok",
"database": "ok",
"cache": "ok",
"queue": "ok"
}
}- Usado por uptime monitors externos (UptimeRobot, Pingdom).
- No requiere autenticación.
- Retorna 503 si algo está mal.
Alertas
Errores críticos
Si SENTRY_LARAVEL_DSN está configurado, errores error y critical se envían a Sentry automáticamente.
Webhooks fallidos
- Después de 3 reintentos fallidos de Stripe webhook, alerta al admin por email.
- El panel
/admin/webhooksmuestra historial y permite reintento manual.
Seguridad forensic
En caso de incidente:
- Revisar
storage/logs/laravel-*.logpara el rango de fechas. - Revisar
activity_log(cuando esté activo) para cambios de datos. - Revisar tabla
personal_access_tokens(Sanctum) para sesiones activas. - Revocar tokens sospechosos:
DELETE FROM personal_access_tokens WHERE id = .... - Forzar reset de password al usuario afectado.
- Documentar el incidente en
docs/adr/incident-YYYY-MM-DD.md.
Backups
- DB:
mysqldumpdiario, S3 o GCS, retención 30 días. storage/app(avatares + documentos):resticdiario a S3 externo; retención 14 días × 12 semanas × 12 meses.- Logs: NO se respaldan (son efímeros).
Siguiente
Las notificaciones que disparan todos los flujos: Sistema de notificaciones →

