using Grpc.Net.Client.Configuration; using MareSynchronosShared.Authentication; using MareSynchronosShared.Data; using MareSynchronosShared.Metrics; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.FileProviders; using Prometheus; using System; using System.Collections.Generic; namespace MareSynchronosStaticFilesServer; public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { services.AddHttpContextAccessor(); services.AddTransient(_ => Configuration); var mareSettings = Configuration.GetRequiredSection("MareSynchronos"); bool isSecondary = mareSettings.GetValue("IsSecondaryInstance", false); var defaultMethodConfig = new MethodConfig { Names = { MethodName.Default }, RetryPolicy = new RetryPolicy { MaxAttempts = 100, InitialBackoff = TimeSpan.FromSeconds(1), MaxBackoff = TimeSpan.FromSeconds(5), BackoffMultiplier = 1.5, RetryableStatusCodes = { Grpc.Core.StatusCode.Unavailable } } }; if (!isSecondary) { services.AddSingleton(new MareMetrics(new List { }, new List { MetricsAPI.GaugeFilesTotalSize, MetricsAPI.GaugeFilesTotal })); services.AddHostedService(); } services.AddSingleton(); services.AddDbContextPool(options => { options.UseNpgsql(Configuration.GetConnectionString("DefaultConnection"), builder => { builder.MigrationsHistoryTable("_efmigrationshistory", "public"); }).UseSnakeCaseNamingConvention(); options.EnableThreadSafetyChecks(false); }, mareSettings.GetValue("DbContextPoolSize", 1024)); services.AddAuthentication(options => { options.DefaultScheme = SecretKeyAuthenticationHandler.AuthScheme; }) .AddScheme(SecretKeyAuthenticationHandler.AuthScheme, options => { }); services.AddAuthorization(options => options.FallbackPolicy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build()); services.AddGrpc(o => { o.MaxReceiveMessageSize = null; }); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { bool isSecondary = Configuration.GetSection("MareSynchronos").GetValue("IsSecondaryInstance", false); app.UseHttpLogging(); app.UseRouting(); if (!isSecondary) { var metricServer = new KestrelMetricServer(4981); metricServer.Start(); } app.UseAuthentication(); app.UseAuthorization(); app.UseStaticFiles(new StaticFileOptions() { FileProvider = new PhysicalFileProvider(Configuration.GetRequiredSection("MareSynchronos")["CacheDirectory"]), RequestPath = "/cache", ServeUnknownFileTypes = true, }); if (!isSecondary) { app.UseEndpoints(e => { e.MapGrpcService(); }); } } }