In this earlier post I wrote about how you might set-up hangfire in .Net 6 using Lite Storage.
In this post, we’ll talk about the Hangfire dashboard, and specifically, some challenges that may arise when trying to run that inside a container.
I won’t go into the container specifically, although if you’re interested in how the container might be set-up then see this beginner’s guide to Docker.
Let’s quickly look at the Docker Compose file, though:
services: my-api: build: .\MyApi ports: - "5010:80" logging: driver: "json-file"
Here you can see that my-api maps port 5010 to port 80.
Hangfire
Let’s see how we would set-up the Hangfire Dashboard:
var builder = WebApplication.CreateBuilder(args); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); builder.Services.AddHttpClient(); builder.Services.AddLogging(); builder.Services.AddHangfire(configuration => { configuration.UseLiteDbStorage("./hf.db"); }); builder.Services.AddHangfireServer(); // Add services here var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); var options = new DashboardOptions() { Authorization = new[] { new MyAuthorizationFilter() } }; app.UseHangfireDashboard("/hangfire", options); app.MapPost(" . . . app.Run(); public class MyAuthorizationFilter : IDashboardAuthorizationFilter { public bool Authorize(DashboardContext context) => true; }
This is the set-up, but there’s a few bits to unpack here.
UseHangfireDashboard
The UseHangfireDashboard basically let’s hangifre know that you want the dashboard setting up. However, by default, it will only allow local connections; which does not include mapped connections via Docker.
DashboardOptions.Authorization
The Authorization property allows you to specify who can view the dashboard. As you can see here, I’ve passed in a custom filter that bypasses all security – probably don’t do this in production – but you can substitute the MyAuthorizationFilter for any implementation you see fit.
Note that if you don’t override this, then attempting to access the dashboard will return a 401 error if you’re running the dashboard from inside a container.
Accessing the Dashboard
Navigating to localhost:5010 on the host will take you here: