1. Arquitectura
Una vez que su instancia de servidor DQE One dedicada esté activa y en funcionamiento, puede iniciar el paso de configuración desde su aplicación Salesforce. El paquete DQE One de AppExchange debe estar instalado previamente.
Este documento describe un ejemplo de la posible configuración para poner en marcha la instancia del servidor. Este documento no cubre la capa de seguridad de su propio entorno.
Diagrama de flujo
A continuación se muestra el diagrama que describe todos los flujos entrantes/salientes, así como las IP y los puertos requeridos por la aplicación.
Medidas de seguridad
No podemos proporcionar un ejemplo de cómo implementar la capa de seguridad que se adapte perfectamente a su arquitectura. Sin embargo, podemos ofrecer algunas recomendaciones relevantes para el uso de la propia aplicación.
- Protocolos y puertos: Todos los flujos entrantes/salientes de la aplicación pasan por el protocolo HTTPS (puerto 443). No es necesario abrir ningún otro puerto en su VM. Las IP de DQE que deben ser accesibles se describen en el diagrama anterior.
- Filtrado de IP: El propio servidor de la aplicación solo necesita ser accesible desde los servidores de Salesforce. Por lo tanto, se recomienda configurar un filtrado de las IP entrantes.
Existe una excepción a esto, sin embargo, que es el servidor web CustomUI incluido en el docker-compose. Debe ser accesible desde un navegador web. Por lo tanto, una solución podría ser permitir que una VPN específica acceda al servidor. Consulte aquí la lista de IP publicadas por Salesforce. (No olvide las IP de Hyperforce)
- Protocolo de autenticación: Salesforce ofrece de forma nativa varios protocolos para proteger las solicitudes entre sus servidores y el servidor DQE One. Al configurar la Connected App "DQE One Customer" en su organización, podrá seleccionar el método de autenticación "Basic Auth" y configurar su firewall de aplicación en consecuencia.
Si la VM está directamente expuesta a internet, debe tener una entrada DNS y un certificado SSL asociado que apunten a ella.
Si la VM no está directamente expuesta a internet, esto generalmente significa que el tráfico se enruta a través de un componente como una puerta de enlace (gateway). En este caso, el DNS y el certificado SSL deben instalarse en esa puerta de enlace, que luego reenviará el tráfico a la VM interna.
Recomendación
Esta sección enumera los componentes necesarios para instalar la instancia de DQE One Server en una VM.
Nota: Las estimaciones se basan en 1 millón de registros. Dependiendo del volumen de las bases de datos procesadas, puede ser necesario aumentar la capacidad de memoria de las instancias de contenedor para optimizar los tiempos de procesamiento.
Despliegue con instancias de VM
- Configuración del servidor:
- Tipo: Unix, por ejemplo Ubuntu.
- RAM: de 3 a 5 GB
- Espacio en disco: 10 GB
- CPU: 1vCPU
- Balanceador de carga: No es imprescindible, pero puede utilizarse si ya existe.
Composición y servicios
La imagen Docker es una aplicación web que expone los servicios y las API que se solicitan desde Salesforce a través de la aplicación Lightning DQE Unify UI.
A continuación, describimos los atributos y funciones de cada servicio.
APLICACIÓN WEB
Un contenedor backend que contiene una aplicación de microservicios. Esta aplicación expone todas las API que se invocan para lanzar procesos, gestionar las colas de procesamiento e instanciar workers de procesamiento. Depende de los siguientes servicios para funcionar correctamente. Este worker debe exponerse en la web tal como se describe en la configuración de nginx presentada más adelante en este documento.
Parámetros de Docker Compose
-
image: El nombre de la imagen utilizada por la aplicación web. Es necesario renombrar la imagen según los nombres de los registros utilizados. Las imágenes Docker de DQE se alojan en un Azure Container Registry. El nombre de la imagen se construye de la siguiente manera:
<Name of the registry container>.azurecr.io/<name of the image> - container_name: Nombre del contenedor
- depends_on: Nombre de los servicios que preceden a este servicio
-
domainname: El nombre de dominio utilizado para el FQDN. Formato esperado:
<domain name> - environment: Variables de entorno del servicio
- command: Comando ejecutado al iniciar el contenedor
Worker
Un contenedor backend que contiene una aplicación de microservicios. Esta aplicación expone todas las API que se invocan para lanzar procesos, gestionar las colas de procesamiento e instanciar workers de procesamiento. Depende de los siguientes servicios para funcionar correctamente. Este worker debe exponerse en la web tal como se describe en la configuración de nginx presentada más adelante en este documento.
Parámetros a configurar en Docker Compose
- image: El nombre de esta imagen es el mismo que el del servicio web
- container_name: El nombre del contenedor en el entorno Docker
- depends_on: Nombre de los servicios que preceden a este servicio
- environment: Variables de entorno del servicio
- command: Comando ejecutado al iniciar el contenedor
CustomUI
Este servicio es una aplicación web que expone un front utilizado para configurar las reglas de deduplicación. Al igual que el primer servicio, también debe exponerse en la web. Este servicio también consume algunas API del backend, por ejemplo para recuperar metadatos del CRM.
Nombre del registro: *
Nombre de la imagen: *
Versiones disponibles: *
Redis
Este servicio es una base de datos clave/valor utilizada por los distintos departamentos para almacenar claves de funcionamiento interno, como las configuraciones de las organizaciones de Salesforce, las sesiones, etc.
Es posible utilizar las imágenes oficiales publicadas por Redis, como "redis:alpine", pero por motivos de seguridad algunos proveedores de la nube bloquean la obtención de imágenes públicas y solo permiten imágenes de registros privados. Para solventar esta restricción, también publicamos en el registro privado "dqeone" una versión de redis perfectamente compatible con nuestras aplicaciones.
Parámetros
- image: Imagen oficial de redis => redis:alpine
- container_name: El nombre del contenedor en el entorno Docker
-
volumes: La ruta del volumen que se utilizará para respaldar los datos de Redis
<name of the volume defined in this docker compose>:/data
RabbitMQ
Este servicio es un potente gestor de colas que permite la recepción y la planificación de las solicitudes de procesamiento. Hasta que un proceso se haya asignado a un worker y se haya completado, permanecerá en una cola. Esto también permite la resiliencia ante fallos: si el servidor se reiniciara, retomaría el último procesamiento en la cola justo donde lo dejó.
Al igual que con la imagen del servicio Redis, tiene la opción de utilizar una versión pública (rabbitmq:3-management-alpine) o la del registro privado dqeone.
Parámetros
- image: Imagen oficial de rabbitmq => rabbitmq:3-management-alpine
- container_name: Nombre del contenedor de RabbitMQ
2. Instalación
2.1. Requisitos previos
Instalación de NGINX
$ sudo apt update
$ sudo apt install nginxEjemplo de configuración:
server {
listen 443 ssl;
server_name mysite.com;
ssl_certificate /etc/nginx/ssl/[MY_CERTIFICATE].pem;
ssl_certificate_key /etc/nginx/ssl/[ MY_PRIVATE_KEY].key;
ssl_protocols TLSv1.2 TLSv1.3;
#ssl_ciphers HIGH: !aNULL: ! MD5;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_http_version 1.1;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header Cookie $http_cookie;
proxy_set_header Referer $http_referer;
proxy_pass http://127.0.0.1:8001/;
}
location /unify/ {
rewrite /unify/(.*) /$1 break;
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8000;
}
location /lookup {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8000;
}
location /static {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8000;
}
Location /API {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8000;
}
access_log /var/log/nginx/dqeone.log;
error_log /var/log/nginx/dqeone-error.log error;
}Instalación de Docker
-
Actualizar el paquete existente
$ sudo apt-get update -
Instalar los requisitos previos para usar paquetes a través de HTTPS
$ sudo apt install apt-transport-https ca-certificates curl software-properties-common -
Agregar la clave GPG del repositorio oficial de Docker
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - -
Agregar el repositorio de Docker a las fuentes de APT
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable" -
Actualizar los paquetes
$ sudo apt-get update -
Verificación de la instalación desde el repositorio de Docker
$ apt-cache policy docker-ce -
Instalación de Docker
$ sudo apt install docker-ce
Instalación de Docker-compose
Nota: En las instalaciones recientes de Docker, Docker Compose V2 se incluye por defecto con Docker Engine. Antes de descargar el binario independiente docker-compose, compruebe si Compose ya está instalado ejecutando:
docker compose versionSi el comando devuelve un número de versión, puede omitir este paso de instalación y usar docker compose en lugar de docker-compose en los siguientes comandos.
-
Descargar la versión deseada (número de versión a cambiar en la URL)
$ sudo curl -L "https://github.com/docker/compose/releases/download/<NUMEROS_DE_VERSION>/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose -
Configurar los permisos
$ sudo chmod +x /usr/local/bin/docker-compose
2.2. One Server
services:
customui:
image: <imageURL>
container_name: custom-ui
logging:
driver : "json-file"
options :
max-file : 5
max-size : 50m
environment:
- PORT=8001
ports:
- 8001:8001
command: npm start
web:
image: <imageURL>
container_name: one-server
hostname: oneserver
logging:
driver : "json-file"
options :
max-file : 5
max-size : 50m
depends_on:
- redis
- rabbitmq
environment:
- SFAPIVERSION=v59.0
- PORT=8000
- REDIS_URL=redis://redis
- CLOUDAMQP_URL=amqp://guest:guest@rabbitmq/admin
- CUSTOMUI=http://customui:8001
- UNIFYSERVERURL=http://web:8000
ports:
- 8000:8000
command: bash ./entrypoint.sh
worker:
image: <imageURL>
container_name: queue-worker
logging:
driver : "json-file"
options :
max-file : 5
max-size : 50m
environment:
- SFAPIVERSION=v59.0
- WORKDIRPATH=/app/unify
- REDIS_URL=redis://redis
- CLOUDAMQP_URL=amqp://guest:guest@rabbitmq/admin
depends_on:
- web
command: python -u ./unify/queue_worker.pyc
redis:
container_name: redis
logging:
driver : "json-file"
options :
max-file : 5
max-size : 50m
image: <imageURL>
hostname: redis
volumes:
- redis_data:/data
rabbitmq:
image: <imageURL>
container_name: 'rabbitmq'
logging:
driver : "json-file"
options :
max-file : 5
max-size : 50m
environment:
- RABBITMQ_DEFAULT_PASS=guest
- RABBITMQ_DEFAULT_USER=guest
- RABBITMQ_DEFAULT_VHOST=admin
hostname: rabbitmq
depends_on:
- redis
volumes:
- rabbitmq_data:/var/lib/rabbitmq/
- rabbitmq_log:/var/log/rabbitmq/
volumes:
rabbitmq_data:
rabbitmq_log:
redis_data:
3. Lanzador
Aunque el servidor backend se despliega en su propia máquina virtual, las imágenes Docker de DQE se proporcionan a través de un Azure Container Registry gestionado por DQE.
3.1. Conexión al Azure Container Registry de DQE
Autentique Docker en el Azure Container Registry de DQE:
$ sudo docker login **************
Username: <Login provided by DQE>
Password: <Pwd provided by DQE>3.2. Lanzamiento de docker-compose.yml
Vaya a la carpeta que contiene el archivo docker-compose.yml y ejecútelo.
$ sudo docker-compose pull
$ sudo docker-compose up
Relacionada con