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: