Instalación Windows Server + IIS

SQL local, API en localhost, frontend e IIS en HTTPS

Instalación en Windows Server — IIS + SQL Server local

Guía para desplegar GoTruck BackOffice en un servidor Windows Server con:

Este escenario replica el entorno productivo típico de una distribuidora (un solo servidor, datos locales, acceso por URL interna o VPN).


1. Arquitectura recomendada

                    [ Clientes navegador ]
                              |
                         HTTPS :443
                              v
+-------------------------------------------------------------+
|  Windows Server                                              |
|  IIS (sitio: gotruck.empresa.local)                          |
|    |-- /, /docs/     -> archivos estáticos (dist + docs)     |
|    |-- /api/*        -> proxy ARR -> http://127.0.0.1:5080  |
|                                                              |
|  API (Kestrel o servicio Windows / app pool dedicado)        |
|    escucha SOLO 127.0.0.1:5080                               |
|                                                              |
|  SQL Server (instancia local)                                |
|    base: ArcorGev5Reparto (+ tabla dbo.Usuarios backoffice)  |
+-------------------------------------------------------------+

Por qué es seguro

Medida Detalle
Mismo origen El navegador llama a https://sitio/api/...; IIS reenvía internamente. No hace falta CORS abierto si solo se usa esa URL.
API no pública Kestrel enlazado a 127.0.0.1, no a 0.0.0.0.
HTTPS en IIS Certificado en el enlace del sitio; la API recibe X-Forwarded-Proto: https.
JWT Clave de firma solo en servidor (appsettings.Production.json o variables de entorno).
SQL Usuario dedicado con permisos mínimos (o Windows Auth si aplica).

2. Requisitos del servidor

Software

Componente Versión / notas
Windows Server 2019 o superior (2022 recomendado)
IIS 10+ con rol Web Server
Módulos IIS URL Rewrite, Application Request Routing (ARR) con proxy habilitado
ASP.NET Core Hosting Bundle 8.0.x (runtime + módulo AspNetCoreModuleV2) — descarga Microsoft
SQL Server Misma instancia donde está ArcorGev5Reparto (Standard/Enterprise según licencia)
.NET SDK 8 Solo en máquina de build (no obligatorio en producción si publica en CI)
Node.js 20 LTS Solo en máquina de build (para npm run build del frontend)

Hardware orientativo

Base de datos

  1. Restaurar o disponer de la base ArcorGev5Reparto en SQL Server local.
  2. Ver convenciones de lectura (E_*, I_*) en base_datos_arcor_gev5.html.
  3. La API crea/actualiza la tabla dbo.Usuarios al arrancar (usuarios del backoffice, no del ERP).
  4. Crear login SQL dedicado (ejemplo):
CREATE LOGIN gotruck_app WITH PASSWORD = 'ClaveFuerteAquí';
USE ArcorGev5Reparto;
CREATE USER gotruck_app FOR LOGIN gotruck_app;
ALTER ROLE db_datareader ADD MEMBER gotruck_app;
-- Si en el futuro hubiera escritura en tablas propias:
-- ALTER ROLE db_datawriter ADD MEMBER gotruck_app;

Ajuste permisos según política de seguridad (solo lectura en E_*/I_* es el caso habitual).


3. Publicar artefactos

Desde una estación de build (o el propio servidor con SDK/Node):

cd C:\ruta\arcor-gotruck-backoffice-web
.\scripts\publish-iis.ps1 `
  -WebOutput C:\Deploy\gotruck\wwwroot `
  -ApiOutput C:\Deploy\gotruck\api

Esto ejecuta:

Configuración de producción de la API

Opción A — Variable de entorno del App Pool (recomendada para la cadena de conexión)

Configurar la cadena de conexión como variable de entorno mantiene las credenciales SQL fuera de cualquier archivo en disco y simplifica las actualizaciones (no hay archivo que preservar entre versiones).

Vía IIS Manager (Windows Server 2016 / IIS 10+):

  1. IIS Manager → Application Pools → GoTruckApi → Advanced Settings → Environment Variables.
  2. Agregar entrada:
