1. Arquitectura
Una vez que su instancia de servidor dedicado de DQE One Standalone esté en funcionamiento, podrá iniciar y exponer la aplicación backend desde su máquina virtual.
Este documento describe un ejemplo de configuración para instalar la instancia del servidor backend de Standalone en una máquina virtual Windows Server 2022. Docker Compose se ejecuta dentro de WSL2 (Windows Subsystem for Linux 2) porque Docker CE en Windows Server no puede ejecutar contenedores Linux de forma nativa. Este documento no cubre la capa de seguridad completa de su propio entorno.
La aplicación backend se despliega con Docker Compose. NGINX se ejecuta como contenedor y se expone mediante HTTPS.
Arquitectura recomendada
Internet
|
HTTPS:443
|
NGINX (container)
|
http://dqeone:8000
|
DQE One Standalone backendMedidas de seguridad
- Protocolos y puertos: exponga la aplicación públicamente mediante HTTPS en el puerto 443. La propia aplicación Docker escucha en el puerto 8000 y permanece detrás de NGINX en la red interna de Docker.
- Filtrado de IP: según su arquitectura, restrinja el acceso entrante únicamente a direcciones IP de confianza.
- Certificado SSL: si la VM está directamente expuesta a internet, debe tener una entrada DNS y un certificado SSL asociado.
Recomendación
En esta sección se describe la lista de componentes necesarios para instalar la instancia de DQE One Standalone en una VM de Windows Server.
- Tipo de servidor: Windows Server 2022 (64 bits).
- Entorno de contenedores: Docker CE ejecutándose dentro de WSL2 (Ubuntu) — necesario porque Docker CE en Windows Server no puede ejecutar contenedores Linux de forma nativa.
Requisitos de hardware:
| Componente | Mínimo | Recomendado |
|---|---|---|
| CPU | 1 vCPU | 2 vCPU |
| RAM | 3 GB | 5 GB |
| Disco | 10 GB SSD | 30 GB SSD |
| Red | 100 Mbit/s | 1 Gbit/s |
Composición y servicios
La pila está compuesta por imágenes Docker orquestadas mediante Docker Compose. Cada servicio se ejecuta como un contenedor. Los servicios se comunican entre sí a través de su nombre de servicio en la red interna de Docker.
2. Instalación
Todos los pasos de instalación se realizan en la VM de Windows Server. Los pasos marcados con [PowerShell] deben ejecutarse en PowerShell como Administrador. Los pasos marcados con [WSL2] deben ejecutarse en la terminal de Ubuntu WSL2.
2.1. Requisitos previos
Conéctese a la VM de Windows Server utilizando una de las opciones de conexión disponibles (RDP, Azure Bastion, etc.) y abra PowerShell como Administrador.
Cree la estructura de directorios de la aplicación desde PowerShell:
New-Item -ItemType Directory -Path "C:\dqe-standalone"
New-Item -ItemType Directory -Path "C:\dqe-standalone\nginxconf"
New-Item -ItemType Directory -Path "C:\dqe-standalone\ssl"Instalación de WSL2 [PowerShell]
Habilite las características de Windows necesarias:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
Enable-WindowsOptionalFeature -Online -FeatureName Containers -All -NoRestart/!\ Reinicio necesario — Reinicie la VM después de habilitar estas características antes de continuar.
Después del reinicio, abra PowerShell como Administrador e instale Ubuntu:
wsl --set-default-version 2
wsl --install -d UbuntuSe abrirá una terminal solicitándole crear un nombre de usuario y una contraseña de Unix. Complete la configuración antes de continuar.
Instalación de Docker y Docker Compose [WSL2]
Abra la terminal de Ubuntu WSL2 y ejecute:
curl -fsSL https://get.docker.com | sudo shNota: el script detecta WSL y recomienda Docker Desktop — ignore el mensaje y espere 20 segundos para que la instalación continúe automáticamente. Docker Compose está incluido en esta instalación.
Agregue su usuario al grupo docker e inicie el servicio:
sudo usermod -aG docker $USER
sudo service docker startCierre y vuelva a abrir la terminal WSL2, luego verifique:
docker --version
docker compose versionNota: el servicio Docker debe iniciarse manualmente cada vez que se abre la sesión WSL2: sudo service docker start
Configuración de NGINX [PowerShell]
NGINX se ejecuta como contenedor — no hay instalación a nivel de host. Solo necesita crear el archivo de configuración. Ábralo en el Bloc de notas desde PowerShell:
notepad C:\dqe-standalone\nginxconf\default.confPegue el siguiente contenido y guarde:
server {
listen 443 ssl;
server_name myserver.example.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;
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://dqeone:8000;
}
access_log /var/log/nginx/dqeone-standalone.log;
error_log /var/log/nginx/dqeone-standalone-error.log error;
}Nota: a diferencia de la instalación en Linux, donde NGINX se ejecuta en el host y redirige a http://localhost:8000, en Docker Compose los servicios se comunican mediante su nombre de servicio — el destino del proxy es http://dqeone:8000.
Coloque los archivos del certificado SSL y la clave privada en C:\dqe-standalone\ssl\ antes de iniciar los contenedores.
2.2. Archivo Docker Compose
Cree el archivo C:\dqe-standalone\docker-compose.yml con el siguiente contenido utilizando el Bloc de notas:
notepad C:\dqe-standalone\docker-compose.ymlservices:
redis:
container_name: redis
image: dqeone.azurecr.io/dqe-one-redis:v1.0
hostname: redis
logging:
driver: none
ports:
- "6379:6379"
volumes:
- redis_data:/data
networks:
- standalone-net
nginx:
image: nginx:latest
platform: linux/amd64
container_name: nginx
restart: always
ports:
- "443:443"
volumes:
- /mnt/c/dqe-standalone/nginxconf:/etc/nginx/conf.d:ro
- /mnt/c/dqe-standalone/ssl:/etc/nginx/ssl:ro
depends_on:
- dqeone
networks:
- standalone-net
dqeone:
container_name: dqeone
image: dqeone.azurecr.io/standalone:v1.4.0
hostname: dqeone
expose:
- "8000"
ports:
- "8000:8000"
depends_on:
- redis
- postgres
environment:
- SFAPIVERSION=v65.0
- CREATE_SUPERUSER=true
- RUN_COLLECTSTATIC=false
- DQE_ONE_SERVER_ADMIN_USER=<admin_user>
- DQE_ONE_SERVER_ADMIN_PASSWORD=<admin_password>
- DQE_CLIENT_LICENCE=<client_licence>
- WEBSITE_HOSTNAME=https://<your-domain>
- SECRET_ENCRYPTION_KEY=<secret_encryption_key>
- WAIT_HOSTS=redis:6379
- WAIT_HOSTS_TIMEOUT=300
- WAIT_SLEEP_INTERVAL=5
- WAIT_HOST_CONNECT_TIMEOUT=30
- REDIS_URL=redis://redis:6379
- PORT=8000
- DEBUG=false
- DB_USER=dqeone
- DB_PASSWORD=<database_password>
- DB_NAME=dqeone
- DB_HOST=postgres
- DB_VOLUME_PATH=./db/
- DB_MAX_CAPACITY=8000000000
- AUTHORIZED_SFTP_HOSTS=<authorized_sftp_hosts>
command:
- "bash"
- "./entrypoint.sh"
networks:
- standalone-net
postgres:
container_name: postgres
image: dqeone.azurecr.io/dqe-one-postgres:v1.0
logging:
driver: none
environment:
POSTGRES_USER: dqeone
POSTGRES_PASSWORD: <database_password>
POSTGRES_DB: dqeone
expose:
- "5432"
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- standalone-net
volumes:
redis_data:
postgres_data:
networks:
standalone-net:
driver: bridge
Importante: reemplace todos los valores de marcador de posición entre <...> con los valores proporcionados o generados para la instalación del cliente.
Importante: utilice las versiones de imagen proporcionadas por DQE. No las reemplace con la etiqueta latest, ya que algunas imágenes pueden no publicarse con esta etiqueta.
Puntos clave:
- Todos los volúmenes de datos (
redis_data,postgres_data) son volúmenes nombrados de Docker almacenados en el sistema de archivos Linux de WSL2. No se utilizan montajes de enlace al sistema de archivos NTFS de Windows porque NTFS no admite las operacioneschownrequeridas por estos contenedores. - La configuración de NGINX y los certificados SSL se montan desde
/mnt/c/dqe-standalone/nginxconfy/mnt/c/dqe-standalone/ssl— las carpetas de Windows accesibles mediante WSL2. -
platform: linux/amd64se especifica en la imagen de NGINX para forzar a Docker (ejecutándose en WSL2 sobre un host Windows) a descargar la versión Linux. - Nota de seguridad: no publique credenciales reales de clientes, claves de licencia, claves de cifrado, contraseñas de registro ni contraseñas de bases de datos en la documentación.
Variables de entorno
El servicio dqeone requiere varias variables de entorno para configurar el backend de Standalone.
| Variable | Valor de ejemplo | Descripción |
|---|---|---|
SFAPIVERSION |
v65.0 |
Versión de la API de Salesforce utilizada por la aplicación al comunicarse con Salesforce. |
CREATE_SUPERUSER |
true |
Crea la cuenta de administrador inicial durante el primer inicio. |
RUN_COLLECTSTATIC |
false |
Ejecuta el comando collectstatic de Django durante el inicio. Configúrelo en false a menos que sea explícitamente necesario. |
DQE_ONE_SERVER_ADMIN_USER |
<admin_user> |
Nombre de usuario de la cuenta de administrador inicial. |
DQE_ONE_SERVER_ADMIN_PASSWORD |
<admin_password> |
Contraseña de la cuenta de administrador inicial. Elija una contraseña segura y manténgala confidencial. |
DQE_CLIENT_LICENCE |
<client_licence> |
Clave de licencia del cliente proporcionada por DQE. |
WEBSITE_HOSTNAME |
https://standalone.example.com |
URL HTTPS pública de la instancia de Standalone. Este valor debe coincidir con el nombre DNS y la configuración de NGINX. |
SECRET_ENCRYPTION_KEY |
<secret_encryption_key> |
Clave secreta utilizada para cifrar la información sensible almacenada por la aplicación. Genere una clave única para cada instalación y nunca la cambie después del despliegue. |
WAIT_HOSTS |
redis:6379 |
Lista de servicios dependientes que deben ser accesibles antes de que se inicie la aplicación. |
WAIT_HOSTS_TIMEOUT |
300 |
Tiempo máximo de espera, en segundos, para que los servicios dependientes estén disponibles. |
WAIT_SLEEP_INTERVAL |
5 |
Retraso, en segundos, entre dos comprobaciones de disponibilidad. |
WAIT_HOST_CONNECT_TIMEOUT |
30 |
Tiempo de espera, en segundos, para cada intento de conexión a un servicio dependiente. |
REDIS_URL |
redis://redis:6379 |
URL de conexión de Redis utilizada por la aplicación. |
PORT |
8000 |
Puerto de escucha interno de la aplicación. |
DEBUG |
false |
Activa o desactiva el modo de depuración. Este valor debe establecerse en false en producción. |
DB_USER |
dqeone |
Nombre de usuario de la base de datos PostgreSQL utilizado por la aplicación. |
DB_PASSWORD |
<database_password> |
Contraseña de la base de datos PostgreSQL utilizada por la aplicación. Debe coincidir con POSTGRES_PASSWORD en el servicio postgres. |
DB_NAME |
dqeone |
Nombre de la base de datos PostgreSQL utilizado por la aplicación. Debe coincidir con POSTGRES_DB en el servicio postgres. |
DB_HOST |
postgres |
Nombre de host del servicio PostgreSQL definido en el archivo Docker Compose. |
DB_VOLUME_PATH |
./db/ |
Ruta utilizada por la aplicación para el almacenamiento relacionado con la base de datos. |
DB_MAX_CAPACITY |
8000000000 |
Capacidad máxima de la base de datos, expresada en bytes. |
AUTHORIZED_SFTP_HOSTS |
depot-1.dqe-software.net |
Lista separada por comas de hosts SFTP autorizados por la aplicación para intercambios de archivos seguros. |
Importante: la SECRET_ENCRYPTION_KEY debe generarse una vez y conservarse durante toda la vida del despliegue. Cambiar este valor después de que la aplicación se haya inicializado puede impedir que los datos cifrados previamente puedan descifrarse.
Para generar una clave de cifrado compatible, ejecute desde la terminal WSL2:
python3 -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
Si el módulo cryptography no está instalado, instálelo primero:
sudo apt install python3-cryptography
2.3. Validar el archivo Docker Compose [WSL2]
Navegue hasta el directorio de la aplicación y valide la configuración:
cd /mnt/c/dqe-standalone
docker compose config
Si Docker Compose devuelve un error como:
yaml: found character that cannot start any token
verifique la indentación del archivo. YAML solo admite espacios. Las tabulaciones o caracteres invisibles pueden generar este error. El problema también puede estar ubicado en la línea anterior a la indicada en el mensaje de error.
Nota: al editar el archivo en el Bloc de notas, asegúrese de que no se inserten tabulaciones. Se recomienda utilizar un editor de código como Visual Studio Code para evitar problemas de caracteres invisibles.
3. Lanzador
Las imágenes Docker de DQE se proporcionan a través de un Azure Container Registry gestionado por DQE. Todos los comandos de esta sección se ejecutan desde la terminal de Ubuntu WSL2.
3.1. Conexión al Azure Container Registry de DQE [WSL2]
Inicie el servicio Docker y autentíquese en el registro de DQE:
sudo service docker start
docker login dqeone.azurecr.io
Username: <Login provided by DQE>
Password: <Password provided by DQE>Un inicio de sesión exitoso muestra: Login Succeeded
Si Docker devuelve un error unauthorized al descargar una imagen, verifique que todas las imágenes utilicen el Azure Container Registry proporcionado por DQE. Las instalaciones de clientes no deben hacer referencia a registros de desarrollo como dqeonedev.azurecr.io.
3.2. Descargar las imágenes [WSL2]
Navegue hasta el directorio de la aplicación y descargue las imágenes:
cd /mnt/c/dqe-standalone
docker compose pull3.3. Iniciar los servicios [WSL2]
docker compose up -dVerifique que todos los contenedores estén en ejecución:
docker compose psServicios esperados — todos deben mostrar el estado running:
dqeoneredispostgresnginx
/!\ Importante: si algún contenedor muestra el estado exited o restarting, revise sus registros: docker compose logs <service-name>
3.4. Verificar la instalación [WSL2]
curl -I http://localhost:8000Una respuesta similar a la siguiente confirma que la aplicación está en ejecución:
HTTP/1.1 301 Moved PermanentlyUna vez que NGINX esté en ejecución, la aplicación debería ser accesible a través del endpoint HTTPS público:
https://<your-domain>4. Solución de problemas
Error de análisis YAML
yaml: found character that cannot start any tokenPosibles causas:
- Carácter de tabulación insertado por el Bloc de notas
- Indentación no válida
- Carácter invisible
Solución:
- Reemplace las tabulaciones por espacios.
- Valide el archivo utilizando
docker compose configdesde la terminal WSL2. - Revise la línea anterior a la indicada por el mensaje de error.
- Utilice un editor de código (Visual Studio Code) en lugar del Bloc de notas para evitar la inserción de tabulaciones.
No autorizado al descargar imágenes
unauthorized: authentication requiredVerifique que:
- se haya autenticado correctamente utilizando
docker login dqeone.azurecr.io; - todas las imágenes hagan referencia al registro de producción de DQE
dqeone.azurecr.io; - las versiones de imagen coincidan con las proporcionadas por DQE.
No se puede acceder a la aplicación de forma remota
Verifique que:
- los contenedores Docker estén en ejecución;
- el contenedor de NGINX esté en ejecución;
- el puerto 443 esté permitido por el firewall de Windows Server;
- el certificado SSL esté correctamente colocado en
C:\dqe-standalone\ssl\; - la entrada DNS apunte a la VM o gateway que expone el servicio.
Servicio Docker no iniciado [WSL2]
Cannot connect to the Docker daemon at unix:///var/run/docker.sockEl servicio Docker debe iniciarse manualmente cada vez que se abre la sesión WSL2. Ejecute:
sudo service docker start
Relacionada con