Lenguaje Fráncfort, Alemania

Despliega .NET and ASP.NET Core en Nodion

Nodion reconoce .NET por un archivo de proyecto, una solución o un global.json. El buildpack de .NET ejecuta dotnet publish -c Release con el SDK al que apunta tu proyecto y arranca la app publicada sobre el runtime de ASP.NET Core, escuchando en el puerto que define Nodion; el SDK se queda fuera de la imagen de runtime. La app se ejecuta en Fráncfort, junto a una base de datos PostgreSQL gestionada si la necesitas.

Desplegar en Nodion ›

desde 1 EUR / mes

Hasta 15 € de crédito de bienvenida al registrarte

Detectado por
*.csproj, *.fsproj, *.sln o global.json
Arranque
dotnet <App>.dll en http://0.0.0.0:$PORT
.NET
8, 9, 10 (por defecto)
Región
EU Central (Fráncfort)

Despliega .NET and ASP.NET Core paso a paso

  1. Un proyecto en la raíz, o DOTNET_PROJECT Nodion publica el único .csproj o .fsproj del base directory, en modo framework-dependent. Con varios proyectos, o con una solución cuyos proyectos están en subcarpetas, define en la pestaña Environment DOTNET_PROJECT con la ruta del proyecto web, marcando Build; aun así, la raíz necesita un .sln o un global.json para que Nodion detecte .NET. Apuntar el base directory a la carpeta del proyecto solo funciona si el proyecto no referencia otros proyectos fuera de ella, porque la build no ve nada por encima de esa carpeta. Build variable
    DOTNET_PROJECT=src/MyApp.Web/MyApp.Web.csproj
  2. Deja la dirección en manos de Nodion Nodion arranca la app con ASPNETCORE_URLS=http://0.0.0.0:$PORT. Elimina las URLs fijadas en el código, como app.Run("http://localhost:5000"), y los endpoints de Kestrel en appsettings.json, porque tienen prioridad sobre ella. Una API sin página en / necesita un endpoint de health check; configura su ruta como ruta del health check en los ajustes de la app. Program.cs
    var builder = WebApplication.CreateBuilder(args);
    builder.Services.AddHealthChecks();
    
    var app = builder.Build();
    app.MapHealthChecks("/healthz");
    app.MapGet("/", () => "Hello from Nodion");
    
    app.Run();
  3. Deja AllowedHosts abierto para el health check El health check llama a cada instancia con su IP interna como host. El valor por defecto de la plantilla, "AllowedHosts": "*", lo deja pasar. Con una lista de tus dominios, ASP.NET Core responde 400 y la release nunca se activa; mantén *, o comprueba los hosts en un middleware propio que omita la ruta del health check. appsettings.json
    {
      "AllowedHosts": "*"
    }
  4. Crea la app y vincula PostgreSQL Crea una aplicación desde tu repositorio en la región EU Central y, después, una base de datos PostgreSQL en la misma región. Npgsql usa cadenas de conexión clave-valor, no URLs postgres:// como DATABASE_URL, así que, al vincular la base de datos en la pestaña Environment, inyecta host, port, database, user y password con nombres propios y construye con ellos la cadena de conexión. Program.cs
    var cs = new Npgsql.NpgsqlConnectionStringBuilder
    {
        Host = builder.Configuration["DB_HOST"],
        Port = int.Parse(builder.Configuration["DB_PORT"] ?? "5432"),
        Database = builder.Configuration["DB_NAME"],
        Username = builder.Configuration["DB_USER"],
        Password = builder.Configuration["DB_PASSWORD"],
    }.ConnectionString;
    builder.Services.AddDbContext<AppDbContext>(o => o.UseNpgsql(cs));
  5. Aplica las migraciones de EF Core Nodion no ejecuta las migraciones de EF Core y la imagen de runtime no incluye el SDK, así que dotnet ef no puede ejecutarse como paso de release. Aplícalas al arrancar la app con Database.Migrate(), lo que funciona bien con una sola instancia, o cambia a un Dockerfile que genere un migration bundle de EF Core y lo ejecute como comando de release de la app. Program.cs
    using (var scope = app.Services.CreateScope())
    {
        scope.ServiceProvider.GetRequiredService<AppDbContext>().Database.Migrate();
    }

A tener en cuenta

  • Versión del SDK y del runtimeLa versión de .NET sale de global.json; si no lo hay, de TargetFramework del proyecto en el base directory; si tampoco está, se usa .NET 10. La imagen de runtime recibe el runtime de ASP.NET Core de esa misma versión. Para esto no se lee ningún proyecto en subcarpetas, así que una app net8.0 o net9.0 seleccionada con DOTNET_PROJECT necesita un global.json con esa versión. Nodion instala el SDK actual de esa versión, que puede ser de un feature band más reciente, así que define ahí "rollForward": "latestFeature".
  • Configuración de producciónNodion no define ASPNETCORE_ENVIRONMENT, así que ASP.NET Core se ejecuta como Production y lee appsettings.Production.json además de appsettings.json. Guarda los secretos en variables de entorno marcadas como secretas; ConnectionStrings__Default se corresponde con ConnectionStrings:Default.

