Linguagem Frankfurt, Alemanha

Faça deploy de .NET and ASP.NET Core na Nodion

A Nodion reconhece .NET por um ficheiro de projeto, uma solution ou um global.json. O buildpack .NET executa dotnet publish -c Release com o SDK que o seu projeto usa como alvo e inicia a aplicação publicada no runtime ASP.NET Core, a escutar na porta que a Nodion define; o SDK fica fora da imagem de execução (run image). A aplicação é executada em Frankfurt, ao lado de uma base de dados PostgreSQL gerida, se precisar de uma.

Fazer deploy na Nodion ›

a partir de 1 EUR / mês

Até 15 € de crédito de boas-vindas no registo

Detetado por
*.csproj, *.fsproj, *.sln ou global.json
Arranque
dotnet <App>.dll em http://0.0.0.0:$PORT
.NET
8, 9, 10 (por omissão)
Região
EU Central (Frankfurt)

Faça deploy de .NET and ASP.NET Core passo a passo

  1. Um projeto na raiz, ou DOTNET_PROJECT A Nodion publica o único .csproj ou .fsproj do Base directory, em modo framework-dependent. Com vários projetos, ou com uma solution cujos projetos estão em subpastas, defina no separador Environment DOTNET_PROJECT com o caminho do projeto web e a opção Build; a raiz continua a precisar de um .sln ou de um global.json para que a Nodion detete .NET. Apontar o Base directory para a pasta do projeto só funciona se o projeto não referenciar projetos fora dela, porque o build não vê nada acima dessa pasta. Build variable
    DOTNET_PROJECT=src/MyApp.Web/MyApp.Web.csproj
  2. Deixe o endereço a cargo da Nodion A Nodion inicia a aplicação com ASPNETCORE_URLS=http://0.0.0.0:$PORT. Remova os URLs fixos no código, como app.Run("http://localhost:5000"), e os endpoints Kestrel em appsettings.json, que têm prioridade sobre essa variável. Uma API sem página em / precisa de um endpoint de health check; defina o caminho dele como caminho do health check nas definições da aplicação. 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. Permita o health check em AllowedHosts O health check chama cada instância com o respetivo IP interno como host. O valor predefinido do template, "AllowedHosts": "*", deixa-o passar. Com uma lista dos seus domínios, o ASP.NET Core responde 400 e a release nunca entra em produção; mantenha *, ou verifique os hosts num middleware próprio que ignore o caminho do health check. appsettings.json
    {
      "AllowedHosts": "*"
    }
  4. Crie a aplicação e associe o PostgreSQL Crie uma aplicação a partir do seu repositório na região EU Central e, depois, uma base de dados PostgreSQL na mesma região. O Npgsql usa connection strings em formato chave-valor, não URLs postgres:// como DATABASE_URL, por isso, ao associar a base de dados no separador Environment, injete host, port, database, user e password com nomes à sua escolha e construa a partir deles a connection string. 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. Aplique as migrações EF Core A Nodion não executa as migrações EF Core, e a imagem de execução não tem SDK, por isso dotnet ef não pode correr como passo de release. Aplique-as no arranque da aplicação com Database.Migrate(), o que funciona bem com uma única instância, ou mude para um Dockerfile que compile um migration bundle do EF Core e o execute como comando de release da aplicação. Program.cs
    using (var scope = app.Services.CreateScope())
    {
        scope.ServiceProvider.GetRequiredService<AppDbContext>().Database.Migrate();
    }

A ter em conta

  • Versão do SDK e do runtimeA linha do .NET vem do global.json; se não existir, do TargetFramework do projeto no Base directory; caso contrário, é usado o .NET 10. A imagem de execução recebe o runtime ASP.NET Core da mesma linha. Um projeto numa subpasta não é lido para este efeito, por isso uma aplicação net8.0 ou net9.0 selecionada com DOTNET_PROJECT precisa de um global.json com essa versão. A Nodion instala o SDK atual dessa linha, que pode pertencer a uma feature band mais recente, por isso defina aí "rollForward": "latestFeature".
  • Definições de produçãoA Nodion não define ASPNETCORE_ENVIRONMENT, por isso o ASP.NET Core corre como Production e lê appsettings.Production.json além de appsettings.json. Guarde os segredos em variáveis de ambiente marcadas como secretas; ConnectionStrings__Default corresponde a ConnectionStrings:Default.

