Skip to content

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=warning por 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_at

Timeline 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/webhooks muestra historial y permite reintento manual.

Seguridad forensic

En caso de incidente:

  1. Revisar storage/logs/laravel-*.log para el rango de fechas.
  2. Revisar activity_log (cuando esté activo) para cambios de datos.
  3. Revisar tabla personal_access_tokens (Sanctum) para sesiones activas.
  4. Revocar tokens sospechosos: DELETE FROM personal_access_tokens WHERE id = ....
  5. Forzar reset de password al usuario afectado.
  6. Documentar el incidente en docs/adr/incident-YYYY-MM-DD.md.

Backups

  • DB: mysqldump diario, S3 o GCS, retención 30 días.
  • storage/app (avatares + documentos): restic diario 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 →

Manual de usuario HUMAE · Uso interno