2023-02-18 08:52:17 +01:00
using Microsoft.AspNetCore.HttpOverrides ;
using Microsoft.Extensions.Options ;
2026-10-01 08:05:56 +02:00
using MongoDB.Bson ;
using MongoDB.Bson.Serialization ;
using MongoDB.Bson.Serialization.Serializers ;
2023-02-18 08:52:17 +01:00
using MongoDB.Driver ;
using MongoDB.Entities ;
using Serilog ;
2023-02-19 00:43:43 +01:00
using PrivaPub.Data ;
using PrivaPub.Extensions ;
2026-10-01 10:46:09 +02:00
using PrivaPub.Infrastructure.Http ;
2023-02-19 00:43:43 +01:00
using PrivaPub.Middleware ;
using PrivaPub.Models ;
using PrivaPub.Services ;
using PrivaPub.StaticServices ;
2023-02-18 08:52:17 +01:00
try
{
var builder = WebApplication . CreateBuilder ( args );
builder . WebHost . ConfigureKestrel ( serverOptions =>
{
if ( builder . Environment . IsProduction ())
{
serverOptions . ListenLocalhost ( 6970
//, options =>
//{
// options.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
//}
);
serverOptions . UseSystemd ();
serverOptions . AddServerHeader = false ;
}
});
builder . Host . UseSerilog (( context , config ) =>
{
config . ReadFrom . Configuration ( context . Configuration );
});
try
{
2023-02-19 00:43:43 +01:00
builder . Services . PrivaPubAppSettingsConfiguration ( builder . Configuration )
. PrivaPubWorkersConfiguration ()
. PrivaPubAuthServicesConfiguration ( builder . Configuration )
. PrivaPubInternalizationConfiguration ( builder . Configuration )
. PrivaPubOptimizationConfiguration ()
. PrivaPubDataBaseConfiguration ()
. PrivaPubServicesConfiguration ()
2026-10-01 10:46:09 +02:00
. PrivaPubFederationConfiguration ( builder . Configuration )
2023-02-19 00:43:43 +01:00
. PrivaPubCORSConfiguration ()
. PrivaPubMiddlewareConfiguration ();
2023-02-18 08:52:17 +01:00
}
catch ( Exception ex )
{
Log . ForContext < Program >(). Fatal ( ex , "{0}.{1}()" , nameof ( Program ), "ConfigureServices" );
throw ;
}
2026-10-01 10:46:09 +02:00
var federationOptions = builder . Configuration . GetSection ( "Federation" ). Get < FederationOptions >() ?? new ();
if ( builder . Environment . IsProduction () && ( federationOptions . AllowPrivateNetworks || federationOptions . AllowPlainHttp ))
throw new InvalidOperationException ( "Federation:AllowPrivateNetworks and Federation:AllowPlainHttp are for test networks and must stay off in Production." );
2023-02-18 08:52:17 +01:00
try
{
2026-10-01 08:05:56 +02:00
BsonSerializer . RegisterSerializer ( new GuidSerializer ( GuidRepresentation . Standard ));
2023-02-18 08:52:17 +01:00
var mongoSettings = builder . Configuration . GetSection ( nameof ( MongoSettings )). Get < MongoSettings >();
await DB . InitAsync ( mongoSettings . Database , MongoClientSettings . FromConnectionString ( mongoSettings . ConnectionString ));
}
catch ( Exception ex )
{
Log . ForContext < Program >(). Fatal ( ex , $"{nameof(Program)}.{nameof(Program)}() DB Instantiation" );
throw ;
}
var app = default ( WebApplication );
try
{
app = builder . Build ();
}
catch ( Exception ex )
{
Log . ForContext < Program >(). Fatal ( ex , "{0}.{1}()" , nameof ( Program ), "Build" );
throw ;
}
try
{
var localizationService = app . Services . GetService < RequestLocalizationOptionsService >();
if ( app . Environment . IsProduction ())
{
app . UseResponseCompression ();
app . UseForwardedHeaders ( new ()
{
ForwardedHeaders = ForwardedHeaders . XForwardedFor | ForwardedHeaders . XForwardedProto
});
}
2026-10-01 08:05:56 +02:00
app . UseSwagger ();
app . UseSwaggerUI ();
2023-02-18 08:52:17 +01:00
app . UseHttpsRedirection ();
app . UseCors ( "DefaultCORS" );
app . UseStaticFiles ();
app . UseRequestLocalization ( await localizationService . Get ());
app . UseRouting ();
app . UseAuthentication ();
app . UseAuthorization ();
//app.UseWhen(context => context.Request.Path.StartsWithSegments("/peasants") ||
// context.Request.Path.StartsWithSegments("/users"),
// app => app.UseSignatureVerification().UseDigestVerification());
2026-10-01 08:05:56 +02:00
app . MapGet ( "/build.json" , () => Results . Json ( new
{
commit = BuildInfo . Commit ,
buildRef = BuildInfo . Ref ,
builtAt = BuildInfo . BuiltAt ,
}));
2023-02-18 08:52:17 +01:00
app . MapControllers ();
//app.MapFallbackToFile("index.html");
}
catch ( Exception ex )
{
Log . ForContext < Program >(). Fatal ( ex , "{0}.{1}()" , nameof ( Program ), "Use" );
throw ;
}
Log . ForContext < Program >(). Information ( $"Starting collAnon at {nameof(Program)}()" );
try
{
var dbClient = app . Services . GetService ( typeof ( DbEntities )) as DbEntities ;
var passwordHasher = app . Services . GetService ( typeof ( IPasswordHasher )) as IPasswordHasher ;
await dbClient . Init ( passwordHasher );
}
catch ( Exception ex )
{
Log . ForContext < Program >(). Warning ( ex , $"{nameof(Program)}.{nameof(Program)}() DB Init" );
}
await app . RunAsync ();
}
catch ( Exception ex )
{
Log . ForContext < Program >(). Fatal ( ex , $"{nameof(Program)}.{nameof(Program)}()" );
2026-10-01 08:05:56 +02:00
Environment . ExitCode = 1 ;
2023-02-18 08:52:17 +01:00
}