Saltar a contenido

IRIS Chat

Descripción

IRIS Chat es el servicio backend de mensajería rápida de IRIS. Expone una API REST Laravel para gestionar conversaciones por línea, mensajes, estados de lectura, cierre de conversaciones y notificaciones hacia IRIS API cuando se producen eventos relevantes.

La aplicación está desplegada en Kubernetes (EKS) en AWS, región eu-south-2. Usa PHP-FPM detrás de Nginx, Redis para colas/caché/sesiones, MySQL en RDS/Aurora para persistencia y S3 para almacenamiento de imágenes del chat.

Arquitectura

graph TB
    Frontend[IRIS Frontend] -->|REST| ALB[Application Load Balancer]
    ALB --> Nginx[Nginx]

    subgraph Pod["Pod Chat (EKS)"]
        Nginx -->|FastCGI :9000| PHP[PHP-FPM / Laravel 11]
    end

    PHP --> MySQL[(RDS / Aurora MySQL)]
    PHP --> Redis[(ElastiCache Redis)]
    PHP --> S3[(S3 Bucket)]
    PHP -->|Notificaciones| IrisApi[IRIS API]

    Redis -->|Encolado| Worker[Worker default]
    Worker --> IrisApi
    Worker --> MySQL

    style Pod fill:#f5f5f5,stroke:#333

Componentes

Componente Servicio AWS/K8s Función
Load Balancer ALB Entrada HTTPS pública
Aplicación EKS pods Nginx + PHP-FPM API Laravel de mensajería
Worker EKS Deployment Procesamiento asíncrono de jobs Redis
Base de datos RDS/Aurora MySQL Persistencia de conversaciones y mensajes
Caché, sesiones y colas ElastiCache Redis Sesiones, cache y queue backend
Almacenamiento S3 Imágenes adjuntas del chat
Secretos Secrets Manager + ESO Credenciales Laravel, BBDD y mail
Logs CloudWatch Logs Logs de contenedor vía Fluent Bit

Entornos

Entorno URL Namespace Cuenta AWS GitOps
Producción iris-chat.htg-express.com infra-iris-chat-pro 200702211100 pro/values.yaml
Test chat-test.htg-express.com infra-iris-chat-test 913305982008 test/values.yaml
Dev chat-dev-li.htg-express.com infra-iris-chat-dev 913305982008 dev/values.yaml

La cuenta 913305982008 agrupa los entornos no productivos; producción vive aislada en 200702211100.

Repositorios

Tipo Proyecto Bitbucket Repositorio Responsabilidad
Código IRIS htgexpress/iris-chat Código Laravel, Dockerfile y pipeline
Helm chart IRIS | Helm charts htgexpress/helm-iris-php Chart PHP/Nginx reutilizado
GitOps IRIS | GitOps htgexpress/infra-iris-chat Valores Helm por entorno

Estructura del repositorio GitOps

infra-iris-chat/
├── dev/
│   └── values.yaml
├── test/
│   └── values.yaml
└── pro/
    └── values.yaml

API

La API se expone bajo el prefijo:

/api/quick_messaging/providers

Principales grupos funcionales:

Grupo Endpoints Función
Conversaciones por línea line/{line_id}/conversations... Lista, crea y consulta conversaciones asociadas a una línea
Estados conversations/bystate... Consulta conversaciones por estado
Mensajes line/{line_id}/conversations/{conversation_id}/messages Lista y crea mensajes
Lectura messages/{message_id}/readed / unreaded Marca mensajes como leídos o no leídos
Acciones close, available_messages, response_loaded_message Cierre y acciones auxiliares de conversación
Resumen global conversations/summary Vista agregada de conversaciones

Los jobs ProcessNotifyNewMessage, ProcessNotifyNewMessageWithFoto y ProcessNotifyChatClosedConversation notifican eventos a IRIS API usando HTG_API.

Helm chart

IRIS Chat usa el chart PHP de IRIS, el mismo patrón operativo de IRIS API: deployment principal con Nginx + PHP-FPM, ConfigMaps para configuración PHP/Nginx, External Secrets para credenciales, workers y soporte opcional para métricas PHP-FPM.

CI/CD

Automático (rama develop)

  1. Calcula IMAGE_TAG con el SHA corto del commit.
  2. Construye la imagen con Dockerfile.
  3. Publica la imagen en ECR.
  4. Actualiza dev/values.yaml en infra-iris-chat.
  5. ArgoCD sincroniza el namespace de desarrollo.

Manual

El pipeline manual-deploy permite desplegar una referencia Git a dev, test o pro.

Variable Descripción Valores
GIT_REF Commit SHA, tag o rama current, SHA, tag, rama
ENVIRONMENT Entorno destino dev, test, pro

Antes de construir, el pipeline comprueba si la imagen ya existe en ECR para evitar builds innecesarios.

Imágenes Docker

graph LR
    Composer[composer:2.9.5] --> Vendor[composer install --no-dev]
    Base[iris/base/php:8.3.29-fpm] --> App[iris/chat:<tag>]
    Vendor --> App
    App --> Pod[Pod en EKS]
