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)
- Calcula
IMAGE_TAGcon el SHA corto del commit. - Construye la imagen con
Dockerfile. - Publica la imagen en ECR.
- Actualiza
dev/values.yamleninfra-iris-chat. - 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:
- El pipeline actualiza el
image.tagen elvalues.yamldel entorno. - ArgoCD detecta el cambio y renderiza el chart con los nuevos valores.
- 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 | - |