feat: add Migrator console project

- Dedicated HrynCo.NotificationService.Migrator console app
- Reads App:ConnectionString from config/env
- Calls db.Database.MigrateAsync() with clear log output
- Own Dockerfile (runtime:10.0 base, no SDK overhead)
- Replaces SDK volume-mount approach in docker-compose
- Added to solution with /docker/Migrator/ folder

Ref: IT-628

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
Anatolii Grynchuk
2026-05-02 02:24:45 +03:00
parent 40b4071eb5
commit a8bc26fe38
6 changed files with 113 additions and 8 deletions
@@ -0,0 +1,46 @@
using HrynCo.NotificationService.DAL.EF;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Serilog;
Log.Logger = new LoggerConfiguration()
.WriteTo.Console()
.CreateBootstrapLogger();
try
{
Log.Information("🚀 Notification Service Migrator starting...");
var host = Host.CreateDefaultBuilder(args)
.UseSerilog((ctx, cfg) => cfg
.ReadFrom.Configuration(ctx.Configuration)
.WriteTo.Console())
.ConfigureServices((ctx, services) =>
{
var connectionString = ctx.Configuration["App:ConnectionString"]
?? throw new InvalidOperationException("App:ConnectionString is not configured.");
services.AddDbContext<NotificationDbContext>(options =>
options.UseNpgsql(connectionString));
})
.Build();
using var scope = host.Services.CreateScope();
var db = scope.ServiceProvider.GetRequiredService<NotificationDbContext>();
Log.Information("Applying migrations...");
await db.Database.MigrateAsync();
Log.Information("Migrations applied successfully.");
}
catch (Exception ex)
{
Log.Fatal(ex, "Migration failed.");
return 1;
}
finally
{
await Log.CloseAndFlushAsync();
}
return 0;