Nombre Valor
ConnectionStrings__DefaultConnection Server=(local);Database=ArcorGev5Reparto;User Id=gotruck_app;Password=***;Encrypt=True;TrustServerCertificate=False;MultipleActiveResultSets=true

Vía web.config del sitio de la API (dentro del elemento <aspNetCore>):

<environmentVariables>
  <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Production" />
  <environmentVariable name="ConnectionStrings__DefaultConnection"
    value="Server=(local);Database=ArcorGev5Reparto;User Id=gotruck_app;Password=***;..." />
</environmentVariables>

ASP.NET Core usa __ (doble guión bajo) como separador de jerarquía en variables de entorno. ConnectionStrings__DefaultConnection equivale a ConnectionStrings:DefaultConnection en JSON.

La variable de entorno tiene mayor precedencia que appsettings.Production.json. Si está definida, el valor del archivo es ignorado automáticamente.

Opción B — Archivo appsettings.Production.json

Si no es posible configurar variables de entorno en el servidor, copie y edite:

deploy\iis\appsettings.Production.example.json
  -> C:\Deploy\gotruck\api\appsettings.Production.json
Clave Acción
ConnectionStrings:DefaultConnection Servidor local: (local), localhost, .\SQLEXPRESS o servidor\instancia; base ArcorGev5Reparto; usuario SQL o Trusted_Connection=True
Jwt:SigningKey Clave aleatoria ≥ 32 caracteres; no commitear al repositorio
Cors:AllowedOrigins URL pública del sitio IIS, ej. https://gotruck.empresa.local
Kestrel:Endpoints:Loopback:Url http://127.0.0.1:5080 (debe coincidir con web.config)

Asegúrese de que appsettings.Production.json no quede bajo control de versiones. Al actualizar la aplicación, preserve este archivo — el instalador no lo sobreescribe si ya existe y tiene valores válidos.


4. Instalar y registrar la API (localhost)

Opción A — Sitio IIS solo para la API (recomendada con proxy ARR)

  1. Cree un Application Pool GoTruckApi:
  2. .NET CLR version: No Managed Code
  3. Identity: cuenta de servicio con permiso de lectura en carpeta y acceso SQL.

  4. Cree un sitio o aplicación interna:

  5. Enlace: http://127.0.0.1:5080 (solo loopback).
  6. Ruta física: C:\Deploy\gotruck\api.
  7. Pool: GoTruckApi.

  8. El web.config generado por dotnet publish debe contener el módulo AspNetCore. Si falta:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
      </handlers>
      <aspNetCore processPath="dotnet"
                  arguments=".\GoTruckBackoffice.Api.dll"
                  stdoutLogEnabled="true"
                  stdoutLogFile=".\logs\stdout"
                  hostingModel="inprocess">
        <environmentVariables>
          <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Production" />
        </environmentVariables>
      </aspNetCore>
    </system.webServer>
  </location>
</configuration>
  1. Cree la carpeta logs con permisos de escritura para el pool.

  2. Prueba local en el servidor:

Invoke-WebRequest -Uri http://127.0.0.1:5080/api/health -UseBasicParsing

Debe responder JSON con servicio / baseDatosOk.

Opción B — Servicio Windows + Kestrel

Útil si prefiere no hospedar la API en IIS:

cd C:\Deploy\gotruck\api
$env:ASPNETCORE_ENVIRONMENT = "Production"
$env:ASPNETCORE_URLS = "http://127.0.0.1:5080"
# Registrar con sc.exe o NSSM apuntando a: dotnet GoTruckBackoffice.Api.dll

5. Configurar IIS — sitio del frontend

5.1 Habilitar proxy ARR (una vez por servidor)

  1. IIS Manager → seleccionar el servidor (no el sitio).
  2. Application Request Routing Cache → Server Proxy Settings.
  3. Marcar Enable proxy → Apply.

5.2 Crear el sitio

Parámetro Valor típico
Nombre GoTruck BackOffice
Ruta física C:\Deploy\gotruck\wwwroot
Enlace https, host gotruck.empresa.local, puerto 443
Certificado Certificado interno o público según DNS
Application pool GoTruckWeb (sin código administrado)