Campo Valor
Repositorio ECR 203965864736.dkr.ecr.eu-west-1.amazonaws.com/iris/chat
Dockerfile Dockerfile
Imagen base iris/base/php:8.3.29-fpm
Composer composer:2.9.5
Usuario runtime laravel
Puerto aplicación 9000 (PHP-FPM)
Imagen Nginx nginx:1.28.0

La imagen de aplicación contiene el código Laravel y vendor/; Nginx se despliega como contenedor separado dentro del pod.

Despliegue (GitOps)

ArgoCD

Cada entorno tiene una Application de ArgoCD que apunta al chart Helm y al values.yaml correspondiente del repo GitOps. El flujo es el mismo que en IRIS API:

  1. El pipeline actualiza el image.tag en el values.yaml del entorno.
  2. ArgoCD detecta el cambio y renderiza el chart con los nuevos valores.
  3. ArgoCD aplica los cambios al cluster (rolling update).

IRIS Chat no tiene Job de migraciones como hook PostSync; las migraciones se ejecutan manualmente cuando son necesarias.

Configuración

Variables de entorno

Las variables no sensibles se inyectan con el ConfigMap common. Las más relevantes son:

Categoría Variables Descripción
Aplicación APP_DOMAIN, APP_NAME, APP_ENV, APP_DEBUG Identidad y modo Laravel
Integración IRIS API HTG_API URL base usada para notificaciones
Base de datos DB_HOST, DB_DATABASE, DB_PORT Conexión MySQL
Redis REDIS_HOST, REDIS_DB, REDIS_CACHE_DB, REDIS_QUEUE Cache, sesiones y colas
S3 AWS_BUCKET, AWS_DEFAULT_REGION, URL_IMG_CHAT Imágenes del chat
Queue QUEUE_CONNECTION, QUEUE_FAILED_DRIVER Procesamiento asíncrono
Sesiones SESSION_DRIVER, SESSION_LIFETIME, SESSION_SAME_SITE Sesiones Laravel

Secretos

External Secrets Operator sincroniza credenciales desde AWS Secrets Manager.

Entorno Clave en Secrets Manager IAM Role
Dev infraIrisChat/dev InfraIrisChatDev
Test infraIrisChat/test InfraIrisChatTest
Pro infraIrisChat/pro InfraIrisChatPro

Secretos sincronizados: APP_KEY, DB_USERNAME, DB_PASSWORD, MAIL_USERNAME y MAIL_PASSWORD.

Configuración por entorno

Parámetro Dev Test Pro
URL API chat-dev-li.htg-express.com chat-test.htg-express.com iris-chat.htg-express.com
Base de datos iris_chat_dev iris_chat_test iris_chat_pro
Bucket S3 iris-chat-dev iris-chat-test iris-chat-pro
Redis DB 10 13 13
Redis cache DB 11 12 12
Réplicas app 1 1 1
Worker default 1 1 1

Recursos Kubernetes

Aplicación

Contenedor Imagen Función
nginx nginx:1.28.0 Servidor HTTP y proxy FastCGI
app iris/chat:<tag> Aplicación Laravel sobre PHP-FPM

Recursos asociados:

Recurso Detalle
Service ClusterIP puerto 80
Ingress ALB internet-facing con TLS
ConfigMaps common, nginx, php, php-fpm
ExternalSecret common
SecretStore AWS Secrets Manager vía IRSA
ServiceAccount IRSA para Secrets Manager
ECR pull secret IRSA para ECR compartido

Workers

Cada entorno despliega un worker default:

php artisan queue:work --name=queue --queue=default --sleep=5 --tries=1 --timeout=300 --max-jobs=200

No hay KEDA activo para IRIS Chat; el worker usa una réplica fija.

Tareas programadas

Recurso Nombre lógico Descripción
CronJob run-commands Comandos ad-hoc; suspendido por defecto, se activa manualmente cuando se necesita

Exposición externa

Parámetro Valor
IngressClass alb
Esquema internet-facing
Target type IP
Política TLS ELBSecurityPolicy-TLS13-1-2-2021-06
Redirección HTTP→HTTPS Habilitada
Health check /

Operaciones

Health checks

El ALB comprueba /. Dentro del pod, las probes Kubernetes validan el puerto 9000 de PHP-FPM.

curl -I https://iris-chat.htg-express.com/
kubectl logs -n infra-iris-chat-pro deployment/infra-iris-chat-pro -c app --tail=100 -f
kubectl logs -n infra-iris-chat-pro deployment/default-worker -c app --tail=100 -f

Logs

Los logs se envían al log group catch-all del cluster mediante Fluent Bit:

aws logs tail /aws/eks/htg-pro/aws-fluentbit-logs \
  --profile htg-pro --region eu-south-2 --follow \
  --filter-pattern 'infra-iris-chat-pro'

Referencia técnica

Capa Tecnología Versión
Runtime PHP-FPM 8.3
Framework Laravel 11
Web server Nginx 1.28
Base de datos RDS/Aurora MySQL 8.0
Caché, sesiones y colas ElastiCache Redis -
Almacenamiento Amazon S3 -
Contenedor Docker Multi-stage
Orquestación Kubernetes (EKS) 1.32
CI/CD Bitbucket Pipelines -
GitOps ArgoCD -
Helm chart infra-iris-api 0.4.6
Secretos AWS Secrets Manager + ESO -
Reloader Stakater Reloader -
Autenticación Laravel Sanctum -