O que a Nodion gere por si

  • Deploys sem downtime Faça push para o seu branch e a Nodion cria uma nova release. O tráfego só muda quando as novas instâncias passam no health check; se uma release falhar, a que está em execução mantém-se. Em vez disso, as aplicações com um volume local são reiniciadas, porque o disco pertence a uma única instância.
  • Bases de dados junto à aplicação PostgreSQL, pgvector, MySQL, Valkey e ClickHouse geridos, na mesma região. As bases de dados associadas chegam como DATABASE_URL, REDIS_URL ou CLICKHOUSE_URL.
  • Pré-visualizações por pull request Ative as pré-visualizações e cada pull request do seu repositório passa a ter uma aplicação própria, com URL próprio e bases de dados novas e vazias, criada automática ou manualmente. Os forks e os pull requests de bots são ignorados.
  • Workers, cron jobs e escalabilidade Execute workers como processos adicionais da mesma aplicação, agende tarefas no separador Cron e escale cada processo até 16 instâncias.
  • Etapa de release Com buildpacks, uma linha release: do Procfile é executada a cada novo build. As aplicações com Dockerfile, bem como os redeploys ou rollbacks para uma imagem anterior, usam um comando de release definido na própria aplicação, que também tem prioridade sobre a linha do Procfile. Nos sites estáticos, a etapa de release é executada numa imagem que contém apenas os ficheiros gerados pelo build.
  • Logs e métricas Logs de build, release e runtime, além de métricas de CPU, memória, disco e rede de cada instância, no dashboard.
  • Domínios e HTTPS Um hostname atribuído por omissão com HTTPS desde o primeiro deploy; os seus próprios domínios recebem certificados automaticamente.

Para saber mais

.NET and ASP.NET Core na Nodion: perguntas e respostas

Porque é que o deploy da minha aplicação ASP.NET Core nunca fica pronto?

Normalmente, o health check recebe um 400 por causa de um AllowedHosts restrito, um 404 em / num projeto de API, ou nenhuma resposta porque um URL fixo no código ou um endpoint Kestrel faz a aplicação escutar noutro sítio. Mantenha AllowedHosts em *, defina um caminho de health check como /healthz e deixe que ASPNETCORE_URLS decida o endereço.

Posso fazer deploy de uma aplicação Blazor?

As aplicações Blazor Server e o projeto de servidor de uma Blazor Web App correm como aplicações ASP.NET Core; se o repositório tiver vários projetos, aponte DOTNET_PROJECT para o projeto de servidor. Uma aplicação Blazor WebAssembly autónoma não tem servidor para iniciar, por isso o buildpack .NET não consegue fazer o deploy dela: aloje-a num projeto ASP.NET Core ou use um Dockerfile.

A Nodion executa as migrações EF Core?

Não. Aplique-as no arranque com Database.Migrate(), ou compile um migration bundle do EF Core num Dockerfile e execute-o como comando de release. A ferramenta dotnet ef precisa do SDK, que não está na imagem de execução do buildpack.

O F# funciona?

Sim. Um .fsproj é detetado e publicado tal como um .csproj, por isso o deploy das aplicações web F# em ASP.NET Core faz-se da mesma forma.

Onde corre a minha aplicação .NET and ASP.NET Core?

Na região EU Central, em Frankfurt (Alemanha). O build, o registry, a aplicação e as respetivas bases de dados, volumes, buckets, logs e métricas ficam nessa região, e a API e o plano de controlo da Nodion estão alojados na Alemanha. A Nodion GmbH tem sede em Stuttgart.

Posso usar .NET and ASP.NET Core em conformidade com o RGPD?

A Nodion cria as condições para isso: a Nodion GmbH tem sede em Stuttgart (Alemanha); na região de Frankfurt, a aplicação, as bases de dados e os volumes são executados na Alemanha. O acordo de tratamento de dados (DPA, art. 28.º do RGPD) é celebrado eletronicamente no dashboard. A conformidade da sua utilização depende também da forma como configura e utiliza a aplicação.

Quanto custa executar .NET and ASP.NET Core na Nodion?

Uma instância da aplicação custa a partir de 1 EUR por mês. A configuração apresentada no quadro de custos custa 3.50 EUR por mês: Aplicação 2 EUR, PostgreSQL 1.50 EUR. Os preços não incluem IVA e a faturação é ao segundo. Pode escolher tamanhos maiores ou mais instâncias sempre que precisar.

Posso usar o meu próprio domínio na minha aplicação .NET and ASP.NET Core?

Sim. Cada aplicação recebe um hostname atribuído por omissão com HTTPS. Adicione o seu próprio domínio no separador Domains da aplicação; o certificado TLS é emitido e renovado automaticamente.

Dê uma cloud ao seu agente.

Ganhe até 15 € de crédito ao registar-se.

Continuar com o GitHub

ou com e-mail

Fique a par das novidades.

Novidades do produto, sem spam. Pode cancelar a subscrição a qualquer momento.