Lenguaje Fráncfort, Alemania
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.
*.csproj, *.fsproj, *.sln o global.jsondotnet <App>.dll en http://0.0.0.0:$PORT.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 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(); "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": "*"
} 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)); 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();
} 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".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.DATABASE_URL, REDIS_URL o CLICKHOUSE_URL. 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. 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.
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.
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.
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.
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.
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.
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.
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.
Hasta 15 € de crédito al registrarte.
o con tu email
Novedades del producto, sin spam. Puedes darte de baja cuando quieras.
Suscripción completada.