From 8679bd1efdd8d575d60bbc38b65da63c21e566e3 Mon Sep 17 00:00:00 2001 From: claude Date: Mon, 1 Jun 2026 21:57:06 +0300 Subject: [PATCH] Fix Serilog email sink config for v4 API breaking changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Serilog.Sinks.Email v4 renamed all configuration parameters from their v2 names. The old names were silently ignored, so no error alert emails were ever sent. Parameter renames applied across all 6 appsettings.json and docker-compose: fromEmail → from toEmail → to mailServer → host networkCredential → credentials enableSsl: true → connectionSecurity: StartTls emailSubject → subject outputTemplate → body batchPostingLimit / period removed (v4 batching uses a separate overload) Co-Authored-By: Claude Sonnet 4.6 --- Apis/api/appsettings.json | 16 +++---- Apis/cv-matcher-api/appsettings.json | 16 +++---- Apis/email-api/appsettings.json | 16 +++---- Apis/rag-api/appsettings.json | 16 +++---- Jobs/cv-cleanup-job/appsettings.json | 16 +++---- Jobs/cv-search-job/appsettings.json | 16 +++---- docker-compose/docker-compose.yml | 72 ++++++++++++++-------------- 7 files changed, 78 insertions(+), 90 deletions(-) diff --git a/Apis/api/appsettings.json b/Apis/api/appsettings.json index c3b98df..ab7d3f8 100644 --- a/Apis/api/appsettings.json +++ b/Apis/api/appsettings.json @@ -35,19 +35,17 @@ "Name": "Email", "Args": { "restrictedToMinimumLevel": "Error", - "fromEmail": "", - "toEmail": "", - "mailServer": "", - "networkCredential": { + "from": "", + "to": "", + "host": "", + "credentials": { "userName": "", "password": "" }, "port": 587, - "enableSsl": true, - "emailSubject": "[mihes.ro API] Error Alert", - "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {SourceContext}{NewLine}{Message:lj}{NewLine}{Exception}", - "batchPostingLimit": 10, - "period": "0.00:05:00" + "connectionSecurity": "StartTls", + "subject": "[myAi API] Error Alert", + "body": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {SourceContext}{NewLine}{Message:lj}{NewLine}{Exception}" } } ], diff --git a/Apis/cv-matcher-api/appsettings.json b/Apis/cv-matcher-api/appsettings.json index b3a6aa6..19453e7 100644 --- a/Apis/cv-matcher-api/appsettings.json +++ b/Apis/cv-matcher-api/appsettings.json @@ -35,19 +35,17 @@ "Name": "Email", "Args": { "restrictedToMinimumLevel": "Error", - "fromEmail": "", - "toEmail": "", - "mailServer": "", - "networkCredential": { + "from": "", + "to": "", + "host": "", + "credentials": { "userName": "", "password": "" }, "port": 587, - "enableSsl": true, - "emailSubject": "[mihes.ro API] Error Alert", - "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {SourceContext}{NewLine}{Message:lj}{NewLine}{Exception}", - "batchPostingLimit": 10, - "period": "0.00:05:00" + "connectionSecurity": "StartTls", + "subject": "[myAi] CV Matcher API Error Alert", + "body": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {SourceContext}{NewLine}{Message:lj}{NewLine}{Exception}" } } ], diff --git a/Apis/email-api/appsettings.json b/Apis/email-api/appsettings.json index 76b736c..ea46c3e 100644 --- a/Apis/email-api/appsettings.json +++ b/Apis/email-api/appsettings.json @@ -35,19 +35,17 @@ "Name": "Email", "Args": { "restrictedToMinimumLevel": "Error", - "fromEmail": "", - "toEmail": "", - "mailServer": "", - "networkCredential": { + "from": "", + "to": "", + "host": "", + "credentials": { "userName": "", "password": "" }, "port": 587, - "enableSsl": true, - "emailSubject": "[myAi] Email API Error Alert", - "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {SourceContext}{NewLine}{Message:lj}{NewLine}{Exception}", - "batchPostingLimit": 10, - "period": "0.00:05:00" + "connectionSecurity": "StartTls", + "subject": "[myAi] Email API Error Alert", + "body": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {SourceContext}{NewLine}{Message:lj}{NewLine}{Exception}" } } ], diff --git a/Apis/rag-api/appsettings.json b/Apis/rag-api/appsettings.json index 6328bfd..b75604b 100644 --- a/Apis/rag-api/appsettings.json +++ b/Apis/rag-api/appsettings.json @@ -35,19 +35,17 @@ "Name": "Email", "Args": { "restrictedToMinimumLevel": "Error", - "fromEmail": "", - "toEmail": "", - "mailServer": "", - "networkCredential": { + "from": "", + "to": "", + "host": "", + "credentials": { "userName": "", "password": "" }, "port": 587, - "enableSsl": true, - "emailSubject": "[mihes.ro API] Error Alert", - "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {SourceContext}{NewLine}{Message:lj}{NewLine}{Exception}", - "batchPostingLimit": 10, - "period": "0.00:05:00" + "connectionSecurity": "StartTls", + "subject": "[myAi] RAG API Error Alert", + "body": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {SourceContext}{NewLine}{Message:lj}{NewLine}{Exception}" } } ], diff --git a/Jobs/cv-cleanup-job/appsettings.json b/Jobs/cv-cleanup-job/appsettings.json index 1dc46c2..d1155cd 100644 --- a/Jobs/cv-cleanup-job/appsettings.json +++ b/Jobs/cv-cleanup-job/appsettings.json @@ -36,19 +36,17 @@ "Name": "Email", "Args": { "restrictedToMinimumLevel": "Error", - "fromEmail": "", - "toEmail": "", - "mailServer": "", - "networkCredential": { + "from": "", + "to": "", + "host": "", + "credentials": { "userName": "", "password": "" }, "port": 587, - "enableSsl": true, - "emailSubject": "[mihes.ro CV cleanup job] Error Alert", - "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {SourceContext}{NewLine}{Message:lj}{NewLine}{Exception}", - "batchPostingLimit": 10, - "period": "0.00:05:00" + "connectionSecurity": "StartTls", + "subject": "[myAi] CV Cleanup Job Error Alert", + "body": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {SourceContext}{NewLine}{Message:lj}{NewLine}{Exception}" } } ], diff --git a/Jobs/cv-search-job/appsettings.json b/Jobs/cv-search-job/appsettings.json index e7e9343..f60bec7 100644 --- a/Jobs/cv-search-job/appsettings.json +++ b/Jobs/cv-search-job/appsettings.json @@ -47,19 +47,17 @@ "Name": "Email", "Args": { "restrictedToMinimumLevel": "Error", - "fromEmail": "", - "toEmail": "", - "mailServer": "", - "networkCredential": { + "from": "", + "to": "", + "host": "", + "credentials": { "userName": "", "password": "" }, "port": 587, - "enableSsl": true, - "emailSubject": "[mihes.ro CV search job] Error Alert", - "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {SourceContext}{NewLine}{Message:lj}{NewLine}{Exception}", - "batchPostingLimit": 10, - "period": "0.00:05:00" + "connectionSecurity": "StartTls", + "subject": "[myAi] CV Search Job Error Alert", + "body": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {SourceContext}{NewLine}{Message:lj}{NewLine}{Exception}" } } ], diff --git a/docker-compose/docker-compose.yml b/docker-compose/docker-compose.yml index 96d3cc6..2dcd1d1 100644 --- a/docker-compose/docker-compose.yml +++ b/docker-compose/docker-compose.yml @@ -35,13 +35,13 @@ services: - Ai__Ollama__EmbeddingModel=${Ai__Ollama__EmbeddingModel:-nomic-embed-text} - Ai__Ollama__TimeoutSeconds=${Ai__Ollama__TimeoutSeconds:-180} - - Serilog__WriteTo__2__Args__fromEmail=${Serilog__WriteTo__2__Args__fromEmail:-} - - Serilog__WriteTo__2__Args__toEmail=${Serilog__WriteTo__2__Args__toEmail:-} - - Serilog__WriteTo__2__Args__mailServer=${Serilog__WriteTo__2__Args__mailServer:-} - - Serilog__WriteTo__2__Args__networkCredential__userName=${Serilog__WriteTo__2__Args__networkCredential__userName:-} - - Serilog__WriteTo__2__Args__networkCredential__password=${Serilog__WriteTo__2__Args__networkCredential__password:-} + - Serilog__WriteTo__2__Args__from=${Serilog__WriteTo__2__Args__from:-} + - Serilog__WriteTo__2__Args__to=${Serilog__WriteTo__2__Args__to:-} + - Serilog__WriteTo__2__Args__host=${Serilog__WriteTo__2__Args__host:-} + - Serilog__WriteTo__2__Args__credentials__userName=${Serilog__WriteTo__2__Args__credentials__userName:-} + - Serilog__WriteTo__2__Args__credentials__password=${Serilog__WriteTo__2__Args__credentials__password:-} - Serilog__WriteTo__2__Args__port=${Serilog__WriteTo__2__Args__port:-587} - - Serilog__WriteTo__2__Args__enableSsl=${Serilog__WriteTo__2__Args__enableSsl:-true} + - Serilog__WriteTo__2__Args__connectionSecurity=${Serilog__WriteTo__2__Args__connectionSecurity:-StartTls} volumes: - ${LOGS_PATH:-/opt/myai/logs}/rag-api:/app/logs networks: @@ -85,13 +85,13 @@ services: - Matcher__DeepScoreTopN=${Matcher__DeepScoreTopN:-5} - Matcher__MaxJobTextChars=${Matcher__MaxJobTextChars:-60000} - - Serilog__WriteTo__2__Args__fromEmail=${Serilog__WriteTo__2__Args__fromEmail:-} - - Serilog__WriteTo__2__Args__toEmail=${Serilog__WriteTo__2__Args__toEmail:-} - - Serilog__WriteTo__2__Args__mailServer=${Serilog__WriteTo__2__Args__mailServer:-} - - Serilog__WriteTo__2__Args__networkCredential__userName=${Serilog__WriteTo__2__Args__networkCredential__userName:-} - - Serilog__WriteTo__2__Args__networkCredential__password=${Serilog__WriteTo__2__Args__networkCredential__password:-} + - Serilog__WriteTo__2__Args__from=${Serilog__WriteTo__2__Args__from:-} + - Serilog__WriteTo__2__Args__to=${Serilog__WriteTo__2__Args__to:-} + - Serilog__WriteTo__2__Args__host=${Serilog__WriteTo__2__Args__host:-} + - Serilog__WriteTo__2__Args__credentials__userName=${Serilog__WriteTo__2__Args__credentials__userName:-} + - Serilog__WriteTo__2__Args__credentials__password=${Serilog__WriteTo__2__Args__credentials__password:-} - Serilog__WriteTo__2__Args__port=${Serilog__WriteTo__2__Args__port:-587} - - Serilog__WriteTo__2__Args__enableSsl=${Serilog__WriteTo__2__Args__enableSsl:-true} + - Serilog__WriteTo__2__Args__connectionSecurity=${Serilog__WriteTo__2__Args__connectionSecurity:-StartTls} volumes: - ${LOGS_PATH:-/opt/myai/logs}/cv-matcher-api:/app/logs networks: @@ -126,13 +126,13 @@ services: - FileStorage__Path=${FileStorage__Path:-Files} - - Serilog__WriteTo__2__Args__fromEmail=${Serilog__WriteTo__2__Args__fromEmail:-} - - Serilog__WriteTo__2__Args__toEmail=${Serilog__WriteTo__2__Args__toEmail:-} - - Serilog__WriteTo__2__Args__mailServer=${Serilog__WriteTo__2__Args__mailServer:-} - - Serilog__WriteTo__2__Args__networkCredential__userName=${Serilog__WriteTo__2__Args__networkCredential__userName:-} - - Serilog__WriteTo__2__Args__networkCredential__password=${Serilog__WriteTo__2__Args__networkCredential__password:-} + - Serilog__WriteTo__2__Args__from=${Serilog__WriteTo__2__Args__from:-} + - Serilog__WriteTo__2__Args__to=${Serilog__WriteTo__2__Args__to:-} + - Serilog__WriteTo__2__Args__host=${Serilog__WriteTo__2__Args__host:-} + - Serilog__WriteTo__2__Args__credentials__userName=${Serilog__WriteTo__2__Args__credentials__userName:-} + - Serilog__WriteTo__2__Args__credentials__password=${Serilog__WriteTo__2__Args__credentials__password:-} - Serilog__WriteTo__2__Args__port=${Serilog__WriteTo__2__Args__port:-587} - - Serilog__WriteTo__2__Args__enableSsl=${Serilog__WriteTo__2__Args__enableSsl:-true} + - Serilog__WriteTo__2__Args__connectionSecurity=${Serilog__WriteTo__2__Args__connectionSecurity:-StartTls} volumes: - ${LOGS_PATH:-/opt/myai/logs}/email-api:/app/logs - ${FILES_PATH:-/opt/myai/files}:/app/Files @@ -201,13 +201,13 @@ services: - Cors__AllowedOrigins__0=${Cors__AllowedOrigins__0:-} - Cors__AllowedOrigins__1=${Cors__AllowedOrigins__1:-} - - Serilog__WriteTo__2__Args__fromEmail=${Serilog__WriteTo__2__Args__fromEmail:-} - - Serilog__WriteTo__2__Args__toEmail=${Serilog__WriteTo__2__Args__toEmail:-} - - Serilog__WriteTo__2__Args__mailServer=${Serilog__WriteTo__2__Args__mailServer:-} - - Serilog__WriteTo__2__Args__networkCredential__userName=${Serilog__WriteTo__2__Args__networkCredential__userName:-} - - Serilog__WriteTo__2__Args__networkCredential__password=${Serilog__WriteTo__2__Args__networkCredential__password:-} + - Serilog__WriteTo__2__Args__from=${Serilog__WriteTo__2__Args__from:-} + - Serilog__WriteTo__2__Args__to=${Serilog__WriteTo__2__Args__to:-} + - Serilog__WriteTo__2__Args__host=${Serilog__WriteTo__2__Args__host:-} + - Serilog__WriteTo__2__Args__credentials__userName=${Serilog__WriteTo__2__Args__credentials__userName:-} + - Serilog__WriteTo__2__Args__credentials__password=${Serilog__WriteTo__2__Args__credentials__password:-} - Serilog__WriteTo__2__Args__port=${Serilog__WriteTo__2__Args__port:-587} - - Serilog__WriteTo__2__Args__enableSsl=${Serilog__WriteTo__2__Args__enableSsl:-true} + - Serilog__WriteTo__2__Args__connectionSecurity=${Serilog__WriteTo__2__Args__connectionSecurity:-StartTls} volumes: - ${LOGS_PATH:-/opt/myai/logs}/api:/app/logs - ${FILES_PATH:-/opt/myai/files}:/app/Files @@ -232,13 +232,13 @@ services: - Jobs__Tasks__0__Interval=${Jobs__CvStorageCleanupInterval:-01:00:00} - Jobs__Tasks__0__Parameters__MaxTotalSizeMegabytes=${Jobs__CvStorageMaxTotalSizeMegabytes:-40} - - Serilog__WriteTo__2__Args__fromEmail=${Serilog__WriteTo__2__Args__fromEmail:-} - - Serilog__WriteTo__2__Args__toEmail=${Serilog__WriteTo__2__Args__toEmail:-} - - Serilog__WriteTo__2__Args__mailServer=${Serilog__WriteTo__2__Args__mailServer:-} - - Serilog__WriteTo__2__Args__networkCredential__userName=${Serilog__WriteTo__2__Args__networkCredential__userName:-} - - Serilog__WriteTo__2__Args__networkCredential__password=${Serilog__WriteTo__2__Args__networkCredential__password:-} + - Serilog__WriteTo__2__Args__from=${Serilog__WriteTo__2__Args__from:-} + - Serilog__WriteTo__2__Args__to=${Serilog__WriteTo__2__Args__to:-} + - Serilog__WriteTo__2__Args__host=${Serilog__WriteTo__2__Args__host:-} + - Serilog__WriteTo__2__Args__credentials__userName=${Serilog__WriteTo__2__Args__credentials__userName:-} + - Serilog__WriteTo__2__Args__credentials__password=${Serilog__WriteTo__2__Args__credentials__password:-} - Serilog__WriteTo__2__Args__port=${Serilog__WriteTo__2__Args__port:-587} - - Serilog__WriteTo__2__Args__enableSsl=${Serilog__WriteTo__2__Args__enableSsl:-true} + - Serilog__WriteTo__2__Args__connectionSecurity=${Serilog__WriteTo__2__Args__connectionSecurity:-StartTls} volumes: - ${LOGS_PATH:-/opt/myai/logs}/cv-cleanup-job:/app/logs - ${FILES_PATH:-/opt/myai/files}:/app/Files @@ -283,13 +283,13 @@ services: - Jobs__Tasks__0__Enabled=${Jobs__CvSearchEnabled:-true} - Jobs__Tasks__0__Interval=${Jobs__CvSearchInterval:-00:00:30} - - Serilog__WriteTo__2__Args__fromEmail=${Serilog__WriteTo__2__Args__fromEmail:-} - - Serilog__WriteTo__2__Args__toEmail=${Serilog__WriteTo__2__Args__toEmail:-} - - Serilog__WriteTo__2__Args__mailServer=${Serilog__WriteTo__2__Args__mailServer:-} - - Serilog__WriteTo__2__Args__networkCredential__userName=${Serilog__WriteTo__2__Args__networkCredential__userName:-} - - Serilog__WriteTo__2__Args__networkCredential__password=${Serilog__WriteTo__2__Args__networkCredential__password:-} + - Serilog__WriteTo__2__Args__from=${Serilog__WriteTo__2__Args__from:-} + - Serilog__WriteTo__2__Args__to=${Serilog__WriteTo__2__Args__to:-} + - Serilog__WriteTo__2__Args__host=${Serilog__WriteTo__2__Args__host:-} + - Serilog__WriteTo__2__Args__credentials__userName=${Serilog__WriteTo__2__Args__credentials__userName:-} + - Serilog__WriteTo__2__Args__credentials__password=${Serilog__WriteTo__2__Args__credentials__password:-} - Serilog__WriteTo__2__Args__port=${Serilog__WriteTo__2__Args__port:-587} - - Serilog__WriteTo__2__Args__enableSsl=${Serilog__WriteTo__2__Args__enableSsl:-true} + - Serilog__WriteTo__2__Args__connectionSecurity=${Serilog__WriteTo__2__Args__connectionSecurity:-StartTls} volumes: - ${LOGS_PATH:-/opt/myai/logs}/cv-search-job:/app/logs - ${FILES_PATH:-/opt/myai/files}:/app/Files