5.3 web.config del frontend

El archivo en deploy\iis\web.config (copiado por publish-iis.ps1) define:

Si cambia el puerto de la API, edite la URL en la regla de rewrite.

5.4 Permiso para variables de servidor (opcional)

Si IIS exige declarar variables en rewrite:

  1. IIS → sitio → URL Rewrite → View Server Variables.
  2. Permitir HTTP_X_FORWARDED_PROTO y HTTP_X_FORWARDED_HOST para el sitio.

5.5 Documentación

Tras publicar, la ayuda está en:

https://gotruck.empresa.local/docs/index.html


6. Comunicación segura front ↔ back

El SPA (src/Web) llama siempre a rutas relativas /api/.... Con IIS en el mismo host:

  1. El navegador envía Authorization: Bearer … a https://sitio/api/....
  2. IIS termina TLS y reenvía a http://127.0.0.1:5080/api/... (red loopback).
  3. La API valida JWT y consulta SQL Server en localhost.

No se requiere exponer la API en firewall. Configure Cors:AllowedOrigins con la URL HTTPS del sitio por si accede desde otro origen en pruebas.

Swagger en producción: deshabilitado salvo ASPNETCORE_ENVIRONMENT=Development. Para pruebas en servidor use temporalmente Development solo en loopback o acceda a /swagger vía túnel RDP.


7. Checklist post-instalación

# Verificación Comando / acción
1 Health API local GET http://127.0.0.1:5080/api/health
2 Health vía IIS GET https://gotruck.empresa.local/api/health
3 Login POST https://…/api/auth/login con usuario admin (sembrado al primer arranque)
4 SPA carga Abrir https://…/ — panel y menú
5 JWT en rutas protegidas GET https://…/api/dashboard/summary con Bearer
6 SQL legacy baseDatosOk: true en health
7 Documentación https://…/docs/index.html

Cambie la contraseña del usuario admin tras el primer acceso (menú Sistema → Usuarios).


8. Docker equivalente (SQL en el host)

Para pruebas en contenedores sin SQL en Docker (misma idea que IIS):

docker compose -f docker-compose.yml -f docker-compose.app.yml --profile app up -d --build

Ajuste la contraseña en docker-compose.app.yml. El perfil dev sigue levantando SQL en contenedor:

docker compose -f docker-compose.yml -f docker-compose.dev.yml --profile dev up -d --build

9. Mantenimiento y actualización

  1. Detener el sitio o el pool de la API (evitar archivos bloqueados).
  2. Ejecutar de nuevo publish-iis.ps1 hacia carpetas de despliegue.
  3. Revisar appsettings.Production.json (no sobrescribir si está solo en servidor).
  4. Arrancar pools / servicio.
  5. Comprobar /api/health.

Logs


10. Solución de problemas

Síntoma Causa probable Acción
502.3 / 502.5 en /api API caída o puerto distinto Verificar Kestrel/IIS en 5080 y regla rewrite
401 en todo el sitio JWT o reloj del servidor Sincronizar hora; revisar SigningKey
baseDatosOk: false Cadena SQL o firewall SQL Probar con SSMS desde el servidor con el mismo login
SPA en blanco Falta index.html o MIME Revisar build y permisos de wwwroot
CORS en consola Origen distinto al configurado Añadir URL en Cors:AllowedOrigins
ARR no reenvía Proxy deshabilitado Habilitar proxy ARR a nivel servidor

11. Referencias del repositorio

Ruta Uso
deploy/iis/web.config Proxy /api + SPA
deploy/iis/appsettings.Production.example.json Plantilla API
scripts/publish-iis.ps1 Publicación automatizada
docker-compose.yml + docker-compose.*.yml Perfiles dev / app
docker_guia.html Entorno demo con contenedores
../html/api.html Referencia de endpoints

Documento alineado al despliegue Windows Server + IIS + SQL Server local. Actualice hostnames, puertos y credenciales según su infraestructura.