NexusCad utiliza Servicios Windows para el backend API en entornos de producción, garantizando disponibilidad continua sin intervención del usuario.
Contexto:
- El Administrator (WPF) necesita una API siempre disponible
- Los usuarios no técnicos no deberían iniciar procesos manualmente
- La API debe arrancar automáticamente con el sistema
Alternativas evaluadas:
| Opción | Ventajas | Desventajas | Decisión |
|---|---|---|---|
| Servicio Windows | ✅ Inicio automático ✅ Siempre disponible ✅ Gestión centralizada |
✅ ELEGIDA para producción | |
| Auto-inicio desde Admin | ✅ Simple ✅ Fácil desarrollo |
❌ Proceso hijo ❌ No sobrevive a cierre del Admin |
❌ Descartada |
| Ejecutable manual | ✅ Muy simple | ❌ El usuario debe iniciarlo ❌ Puede olvidarse |
❌ Descartada |
| Tray Icon | ✅ Visual ✅ Control fácil |
❌ El usuario debe iniciarlo ❌ Complejidad extra |
⏳ Considerada post-MVP |
┌─────────────────────────────────────────────────────────┐
│ ENTORNO DE PRODUCCIÓN │
├─────────────────────────────────────────────────────────┤
│ │
│ Windows Startup │
│ │ │
│ ▼ │
│ ┌──────────────────────────┐ │
│ │ NexusCadApi Service │ (Servicio Windows) │
│ │ (Auto-start) │ │
│ │ │ │
│ │ http://localhost:5140 │ │
│ └────────────┬─────────────┘ │
│ │ REST API │
│ │ │
│ ┌────────┴────────┐ │
│ ▼ ▼ │
│ ┌──────────┐ ┌──────────┐ │
│ │ Admin │ │ Runtime │ │
│ │ (WPF) │ │ (Web) │ │
│ └──────────┘ └──────────┘ │
│ │
└─────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ ENTORNO DE DESARROLLO │
├─────────────────────────────────────────────────────────┤
│ │
│ Visual Studio F5 │
│ │ │
│ ├────────────────┬─────────────────┐ │
│ ▼ ▼ ▼ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ API │ │ Admin │ │ Tests │ │
│ │ (Debug) │ │ (WPF) │ │ (xUnit) │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ │
│ (NO usar servicio Windows durante desarrollo) │
│ │
└─────────────────────────────────────────────────────────┘
graph TD
A[Sistema arranca] --> B[Servicio NexusCadApi inicia]
B --> C[API escucha en puerto 5140]
C --> D[Usuario abre Admin]
D --> E[Admin conecta a API]
E --> F[Usuario trabaja normalmente]
F --> G[Usuario cierra Admin]
G --> C
C --> H[Sistema se apaga]
H --> I[Servicio se detiene limpiamente]
graph TD
A[Developer abre Visual Studio] --> B[F5 - Multiple Startup]
B --> C[API inicia modo Debug]
B --> D[Admin inicia modo Debug]
C --> E[Breakpoints activos]
D --> E
E --> F[Cierra Visual Studio]
F --> G[Procesos terminan]
El proyecto NexusCad.Api debe estar configurado como ejecutable autónomo para funcionar como servicio:
<!-- NexusCad.Api.csproj -->
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<OutputType>Exe</OutputType>
<IsPackable>false</IsPackable>
</PropertyGroup>
</Project>// src/NexusCad.Api/Program.cs
var builder = WebApplication.CreateBuilder(args);
// Configurar para ejecutarse como servicio Windows
builder.Host.UseWindowsService();
// ... resto de configuración ...
var app = builder.Build();
app.Run();El método UseWindowsService() es clave: hace que la aplicación funcione tanto como:
- Aplicación de consola normal (en desarrollo)
- Servicio Windows (en producción)
Ubicación: dev-scripts/
# Como Administrador
.\dev-scripts\install-api-service.ps1Pasos internos:
dotnet publish -c Release→C:\NexusCad\Apisc.exe create NexusCadApi binPath=...sc.exe start NexusCadApi
# Detener servicio para poder compilar
.\dev-scripts\stop-api-service.ps1
# Trabajar normalmente
dotnet build
dotnet run --project src/NexusCad.Api
# Actualizar servicio con cambios
.\dev-scripts\update-api-service.ps1# Como Administrador
.\dev-scripts\uninstall-api-service.ps1Ver dev-scripts/README.md para detalles completos.
Cuando el servicio está corriendo, mantiene los archivos DLL bloqueados:
PS> dotnet build
error MSB3021: Unable to copy file "obj\Debug\net8.0\NexusCad.Api.dll"
to "bin\Debug\net8.0\NexusCad.Api.dll".
The process cannot access the file because it is being used by another process.Solución:
.\dev-scripts\stop-api-service.ps1
dotnet buildFlujo óptimo:
-
Fase de desarrollo:
- NO instalar el servicio
- Usar Visual Studio F5 o
dotnet run - Compilar y probar libremente
-
Antes de entregar a usuario:
- Compilar versión Release
- Instalar como servicio
- Probar end-to-end
-
Después de cambios (con servicio instalado):
- Detener servicio
- Hacer cambios
- Actualizar servicio
# PowerShell
Get-Service NexusCadApi
# CMD
sc.exe query NexusCadApi# Event Viewer
Get-EventLog -LogName Application -Source NexusCadApi -Newest 20
# Si Serilog está configurado para archivos
Get-Content C:\NexusCad\Logs\api-*.log -Tail 50# Comprobar que la API responde
Invoke-RestMethod http://localhost:5140/api/health- Windows Server 2019+ o Windows 10/11
- .NET 8 Runtime instalado
- PostgreSQL 16 corriendo y accesible
- Puerto 5140 disponible
- Cuenta de servicio configurada (opcional, por defecto usa LocalSystem)
-
Clonar repositorio en servidor:
git clone https://github.com/JaviFRx/NexusCad.git C:\NexusCad\Source cd C:\NexusCad\Source
-
Instalar servicio:
# Como Administrador .\dev-scripts\install-api-service.ps1
-
Verificar:
Get-Service NexusCadApi Invoke-RestMethod http://localhost:5140/api/health Start-Process http://localhost:5140/swagger
-
Configurar inicio automático (ya está por defecto):
sc.exe config NexusCadApi start= auto
# En servidor de producción
cd C:\NexusCad\Source
git pull origin main
# Como Administrador
.\dev-scripts\update-api-service.ps1Por defecto, el servicio corre como LocalSystem. Para producción, considera usar una cuenta dedicada:
# Crear cuenta de servicio
$password = ConvertTo-SecureString "Passw0rd123!" -AsPlainText -Force
New-LocalUser -Name "NexusCadSvc" -Password $password -PasswordNeverExpires
# Configurar servicio para usar esa cuenta
sc.exe config NexusCadApi obj= ".\NexusCadSvc" password= "Passw0rd123!"
# Dar permisos a la carpeta
icacls C:\NexusCad\Api /grant "NexusCadSvc:(OI)(CI)F" /TSi necesitas acceso remoto:
New-NetFirewallRule -DisplayName "NexusCad API" `
-Direction Inbound `
-LocalPort 5140 `
-Protocol TCP `
-Action Allow- Microsoft Docs - Windows Services
- .NET Worker Services
- sc.exe command reference
- PLAN.md - Arquitectura completa
- dev-scripts/README.md - Uso de scripts
Última actualización: Fase 1 - Documentación de arquitectura de servicios