using Microsoft.AspNetCore.HttpOverrides; using Microsoft.Extensions.Options; using MongoDB.Driver; using MongoDB.Entities; using Serilog; using PrivaPub.Data; using PrivaPub.Extensions; using PrivaPub.Middleware; using PrivaPub.Models; using PrivaPub.Models.Data; using PrivaPub.Services; using PrivaPub.StaticServices; try { var builder = WebApplication.CreateBuilder(args); builder.WebHost.ConfigureKestrel(serverOptions => { if (builder.Environment.IsProduction()) { serverOptions.ListenLocalhost(6970 //, options => //{ // options.Protocols = HttpProtocols.Http1AndHttp2AndHttp3; //} ); serverOptions.UseSystemd(); serverOptions.AddServerHeader = false; } }); builder.Host.UseSerilog((context, config) => { config.ReadFrom.Configuration(context.Configuration); }); try { builder.Services.PrivaPubAppSettingsConfiguration(builder.Configuration) .PrivaPubWorkersConfiguration() .PrivaPubAuthServicesConfiguration(builder.Configuration) .PrivaPubInternalizationConfiguration(builder.Configuration) .PrivaPubOptimizationConfiguration() .PrivaPubDataBaseConfiguration() .PrivaPubServicesConfiguration() .PrivaPubHTTPSignature(builder.Configuration) .PrivaPubCORSConfiguration() .PrivaPubMiddlewareConfiguration(); } catch (Exception ex) { Log.ForContext().Fatal(ex, "{0}.{1}()", nameof(Program), "ConfigureServices"); throw; } try { var mongoSettings = builder.Configuration.GetSection(nameof(MongoSettings)).Get(); await DB.InitAsync(mongoSettings.Database, MongoClientSettings.FromConnectionString(mongoSettings.ConnectionString)); var logsConnectionString = builder.Configuration.GetLogsConnectionString(); await DB.InitAsync(mongoSettings.LogsDatabase, MongoClientSettings.FromConnectionString(logsConnectionString)); DB.DatabaseFor(mongoSettings.LogsDatabase); } catch (Exception ex) { Log.ForContext().Fatal(ex, $"{nameof(Program)}.{nameof(Program)}() DB Instantiation"); throw; } var app = default(WebApplication); try { app = builder.Build(); } catch (Exception ex) { Log.ForContext().Fatal(ex, "{0}.{1}()", nameof(Program), "Build"); throw; } try { var localizationService = app.Services.GetService(); if (app.Environment.IsProduction()) { app.UseResponseCompression(); app.UseForwardedHeaders(new() { ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto }); } else if(app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); app.UseCors("DefaultCORS"); app.UseStaticFiles(); app.UseRequestLocalization(await localizationService.Get()); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); //app.UseWhen(context => context.Request.Path.StartsWithSegments("/peasants") || // context.Request.Path.StartsWithSegments("/users"), // app => app.UseSignatureVerification().UseDigestVerification()); app.MapControllers(); //app.MapFallbackToFile("index.html"); } catch (Exception ex) { Log.ForContext().Fatal(ex, "{0}.{1}()", nameof(Program), "Use"); throw; } Log.ForContext().Information($"Starting collAnon at {nameof(Program)}()"); try { var dbClient = app.Services.GetService(typeof(DbEntities)) as DbEntities; var passwordHasher = app.Services.GetService(typeof(IPasswordHasher)) as IPasswordHasher; await dbClient.Init(passwordHasher); } catch (Exception ex) { Log.ForContext().Warning(ex, $"{nameof(Program)}.{nameof(Program)}() DB Init"); } await app.RunAsync(); } catch (Exception ex) { Log.ForContext().Fatal(ex, $"{nameof(Program)}.{nameof(Program)}()"); }