Lo que Nodion gestiona por ti

  • Despliegues sin downtime Haz push a tu rama y Nodion construye una nueva release. El tráfico pasa a las nuevas instancias cuando superan el health check; si una release falla, la que está en marcha sigue activa. En cambio, las apps con un volumen local se reinician porque el disco pertenece a una sola instancia.
  • Bases de datos junto a la app PostgreSQL, pgvector, MySQL, Valkey y ClickHouse gestionados en la misma región. Al vincular una base de datos, sus datos de conexión llegan como DATABASE_URL, REDIS_URL o CLICKHOUSE_URL.
  • Previews por pull request Activa las previews: cada pull request de tu repositorio tendrá su propia app, con URL y bases de datos nuevas y vacías. Puedes crearla automáticamente o a mano. Se omiten las pull requests de forks y bots.
  • Workers, cron jobs y escalado Ejecuta workers como procesos adicionales de la misma app, programa tareas en la pestaña Cron y escala cada proceso hasta 16 instancias.
  • Paso de release Con buildpacks, una línea release: del Procfile se ejecuta con cada nueva build. Las apps con Dockerfile, así como los redeploys o rollbacks a una imagen anterior, usan un comando de release definido en la propia app, que además tiene prioridad sobre la línea del Procfile. En los sitios estáticos, el paso de release se ejecuta en una imagen que solo contiene los archivos generados por la build.
  • Logs y métricas Logs de build, release y runtime, además de métricas de CPU, memoria, disco y red de cada instancia, en el dashboard.
  • Dominios y HTTPS Un nombre de host predeterminado con HTTPS desde el primer despliegue; tus propios dominios reciben certificados automáticamente.

Para seguir leyendo

.NET and ASP.NET Core en Nodion: preguntas y respuestas

¿Por qué el despliegue de mi app ASP.NET Core nunca llega a estar listo?

Normalmente el health check recibe un 400 porque AllowedHosts está restringido, un 404 en / en un proyecto de API, o ninguna respuesta porque una URL fijada en el código o un endpoint de Kestrel hace que la app escuche en otro sitio. Deja AllowedHosts en *, configura una ruta de health check como /healthz y deja que ASPNETCORE_URLS decida la dirección.

¿Puedo desplegar una app Blazor?

Las apps Blazor Server y el proyecto de servidor de una Blazor Web App se ejecutan como apps ASP.NET Core; si el repositorio tiene varios proyectos, apunta DOTNET_PROJECT al proyecto de servidor. Una app Blazor WebAssembly independiente no tiene servidor que arrancar, así que el buildpack de .NET no puede desplegarla: alójala en un proyecto ASP.NET Core o usa un Dockerfile.

¿Ejecuta Nodion las migraciones de EF Core?

No. Aplícalas al arrancar con Database.Migrate(), o genera un migration bundle de EF Core en un Dockerfile y ejecútalo como comando de release. La herramienta dotnet ef necesita el SDK, que no está en la imagen de runtime del buildpack.

¿Funciona F#?

Sí. Un .fsproj se detecta y se publica igual que un .csproj, así que las apps web en F# sobre ASP.NET Core se despliegan de la misma forma.

¿Dónde se ejecuta mi app de .NET and ASP.NET Core?

En la región EU Central, en Fráncfort (Alemania). La build, el registry, la app y sus bases de datos, volúmenes, buckets, logs y métricas permanecen en esa región. La API y el plano de control de Nodion están alojados en Alemania. Nodion GmbH tiene su sede en Stuttgart.

¿Puedo usar .NET and ASP.NET Core conforme al RGPD?

Nodion te ofrece las bases para ello: Nodion GmbH tiene su sede en Stuttgart (Alemania); en la región de Fráncfort, la app, sus bases de datos y sus volúmenes se ejecutan en Alemania. Puedes formalizar electrónicamente el DPA (contrato de encargo del tratamiento, art. 28 del RGPD) en el dashboard. Que tu uso cumpla el RGPD también depende de cómo configures y uses la app.

¿Cuánto cuesta ejecutar .NET and ASP.NET Core en Nodion?

Una instancia de app cuesta desde 1 EUR al mes. La configuración del recuadro de costes cuesta 3.50 EUR al mes: App 2 EUR, PostgreSQL 1.50 EUR. Los precios no incluyen IVA y la facturación es por segundo. Puedes elegir tamaños mayores o más instancias cuando lo necesites.

¿Puedo usar mi propio dominio para mi app de .NET and ASP.NET Core?

Sí. Cada app recibe un nombre de host predeterminado con HTTPS. Añade tu propio dominio en la pestaña Domains de la app; el certificado TLS se emite y se renueva automáticamente.

Dale a tu agente un cloud.

Hasta 15 € de crédito al registrarte.

Continuar con GitHub

o con tu email

Mantente al día.

Novedades del producto, sin spam. Puedes darte de baja cuando quieras.