dotnet publish es el comando que prepara una aplicación .NET y sus dependencias para desplegarla.
Durante el desarrollo solemos pulsar F5 o escribir dotnet run. Eso ejecuta la aplicación con una configuración pensada para programar y depurar.
Para producción usamos normalmente una compilación Release, con las optimizaciones y los artefactos previstos para el despliegue.
Para ir a producción, necesitamos generar una versión Release: optimizada y empaquetada. El comando para esto es dotnet publish.
El comando básico
El comando más sencillo que puedes ejecutar en tu terminal es:
dotnet publish -c Release -o ./publishDesglosemos qué hace esto:
-c Release: Compila en modo Release. El compilador de C# (Roslyn) aplicará optimizaciones agresivas para que tu código corra más rápido.-o ./publish: Guarda el resultado en la carpetapublish.
Dentro de esa carpeta verás los ensamblados, las dependencias, los archivos de configuración y, según el tipo de publicación, un ejecutable nativo. Ese es el conjunto de archivos que desplegamos.
Estrategias de publicación
En .NET moderno, tenemos dos formas principales de empaquetar la aplicación. Elegir la correcta depende de tu servidor.
Es la opción por defecto y no incluye el runtime completo.
- Requisito: El servidor DEBE tener instalado el .NET Runtime de la versión objetivo (por ejemplo, .NET 10 si publicas para .NET 10).
- Ventaja: El despliegue ocupa menos y varias aplicaciones pueden usar el mismo runtime instalado en el servidor.
Esta opción mete todo el Runtime de .NET dentro de tu carpeta de publicación.
- Requisito: No necesita un runtime de .NET instalado, aunque el sistema operativo todavía debe cumplir las dependencias nativas de la plataforma elegida.
- Desventaja: El tamaño crece mucho (100MB+ por una API simple).
- Comando:
# Publicar para Linux 64 bits autocontenido
dotnet publish -c Release -r linux-x64 --self-contained trueKestrel
Cuando ejecutas tu API compilada (./MiApi.exe o dotnet MiApi.dll), quien está escuchando las peticiones HTTP es un servidor web llamado Kestrel.
Kestrel es un servidor web ligero, multiplataforma y extremadamente rápido (open source) que viene integrado en ASP.NET Core.
Kestrel puede exponerse directamente a Internet o colocarse detrás de un proxy inverso. IIS, Nginx, Apache o un balanceador pueden facilitar la terminación TLS, el reparto de carga, los logs de acceso y la integración con la infraestructura existente.
Por eso es habitual usar el patrón de proxy inverso, aunque no es obligatorio en todos los despliegues.
Arquitectura con proxy inverso
En lugar de exponer directamente la aplicación al puerto 80/443 público, ponemos un servidor o balanceador delante que recibe la petición y se la pasa a Kestrel.
- Instala el .NET Core Hosting Bundle en el servidor Windows. Esto instala el Runtime y un módulo para IIS (
AspNetCoreModuleV2). - Crea un sitio web en IIS y apunta a tu carpeta
publish. - El módulo de IIS se encargará de arrancar tu
.exeen segundo plano y redirigir el tráfico.
Al hacer dotnet publish, se genera automáticamente un archivo web.config. No lo borres, es el que le dice a IIS cómo arrancar tu aplicación.
- Copia tus archivos al servidor (ej:
/var/www/miapi). - Crea un servicio Systemd (un archivo
.service) para que tu app arranque sola si se reinicia el servidor.
[Unit]
Description=Mi API .NET
[Service]
WorkingDirectory=/var/www/miapi
ExecStart=/usr/bin/dotnet /var/www/miapi/MiApi.dll
Restart=always
[Install]
WantedBy=multi-user.target- Configura Nginx como Proxy Inverso para que escuche en el puerto 80 y redirija a
localhost:5000(donde escucha Kestrel).
Publicación en un solo archivo
Existe una opción muy atractiva para herramientas de consola, workers o despliegues concretos: empaquetar la aplicación en un único archivo .exe o binario de Linux.
dotnet publish -c Release -r win-x64 -p:PublishSingleFile=true --self-contained trueEl resultado es un solo fichero MiApi.exe. En APIs web puede ser útil, pero no siempre compensa: revisa tamaño, arranque, extracción de archivos nativos y compatibilidad con tu plataforma de despliegue.
Gestión de configuración en producción
Un error clásico es publicar el appsettings.Development.json o tener las cadenas de conexión de desarrollo en el appsettings.json base.
En producción, el orden de carga es:
appsettings.json(Base).appsettings.Production.json(Sobrescribe).- Variables de Entorno (Sobrescribe a todo lo anterior).
La mejor práctica en servidores (IIS/Linux/Docker) es NO tocar los archivos JSON. Usa variables de entorno en el servidor para definir la cadena de conexión y las claves secretas.
- Windows:
set ASPNETCORE_ENVIRONMENT=Production - Linux:
export ASPNETCORE_ENVIRONMENT=Production