Máquina Virtual Windows — Instalación del servidor backend

Support DQE
Support DQE
  • Actualización

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.

Internet
   |
HTTPS:443
   |
NGINX (container)
   |
http://dqeone:8000
   |
DQE One Standalone backend

Medidas 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 Ubuntu

Se 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 sh

Nota: 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 start

Cierre y vuelva a abrir la terminal WSL2, luego verifique:

docker --version
docker compose version

Nota: 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.conf

Pegue 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.yml
services:

  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 operaciones chown requeridas por estos contenedores.
  • La configuración de NGINX y los certificados SSL se montan desde /mnt/c/dqe-standalone/nginxconf y /mnt/c/dqe-standalone/ssl — las carpetas de Windows accesibles mediante WSL2.
  • platform: linux/amd64 se 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 pull

3.3. Iniciar los servicios [WSL2]

docker compose up -d

Verifique que todos los contenedores estén en ejecución:

docker compose ps

Servicios esperados — todos deben mostrar el estado running:

  • dqeone
  • redis
  • postgres
  • nginx

/!\ 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:8000

Una respuesta similar a la siguiente confirma que la aplicación está en ejecución:

HTTP/1.1 301 Moved Permanently

Una 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 token

Posibles 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 config desde 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 required

Verifique 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.sock

El servicio Docker debe iniciarse manualmente cada vez que se abre la sesión WSL2. Ejecute:

sudo service docker start

Relacionada con

¿Fue útil este artículo?

Usuarios a los que les pareció útil: 0 de 0