/// <summary> /// Called by the Blazor runtime - this is where we setup the HTTP request pipeline and /// initialise all the bits and pieces we need to run. /// </summary> /// <param name="app"></param> /// <param name="env"></param> public void Configure(IApplicationBuilder app, IWebHostEnvironment env, DownloadService download, ThemeService themes, TaskService tasks, ExifService exifService, ThumbnailService thumbService, IndexingService indexService, ImageProcessService imageProcessing, AzureFaceService azureFace, ImageRecognitionService aiService, UserService userService, ConfigService configService, WorkService workService, ImageCache imageCache, MetaDataService metaDataService, ObjectDetector objectDetector) { SyncfusionLicenseProvider.RegisterLicense("NTUxMzEwQDMxMzkyZTM0MmUzMGFRSFpzQUhjdUE2M2V4S1BmYSs5bk13dkpGbkhvam5Wb1VRbGVURkRsOHM9"); var logLevel = configService.Get(ConfigSettings.LogLevel, Serilog.Events.LogEventLevel.Information); Logging.ChangeLogLevel(logLevel); if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Error"); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } if (Logging.Verbose) { app.UseSerilogRequestLogging(); } app.UseResponseCompression(); app.UseRouting(); app.UseResponseCaching(); // Disable this for now // app.UseHttpsRedirection(); // TODO: Do we need this if we serve all the images via the controller? app.UseStaticFiles(); app.UseStaticFiles(new StaticFileOptions { FileProvider = new PhysicalFileProvider(ThumbnailService.PicturesRoot), RequestPath = ThumbnailService.RequestRoot }); // Enable auth app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { //endpoints.MapControllerRoute(name: "default", pattern: "{controller}/{action}"); endpoints.MapControllers(); endpoints.MapBlazorHub(); endpoints.MapFallbackToPage("/_Host"); }); // Prime the cache imageCache.WarmUp().Wait(); // TODO: Save this in ConfigService string contentRootPath = Path.Combine(env.ContentRootPath, "wwwroot"); // TODO: Fix this, or not if Skia doesn't need it imageProcessing.SetContentPath(contentRootPath); download.SetDownloadPath(contentRootPath); themes.SetContentPath(contentRootPath); // Start the work processing queue for AI, Thumbs, etc workService.StartService(); // Start the face service before the thumbnail service azureFace.StartService().Wait(); metaDataService.StartService(); indexService.StartService(); aiService.StartService(); // ObjectDetector can throw a segmentation fault if the docker container is pinned // to a single CPU, so for now, to aid debugging, let's not even try and initialise // it if AI is disabled. See https://github.com/Webreaper/Damselfly/issues/334 if (!configService.GetBool(ConfigSettings.DisableObjectDetector, false)) { objectDetector.InitScorer(); } // Validation check to ensure at least one user is an Admin userService.CheckAdminUser().Wait(); StartTaskScheduler(tasks, download, thumbService, exifService); Logging.StartupCompleted(); Logging.Log("Starting Damselfly webserver..."); }