feat(health): add custom DB, Qdrant, and Neo4j health check services and secure Qdrant in staging
This commit is contained in:
@@ -55,7 +55,15 @@ public static class DependencyInjection
|
||||
|
||||
// Qdrant Client registration
|
||||
var qdrantUrl = configuration.GetConnectionString("QdrantConnection") ?? "http://localhost:6334";
|
||||
services.AddSingleton<QdrantClient>(sp => new QdrantClient(new Uri(qdrantUrl)));
|
||||
var qdrantApiKey = configuration["Qdrant:ApiKey"];
|
||||
services.AddSingleton<QdrantClient>(sp =>
|
||||
{
|
||||
if (!string.IsNullOrEmpty(qdrantApiKey))
|
||||
{
|
||||
return new QdrantClient(new Uri(qdrantUrl), apiKey: qdrantApiKey);
|
||||
}
|
||||
return new QdrantClient(new Uri(qdrantUrl));
|
||||
});
|
||||
|
||||
// Neo4j Driver registration (supports optional authentication)
|
||||
var neo4jUrl = configuration.GetConnectionString("Neo4jConnection") ?? "bolt://localhost:7687";
|
||||
|
||||
@@ -91,6 +91,10 @@ builder.Services.AddCascadingAuthenticationState();
|
||||
|
||||
builder.Services.AddApplication();
|
||||
builder.Services.AddInfrastructure(builder.Configuration);
|
||||
builder.Services.AddHealthChecks()
|
||||
.AddCheck<NexusReader.Web.Services.DatabaseHealthCheck>("Database")
|
||||
.AddCheck<NexusReader.Web.Services.QdrantHealthCheck>("Qdrant")
|
||||
.AddCheck<NexusReader.Web.Services.Neo4jHealthCheck>("Neo4j");
|
||||
|
||||
builder.Services.AddMediatR(cfg => cfg.RegisterServicesFromAssemblies(
|
||||
NexusReader.Application.DependencyInjection.Assembly,
|
||||
@@ -295,6 +299,7 @@ if (!allowRegistration || !allowPasswordReset)
|
||||
}
|
||||
|
||||
app.MapStaticAssets();
|
||||
app.MapHealthChecks("/health");
|
||||
app.MapHub<NexusReader.Infrastructure.RealTime.SyncHub>("/synchub");
|
||||
|
||||
// API endpoint for WASM client to fetch EPUB content
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
using Microsoft.Extensions.Diagnostics.HealthChecks;
|
||||
using NexusReader.Data.Persistence;
|
||||
using System;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace NexusReader.Web.Services;
|
||||
|
||||
public class DatabaseHealthCheck : IHealthCheck
|
||||
{
|
||||
private readonly AppDbContext _dbContext;
|
||||
|
||||
public DatabaseHealthCheck(AppDbContext dbContext)
|
||||
{
|
||||
_dbContext = dbContext;
|
||||
}
|
||||
|
||||
public async Task<HealthCheckResult> CheckHealthAsync(
|
||||
HealthCheckContext context, CancellationToken cancellationToken = default)
|
||||
{
|
||||
try
|
||||
{
|
||||
var canConnect = await _dbContext.Database.CanConnectAsync(cancellationToken);
|
||||
if (canConnect)
|
||||
{
|
||||
return HealthCheckResult.Healthy("Database is accessible.");
|
||||
}
|
||||
return HealthCheckResult.Unhealthy("Cannot connect to the database.");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return HealthCheckResult.Unhealthy("Database health check failed with exception.", ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
using Microsoft.Extensions.Diagnostics.HealthChecks;
|
||||
using Neo4j.Driver;
|
||||
using System;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace NexusReader.Web.Services;
|
||||
|
||||
public class Neo4jHealthCheck : IHealthCheck
|
||||
{
|
||||
private readonly IDriver _driver;
|
||||
|
||||
public Neo4jHealthCheck(IDriver driver)
|
||||
{
|
||||
_driver = driver;
|
||||
}
|
||||
|
||||
public async Task<HealthCheckResult> CheckHealthAsync(
|
||||
HealthCheckContext context, CancellationToken cancellationToken = default)
|
||||
{
|
||||
try
|
||||
{
|
||||
await _driver.VerifyConnectivityAsync();
|
||||
return HealthCheckResult.Healthy("Neo4j database is accessible.");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return HealthCheckResult.Unhealthy("Neo4j database connectivity check failed.", ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
using Microsoft.Extensions.Diagnostics.HealthChecks;
|
||||
using Qdrant.Client;
|
||||
using System;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace NexusReader.Web.Services;
|
||||
|
||||
public class QdrantHealthCheck : IHealthCheck
|
||||
{
|
||||
private readonly QdrantClient _qdrantClient;
|
||||
|
||||
public QdrantHealthCheck(QdrantClient qdrantClient)
|
||||
{
|
||||
_qdrantClient = qdrantClient;
|
||||
}
|
||||
|
||||
public async Task<HealthCheckResult> CheckHealthAsync(
|
||||
HealthCheckContext context, CancellationToken cancellationToken = default)
|
||||
{
|
||||
try
|
||||
{
|
||||
// Simple check: query collection existence to verify connection is alive
|
||||
_ = await _qdrantClient.CollectionExistsAsync("knowledge_units", cancellationToken);
|
||||
return HealthCheckResult.Healthy("Qdrant database is accessible.");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return HealthCheckResult.Unhealthy("Qdrant database health check failed.", ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user