{"id":27261416,"url":"https://github.com/luispfa/sf7-rabbitmq-ha","last_synced_at":"2026-05-08T03:40:17.151Z","repository":{"id":277710664,"uuid":"933219249","full_name":"Luispfa/sf7-rabbitmq-ha","owner":"Luispfa","description":"Symfony project with RabbitMQ using Hexagonal Architecture and Domain Events for scalable and event-driven applications","archived":false,"fork":false,"pushed_at":"2025-04-02T14:52:28.000Z","size":2024,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-02T15:35:10.774Z","etag":null,"topics":["async-processing","domain-events","event-driven","event-handling","hexagonal-architecture","message-broker","messaging-system","microservices","php","queue-system","rabbitmq","redis","scalable-applications","software-architecture","symfony"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Luispfa.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-02-15T12:50:44.000Z","updated_at":"2025-04-02T15:02:11.000Z","dependencies_parsed_at":null,"dependency_job_id":"f4a3ea86-fa03-4936-9f5f-33ef22dc493d","html_url":"https://github.com/Luispfa/sf7-rabbitmq-ha","commit_stats":null,"previous_names":["luispfa/sf7-rabbitmq-ha"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Luispfa%2Fsf7-rabbitmq-ha","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Luispfa%2Fsf7-rabbitmq-ha/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Luispfa%2Fsf7-rabbitmq-ha/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Luispfa%2Fsf7-rabbitmq-ha/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Luispfa","download_url":"https://codeload.github.com/Luispfa/sf7-rabbitmq-ha/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248347727,"owners_count":21088725,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["async-processing","domain-events","event-driven","event-handling","hexagonal-architecture","message-broker","messaging-system","microservices","php","queue-system","rabbitmq","redis","scalable-applications","software-architecture","symfony"],"created_at":"2025-04-11T05:31:04.022Z","updated_at":"2025-10-29T03:48:45.989Z","avatar_url":"https://github.com/Luispfa.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Bilingual README / README Bilingüe\n\n[![Symfony](https://img.shields.io/badge/Symfony-7.0-000000?style=flat-square\u0026logo=symfony)](https://symfony.com)\n[![PHP](https://img.shields.io/badge/PHP-8.3-777BB4?style=flat-square\u0026logo=php)](https://www.php.net)\n[![RabbitMQ](https://img.shields.io/badge/RabbitMQ-Latest-FF6600?style=flat-square\u0026logo=rabbitmq)](https://www.rabbitmq.com)\n[![Redis](https://img.shields.io/badge/Redis-Latest-DC382D?style=flat-square\u0026logo=redis)](https://redis.io)\n[![Docker](https://img.shields.io/badge/Docker-Required-2496ED?style=flat-square\u0026logo=docker)](https://www.docker.com)\n\n**This repository is bilingual. Below you will find the English version followed by the Spanish version.  \nEste repositorio es bilingüe. A continuación encontrarás la versión en inglés seguida de la versión en español.**\n\n---\n\n\u003cdiv style=\"display: block; text-align: center;\"\u003e\n\u003cimg src=\"youtube-banner.png\" alt=\"@fitCoding - RabbitMQ - Domain Event\" style=\"max-width: 30%; float: left; margin-right: 20px;\"\u003e\n\n  \u003cdiv style=\"max-width: 70%; text-align: left;\"\u003e\n    \u003cstrong style=\"font-size: 30px; font-weight: bold;\"\u003eProyecto \"RabbitMQ - Redis - Domain Event\"\u003c/strong\u003e\n    \u003cbr\u003e\n    \u003cspan style=\"font-size: 24px;\"\u003eSoftware Development with Symfony 7, PHP 8.3, RabbitMQ latest, Redis latest and Hexagonal Architecture\u003c/span\u003e\n    \u003cbr\u003e\n    \u003cspan style=\"font-size: 24px;\"\u003eDesarrollo de Software con Symfony 7, PHP 8.3, RabbitMQ latest, Redis latest y Arquitectura Hexagonal\u003c/span\u003e\n  \u003c/div\u003e\n\u003c/div\u003e\n\u003cp\u003e\u003c/p\u003e\n\n## 📑 Table of Contents / Índice\n\n- [Requirements / Requisitos](#-requirements--requisitos)\n- [Installation / Instalación](#-installation--instalación)\n- [Configuration / Configuración](#-configuration--configuración)\n- [Usage / Uso](#-usage--uso)\n- [Architecture / Arquitectura](#-architecture--arquitectura)\n- [Troubleshooting / Solución de Problemas](#-troubleshooting--solución-de-problemas)\n- [Contributing / Contribuir](#-contributing--contribuir)\n- [Security / Seguridad](#-security--seguridad)\n\n## 🔧 Requirements / Requisitos\n\n### System Requirements / Requisitos del Sistema\n\n- Docker \u003e= 20.10\n- Docker Compose \u003e= 2.0\n- Git \u003e= 2.30\n\n### Development Requirements / Requisitos de Desarrollo\n\n- PHP \u003e= 8.3\n- Composer \u003e= 2.0\n- Symfony CLI \u003e= 5.0\n\n### Environment Variables / Variables de Entorno\n\nCreate a `.env` file in the root directory with the following variables:\nCrea un archivo `.env` en el directorio raíz con las siguientes variables:\n\n```env\n# Application\nAPP_ENV=dev\nAPP_DEBUG=1\nAPP_SECRET=your_secret_here\n\n# RabbitMQ\nRABBITMQ_DEFAULT_USER=guest\nRABBITMQ_DEFAULT_PASS=guest\nMESSENGER_TRANSPORT_DSN=amqp://guest:guest@rabbitmq:5672/%2f/messages\n\n# Redis\nREDIS_URL=redis://redis:6379\n```\n\n## English\n\n# Symfony Project with RabbitMQ and Redis in Hexagonal Architecture\n\nThis project implements a **messaging system** with **RabbitMQ** and **Redis** in a **Symfony** environment, following the **Hexagonal Architecture** and using **domain events** to **decouple** **business logic** from **infrastructure**. Domain events are triggered within the application core when significant changes occur and are processed by **specific handlers**, allowing, for example, counters or other processes to be updated **asynchronously**.\n\n### Message Module\n\nAdditionally, the **Message** module sends messages directly without domain events.\n\n### User Module\n\nWhereas the **User** module utilizes domain events. For example, when a user registers, a **UserRegisteredEvent** is triggered to update the gender count. After this event is processed, a **UserEmailSentEvent** is dispatched to confirm the user's registration via email.\n\n#### What happens when a user registers?\n\n1. The user is created in the application.\n2. A domain event (**UserRegisteredEvent**) is triggered to update the gender count.\n3. The event is sent to RabbitMQ via Symfony Messenger.\n4. A **specific handler** (**UserRegisteredEventHandler**) processes the event and updates a counter (via a file, database, etc.).\n5. After processing **UserRegisteredEvent**, a new event **UserEmailSentEvent** is triggered to notify the user via email.\n6. **UserEmailSentEvent** is sent to RabbitMQ and processed by its corresponding handler.\n7. Ensure the consumer is running to process the events:\n\n   ```bash\n   php bin/console messenger:consume async user_registered user_email_sent -vv\n   ```\n\n   _(If all events are routed to the same transport, the worker will consume and execute the **handlers** accordingly.)_\n\n---\n\n## 🚀 Installation Steps\n\n### 1️⃣ Clone the Repository and Navigate to the Folder\n\n```bash\ngit clone https://github.com/Luispfa/sf7-rabbitmq-ha.git\ncd rabbit-mq\n```\n\n### 2️⃣ Start Services with Docker\n\n```bash\ndocker-compose up -d --build\n```\n\n### 3️⃣ Access the PHP Container:\n\n```bash\ndocker exec -it sf7_php_ha bash\n```\n\n### 4️⃣ Install Symfony Dependencies\n\n```bash\nphp composer install\n```\n\n### 5️⃣ Check if RabbitMQ and Redis Ports are Open:\n\n```bash\nnc -zv sf7_rabbitmq_ha 15672\nnc -zv sf7_redis_ha 6379\n```\n\n### 6️⃣ Make an HTTP Request to the RabbitMQ API to Get Detailed Status Information:\n\n```bash\ncurl -u guest:guest http://sf7_rabbitmq_ha:15672/api/overview\n```\n\n### 7️⃣ Run the RabbitMQ Consumer\n\n```bash\nphp bin/console messenger:consume async user_registered user_email_sent -vv\n```\n\n### 8️⃣ Run the RabbitMQ Consumer in Daemon Mode:\n\n```bash\nphp bin/console messenger:consume async user_registered user_email_sent --daemon\n```\n\n### 9️⃣ If You Are on Windows, Add the Following Line to Your C:\\Windows\\System32\\drivers\\etc\\hosts File:\n\n```\n127.0.0.1 dev.rabbit-mq.com\n```\n\n---\n\n## Changes in messenger.yml\n\nThe `messenger.yml` configuration file has been updated to define dedicated queues for **UserRegisteredEvent** and **UserEmailSentEvent**.\n\nUpdated configuration in `messenger.yml`:\n\n```yaml\nframework:\n  messenger:\n    transports:\n      async:\n        dsn: \"%env(MESSENGER_TRANSPORT_DSN)%\"\n        options:\n          exchange:\n            name: messages\n            type: direct\n          queues:\n            messages: ~\n      user_registered:\n        dsn: \"%env(MESSENGER_TRANSPORT_DSN)%\"\n        options:\n          exchange:\n            name: user_events\n            type: direct\n          queues:\n            user_registered_queue: ~\n      user_email_sent:\n        dsn: \"%env(MESSENGER_TRANSPORT_DSN)%\"\n        options:\n          exchange:\n            name: email_events\n            type: direct\n          queues:\n            user_email_sent_queue: ~\n\n    routing:\n      'App\\Message\\Domain\\Message\\Message': async\n      'App\\User\\Domain\\Event\\UserRegisteredEvent': user_registered\n      'App\\User\\Domain\\Event\\UserEmailSentEvent': user_email_sent\n```\n\n---\n\n## Sending a Test Message\n\n### Sending a Message to the async Queue\n\n- **Method:** POST\n- **URL:** `http://dev.rabbit-mq.com/send-message`\n- **Headers:** `Content-Type: application/json`\n- **Body (JSON):**\n\n```json\n{\n  \"message\": \"Hello RabbitMQ!\"\n}\n```\n\n### Registering a User and Triggering Events\n\n- **Method:** POST\n- **URL:** `http://dev.rabbit-mq.com/register-user`\n- **Headers:** `Content-Type: application/json`\n- **Body (JSON):**\n\n```json\n{\n  \"name\": \"Juan\",\n  \"lastname\": \"Flores\",\n  \"gender\": \"Male\",\n  \"email\": \"email@email.com\"\n}\n```\n\n---\n\n## 🐇 Accessing RabbitMQ and Redis\n\n- RabbitMQ is accessible at `http://dev.rabbit-mq.com:15672/` with username **guest** and password **guest**.\n- Redis can be accessed at `http://dev.rabbit-mq.com:8081/`.\n- If you are on Windows, add the following line to your C:\\Windows\\System32\\drivers\\etc\\hosts file:\n\n```\n127.0.0.1 dev.rabbit-mq.com\n```\n\n---\n\n## 🏗️ Architecture / Arquitectura\n\n### Hexagonal Architecture Overview / Visión General de la Arquitectura Hexagonal\n\n```\nsrc/\n├── Message/                 # Message Module / Módulo de Mensajes\n│   ├── Application/        # Application Services / Servicios de Aplicación\n│   ├── Domain/            # Domain Logic / Lógica de Dominio\n│   └── Infrastructure/    # Infrastructure Implementation / Implementación de Infraestructura\n└── User/                   # User Module / Módulo de Usuarios\n    ├── Application/       # Application Services / Servicios de Aplicación\n    ├── Domain/           # Domain Logic / Lógica de Dominio\n    └── Infrastructure/   # Infrastructure Implementation / Implementación de Infraestructura\n```\n\n### Event Flow / Flujo de Eventos\n\n```mermaid\nsequenceDiagram\n    participant Client\n    participant Controller\n    participant Domain\n    participant RabbitMQ\n    participant Handler\n\n    Client-\u003e\u003eController: POST /register-user\n    Controller-\u003e\u003eDomain: Create User\n    Domain-\u003e\u003eDomain: Trigger UserRegisteredEvent\n    Domain-\u003e\u003eRabbitMQ: Send Event\n    RabbitMQ-\u003e\u003eHandler: Process Event\n    Handler-\u003e\u003eDomain: Update Counters\n    Domain-\u003e\u003eDomain: Trigger UserEmailSentEvent\n    Domain-\u003e\u003eRabbitMQ: Send Event\n    RabbitMQ-\u003e\u003eHandler: Process Event\n    Handler-\u003e\u003eClient: Send Email\n```\n\n## 🔍 Troubleshooting / Solución de Problemas\n\n### Common Issues / Problemas Comunes\n\n1. **RabbitMQ Connection Issues / Problemas de Conexión con RabbitMQ**\n\n   - Check if RabbitMQ is running: `docker ps | grep rabbitmq`\n   - Verify ports are open: `nc -zv sf7_rabbitmq_ha 5672`\n   - Check RabbitMQ logs: `docker logs sf7_rabbitmq_ha`\n\n2. **Redis Connection Issues / Problemas de Conexión con Redis**\n\n   - Check if Redis is running: `docker ps | grep redis`\n   - Verify Redis connection: `redis-cli -h sf7_redis_ha ping`\n   - Check Redis logs: `docker logs sf7_redis_ha`\n\n3. **Consumer Issues / Problemas con el Consumidor**\n   - Ensure consumer is running: `ps aux | grep messenger:consume`\n   - Check consumer logs: `docker logs sf7_php_ha`\n   - Restart consumer if needed: `php bin/console messenger:consume async user_registered user_email_sent -vv`\n\n## 🤝 Contributing / Contribuir\n\n1. Fork the repository / Haz un fork del repositorio\n2. Create your feature branch / Crea tu rama de características\n3. Commit your changes / Haz commit de tus cambios\n4. Push to the branch / Haz push a la rama\n5. Create a new Pull Request / Crea un nuevo Pull Request\n\n## 🔒 Security / Seguridad\n\n### Best Practices / Mejores Prácticas\n\n1. **Environment Variables / Variables de Entorno**\n\n   - Never commit `.env` files / Nunca commits archivos `.env`\n   - Use different secrets for development and production / Usa diferentes secretos para desarrollo y producción\n   - Rotate secrets regularly / Rota los secretos regularmente\n\n2. **API Security / Seguridad de la API**\n\n   - Use HTTPS in production / Usa HTTPS en producción\n   - Implement rate limiting / Implementa límites de tasa\n   - Validate all input / Valida todas las entradas\n\n3. **Message Queue Security / Seguridad de Cola de Mensajes**\n   - Use strong passwords / Usa contraseñas fuertes\n   - Enable SSL/TLS / Habilita SSL/TLS\n   - Monitor queue access / Monitorea el acceso a las colas\n\n## Español\n\n# Proyecto Symfony con RabbitMQ y Redis en Arquitectura Hexagonal\n\nEste proyecto implementa un **sistema de mensajería** con **RabbitMQ** y **Redis** en un entorno **Symfony**, siguiendo la **Arquitectura Hexagonal** y utilizando **eventos de dominio** para **desacoplar** la **lógica de negocio** de la **infraestructura**. Los eventos de dominio se activan en el núcleo de la aplicación cuando ocurren cambios significativos y son procesados por **manejadores** específicos, permitiendo, por ejemplo, actualizar contadores u otros procesos de manera **asíncrona**.\n\n### Módulo Mensaje\n\nAdemás, el módulo **Mensaje** envía mensajes directamente sin eventos de dominio.\n\n### Módulo Usuario\n\nMientras que el módulo **Usuario** utiliza eventos de dominio. Por ejemplo, cuando un usuario se registra, se activa un **UserRegisteredEvent** para actualizar el conteo de género. Después de que se procesa este evento, se envía un **UserEmailSentEvent** para confirmar el registro del usuario por correo electrónico.\n\n#### ¿Qué ocurre cuando un usuario se registra?\n\n1. Se crea el usuario en la aplicación.\n2. Se dispara un evento de dominio (**UserRegisteredEvent**) para actualizar el conteo de género.\n3. El evento se envía a RabbitMQ a través de Symfony Messenger.\n4. Un **manejador** específico (**UserRegisteredEventHandler**) procesa el evento y actualiza un contador (mediante un archivo, base de datos, etc.).\n5. Después de procesar **UserRegisteredEvent**, se activa un nuevo evento **UserEmailSentEvent** para notificar al usuario por correo electrónico.\n6. **UserEmailSentEvent** se envía a RabbitMQ y es procesado por su manejador correspondiente.\n7. Asegúrate de que el consumidor esté en ejecución para procesar los eventos:\n\n   ```bash\n   php bin/console messenger:consume async user_registered user_email_sent -vv\n   ```\n\n   _(Si todos los eventos se enrutan al mismo transporte, el trabajador los consumirá y ejecutará los **manejadores** correspondientes.)_\n\n---\n\n## 🚀 Pasos de Instalación\n\n### 1️⃣ Clonar el Repositorio y Navegar a la Carpeta\n\n```bash\ngit clone https://github.com/Luispfa/sf7-rabbitmq-ha.git\ncd rabbit-mq\n```\n\n### 2️⃣ Iniciar los Servicios con Docker\n\n```bash\ndocker-compose up -d --build\n```\n\n### 3️⃣ Acceder al Contenedor PHP:\n\n```bash\ndocker exec -it sf7_php_ha bash\n```\n\n### 4️⃣ Instalar Dependencias de Symfony\n\n```bash\nphp composer install\n```\n\n### 5️⃣ Verificar si los Puertos de RabbitMQ y Redis están Abiertos:\n\n```bash\nnc -zv sf7_rabbitmq_ha 15672\nnc -zv sf7_redis_ha 6379\n```\n\n### 6️⃣ Realizar una Petición HTTP a la API de RabbitMQ para Obtener Información Detallada del Estado:\n\n```bash\ncurl -u guest:guest http://sf7_rabbitmq_ha:15672/api/overview\n```\n\n### 7️⃣ Ejecutar el Consumidor de RabbitMQ\n\n```bash\nphp bin/console messenger:consume async user_registered user_email_sent -vv\n```\n\n### 8️⃣ Ejecutar el Consumidor de RabbitMQ en Modo Daemon:\n\n```bash\nphp bin/console messenger:consume async user_registered user_email_sent --daemon\n```\n\n### 9️⃣ Si Estás en Windows, Agrega la Siguiente Línea a tu Archivo C:\\Windows\\System32\\drivers\\etc\\hosts:\n\n```\n127.0.0.1 dev.rabbit-mq.com\n```\n\n---\n\n## Cambios en messenger.yml\n\nEl archivo de configuración `messenger.yml` ha sido actualizado para definir colas dedicadas para **UserRegisteredEvent** y **UserEmailSentEvent**.\n\nConfiguración actualizada en `messenger.yml`:\n\n```yaml\nframework:\n  messenger:\n    transports:\n      async:\n        dsn: \"%env(MESSENGER_TRANSPORT_DSN)%\"\n        options:\n          exchange:\n            name: messages\n            type: direct\n          queues:\n            messages: ~\n      user_registered:\n        dsn: \"%env(MESSENGER_TRANSPORT_DSN)%\"\n        options:\n          exchange:\n            name: user_events\n            type: direct\n          queues:\n            user_registered_queue: ~\n      user_email_sent:\n        dsn: \"%env(MESSENGER_TRANSPORT_DSN)%\"\n        options:\n          exchange:\n            name: email_events\n            type: direct\n          queues:\n            user_email_sent_queue: ~\n\n    routing:\n      'App\\Message\\Domain\\Message\\Message': async\n      'App\\User\\Domain\\Event\\UserRegisteredEvent': user_registered\n      'App\\User\\Domain\\Event\\UserEmailSentEvent': user_email_sent\n```\n\n---\n\n## Enviar un Mensaje de Prueba\n\n### Enviando un Mensaje a la Cola async\n\n- **Método:** POST\n- **URL:** `http://dev.rabbit-mq.com/send-message`\n- **Encabezados:** `Content-Type: application/json`\n- **Cuerpo (JSON):**\n\n```json\n{\n  \"message\": \"¡Hola RabbitMQ!\"\n}\n```\n\n### Registrando un Usuario y Activando Eventos\n\n- **Método:** POST\n- **URL:** `http://dev.rabbit-mq.com/register-user`\n- **Encabezados:** `Content-Type: application/json`\n- **Cuerpo (JSON):**\n\n```json\n{\n  \"name\": \"Juan\",\n  \"lastname\": \"Flores\",\n  \"gender\": \"Male\",\n  \"email\": \"email@email.com\"\n}\n```\n\n---\n\n## 🐇 Acceso a RabbitMQ y Redis\n\n- RabbitMQ es accesible en `http://dev.rabbit-mq.com:15672/` con usuario **guest** y contraseña **guest**.\n- Redis puede ser accedido en `http://dev.rabbit-mq.com:8081/`.\n- Si estás en Windows, agrega la siguiente línea a tu archivo C:\\Windows\\System32\\drivers\\etc\\hosts:\n\n```\n127.0.0.1 dev.rabbit-mq.com\n```\n\n---\n\n## 🏗️ Arquitectura\n\n### Visión General de la Arquitectura Hexagonal\n\n```\nsrc/\n├── Message/                 # Módulo de Mensajes\n│   ├── Application/        # Servicios de Aplicación\n│   ├── Domain/            # Lógica de Dominio\n│   └── Infrastructure/    # Implementación de Infraestructura\n└── User/                   # Módulo de Usuarios\n    ├── Application/       # Servicios de Aplicación\n    ├── Domain/           # Lógica de Dominio\n    └── Infrastructure/   # Implementación de Infraestructura\n```\n\n### Flujo de Eventos\n\n```mermaid\nsequenceDiagram\n    participant Client\n    participant Controller\n    participant Domain\n    participant RabbitMQ\n    participant Handler\n\n    Client-\u003e\u003eController: POST /register-user\n    Controller-\u003e\u003eDomain: Create User\n    Domain-\u003e\u003eDomain: Trigger UserRegisteredEvent\n    Domain-\u003e\u003eRabbitMQ: Send Event\n    RabbitMQ-\u003e\u003eHandler: Process Event\n    Handler-\u003e\u003eDomain: Update Counters\n    Domain-\u003e\u003eDomain: Trigger UserEmailSentEvent\n    Domain-\u003e\u003eRabbitMQ: Send Event\n    RabbitMQ-\u003e\u003eHandler: Process Event\n    Handler-\u003e\u003eClient: Send Email\n```\n\n## 🔍 Solución de Problemas\n\n### Problemas Comunes\n\n1. **Problemas de Conexión con RabbitMQ**\n\n   - Verificar si RabbitMQ está ejecutándose: `docker ps | grep rabbitmq`\n   - Verificar si los puertos están abiertos: `nc -zv sf7_rabbitmq_ha 5672`\n   - Revisar los logs de RabbitMQ: `docker logs sf7_rabbitmq_ha`\n\n2. **Problemas de Conexión con Redis**\n\n   - Verificar si Redis está ejecutándose: `docker ps | grep redis`\n   - Verificar la conexión con Redis: `redis-cli -h sf7_redis_ha ping`\n   - Revisar los logs de Redis: `docker logs sf7_redis_ha`\n\n3. **Problemas con el Consumidor**\n   - Asegurar que el consumidor está ejecutándose: `ps aux | grep messenger:consume`\n   - Revisar los logs del consumidor: `docker logs sf7_php_ha`\n   - Reiniciar el consumidor si es necesario: `php bin/console messenger:consume async user_registered user_email_sent -vv`\n\n## 🤝 Contribuir\n\n1. Haz un fork del repositorio\n2. Crea tu rama de características\n3. Haz commit de tus cambios\n4. Haz push a la rama\n5. Crea un nuevo Pull Request\n\n## 🔒 Seguridad\n\n### Mejores Prácticas\n\n1. **Variables de Entorno**\n\n   - Nunca commits archivos `.env`\n   - Usa diferentes secretos para desarrollo y producción\n   - Rota los secretos regularmente\n\n2. **Seguridad de la API**\n\n   - Usa HTTPS en producción\n   - Implementa límites de tasa\n   - Valida todas las entradas\n\n3. **Seguridad de Cola de Mensajes**\n   - Usa contraseñas fuertes\n   - Habilita SSL/TLS\n   - Monitorea el acceso a las colas\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fluispfa%2Fsf7-rabbitmq-ha","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fluispfa%2Fsf7-rabbitmq-ha","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fluispfa%2Fsf7-rabbitmq-ha/lists"}