Desarrollé una aplicación de servidor Blazor, que usa EF-Core para acceder a MariaDB. Quiero publicar la aplicación (para producción) en un linux-vServer con Debian 10 (también podría usar Ubuntu) administrado con Plesk. La aplicación debe ejecutarse en un contenedor docker. Soy completamente nuevo en Docker. MariaDB se está ejecutando en Plesk, no en contenedores, quiero acceder a él a través de localhost, 3306. Tengo acceso root y shell.
Este es mi archivo docker:
FROM mcr.microsoft.com/dotnet/aspnet:6.0 COPY . /app WORKDIR /app EXPOSE 8700/tcp ENV ASPNETCORE_URLS http://*:8700 ENV ASPNETCORE_ENVIRONMENT docker FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base WORKDIR /app #EXPOSE 80 #EXPOSE 443 FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build WORKDIR /src COPY ["WebApplication/WebApplication.csproj", "WebApplication/"] COPY ["InvoicingDocuments/InvoicingDocuments.csproj", "InvoicingDocuments/"] COPY ["DataModels/DataModels.csproj", "DataModels/"] COPY ["SmtpMail/SmtpMail.csproj", "SmtpMail/"] RUN dotnet restore "WebApplication/WebApplication.csproj" COPY . . WORKDIR "/src/WebApplication" RUN dotnet build "WebApplication.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "WebApplication.csproj" -c Release -o /app/publish FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "WebApplication.dll"] Estaba ejecutando el comando: docker run -d -p 80:8700 --net host cpp-blazor --net host para poder acceder a localhost-mariaDb.
Primero encontré el error: System.InvalidOperationException: Unable to configure HTTPS endpoint. No server certificate was specified, and the default developer certificate could not be found or is out of date. aunque la página de inicio tenga una configuración de certificado SSL en Plesk. la aplicación salió.
Mi primer acercamiento a este problema fue configurar Kestrel con un archivo pfx siguiendo el video: Entorno de desarrollo HTTPS personalizado usando .NET Core, Kestrel y certificados
Mi Program.cs ahora contiene lo siguiente:
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Threading.Tasks; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; namespace WebApplication { public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureServices((context, services) => { HostConfig.CertPath = "certificate.pfx"; HostConfig.CertPassword = "password"; }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.ConfigureKestrel(opt => { //opt.ListenAnyIP(8701); opt.ListenAnyIP(8700, listOpt => { listOpt.UseHttps(HostConfig.CertPath, HostConfig.CertPassword); }); }); webBuilder.UseStartup<Startup>(); }); } public static class HostConfig { public static string CertPath { get; set; } public static string CertPassword { get; set; } } }certificate.pfx se copia en la compilación y la aplicación lo encuentra. El archivo pfx es un comodín SSL de DigiCert, lo obtuve del proveedor de alojamiento. Funciona bien en Plesk. Obtengo el siguiente resultado del registro de la ventana acoplable:
{"EventId":0,"LogLevel":"Warning","Category":"Microsoft.AspNetCore.Server.Kestrel","Message":"Overriding address(es) \u0027http://\u002B:80\u0027. Binding to endpoints defined via IConfiguration and/or UseKestrel() instead.","State":{"Message":"Overriding address(es) \u0027http://\u002B:80\u0027. Binding to endpoints defined via IConfiguration and/or UseKestrel() instead.","addresses":"http://\u002B:80","{OriginalFormat}":"Overriding address(es) \u0027{addresses}\u0027. Binding to endpoints defined via IConfiguration and/or UseKestrel() instead."}} {"EventId":14,"LogLevel":"Information","Category":"Microsoft.Hosting.Lifetime","Message":"Now listening on: https://[::]:8700","State":{"Message":"Now listening on: https://[::]:8700","address":"https://[::]:8700","{OriginalFormat}":"Now listening on: {address}"}} {"EventId":0,"LogLevel":"Information","Category":"Microsoft.Hosting.Lifetime","Message":"Application started. Press Ctrl\u002BC to shut down.","State":{"Message":"Application started. Press Ctrl\u002BC to shut down.","{OriginalFormat}":"Application started. Press Ctrl\u002BC to shut down."}} {"EventId":0,"LogLevel":"Information","Category":"Microsoft.Hosting.Lifetime","Message":"Hosting environment: Production","State":{"Message":"Hosting environment: Production","envName":"Production","{OriginalFormat}":"Hosting environment: {envName}"}} {"EventId":0,"LogLevel":"Information","Category":"Microsoft.Hosting.Lifetime","Message":"Content root path: /app","State":{"Message":"Content root path: /app","contentRoot":"/app","{OriginalFormat}":"Content root path: {contentRoot}"}} Usando el mismo comando de ejecución de docker, logré encontrar la aplicación ejecutándose bajo https domain.com:80 pero aparece el error SSL_ERROR_RX_RECORD_TOO_LONG cuando navego en el navegador a ese dominio. El contenedor docker no falla. Funciona localmente en mi máquina, solo me dice que el certificado no es de confianza debido a que está asignado a mi dominio y no a localhost. Puedo acceder a la aplicación.
Ya intenté eliminar los certificados de Plesk, lo que resultó en el mismo error o no accedió a la página web.
¿Alguna sugerencia o consejo sobre cómo configurar correctamente el certificado para Blazor Server o ASP.NET Core Hosting en ese caso bajo Linux? No creo que Plesk sea el problema, ya que tengo los mismos problemas cuando uso solo shell.