Instalación en Windows Server — IIS + SQL Server local
Guía para desplegar GoTruck BackOffice en un servidor Windows Server con:
- SQL Server instalado en el mismo equipo (base operativa
ArcorGev5Reparto). - IIS existente como punto de entrada HTTPS.
- API .NET 8 escuchando solo en localhost (no expuesta directamente).
- Frontend estático servido por IIS con proxy inverso de
/apihacia la API.
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
- RAM: 8 GB mínimo (16 GB si SQL y IIS comparten carga de reportes/mapas).
- Disco: espacio para backup
.baky logs IIS/API. - Red: puerto 443 (HTTPS) hacia el sitio; no abrir el puerto 5080 al firewall perimetral.
Base de datos
- Restaurar o disponer de la base
ArcorGev5Repartoen SQL Server local. - Ver convenciones de lectura (
E_*,I_*) en base_datos_arcor_gev5.html. - La API crea/actualiza la tabla
dbo.Usuariosal arrancar (usuarios del backoffice, no del ERP). - 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:
dotnet publishde la API en Release.npm run builddel SPA y copiadist/awwwroot.- Copia
docs/html/awwwroot\docs\(documentación). - Copia
deploy\iis\web.configalwwwroot.
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+):
- IIS Manager → Application Pools →
GoTruckApi→ Advanced Settings → Environment Variables. - 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__DefaultConnectionequivale aConnectionStrings:DefaultConnectionen 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.jsonno 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)
- Cree un Application Pool
GoTruckApi: - .NET CLR version: No Managed Code
-
Identity: cuenta de servicio con permiso de lectura en carpeta y acceso SQL.
-
Cree un sitio o aplicación interna:
- Enlace:
http://127.0.0.1:5080(solo loopback). - Ruta física:
C:\Deploy\gotruck\api. -
Pool:
GoTruckApi. -
El
web.configgenerado pordotnet publishdebe 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>
-
Cree la carpeta
logscon permisos de escritura para el pool. -
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)
- IIS Manager → seleccionar el servidor (no el sitio).
- Application Request Routing Cache → Server Proxy Settings.
- 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:
- Regla API:
^api/(.*)→http://127.0.0.1:5080/api/{R:1}. - Regla SPA: fallback a
index.html. - Cabeceras
X-Forwarded-*para la API.
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:
- IIS → sitio → URL Rewrite → View Server Variables.
- Permitir
HTTP_X_FORWARDED_PROTOyHTTP_X_FORWARDED_HOSTpara 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:
- El navegador envía
Authorization: Bearer …ahttps://sitio/api/.... - IIS termina TLS y reenvía a
http://127.0.0.1:5080/api/...(red loopback). - 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
- web → http://localhost:3000 (nginx hace proxy
/apial contenedorapi). - api → usa
host.docker.internalpara alcanzar SQL Server del host Windows.
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
- Detener el sitio o el pool de la API (evitar archivos bloqueados).
- Ejecutar de nuevo
publish-iis.ps1hacia carpetas de despliegue. - Revisar
appsettings.Production.json(no sobrescribir si está solo en servidor). - Arrancar pools / servicio.
- Comprobar
/api/health.
Logs
- API IIS:
C:\Deploy\gotruck\api\logs\stdout_*.log - IIS: logs W3SVC del sitio.
- SQL: según política del DBA.
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.