diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml
index a89e1fb..11698fd 100644
--- a/.gitea/workflows/build.yml
+++ b/.gitea/workflows/build.yml
@@ -1,4 +1,4 @@
-name: Build and Push Docker Images
+name: Build and Push Docker Images Production
on:
push:
diff --git a/docker-compose/docker-compose.dcproj b/docker-compose/docker-compose.dcproj
index 09171bd..327f8f1 100644
--- a/docker-compose/docker-compose.dcproj
+++ b/docker-compose/docker-compose.dcproj
@@ -20,11 +20,5 @@
.env
-
- docker-compose.yml
-
-
- docker-compose.yml
-
\ No newline at end of file
diff --git a/docker-compose/docker-compose.production.yml b/docker-compose/docker-compose.production.yml
deleted file mode 100644
index 4144943..0000000
--- a/docker-compose/docker-compose.production.yml
+++ /dev/null
@@ -1,272 +0,0 @@
-services:
- rag-api:
- image: registry.easysoft.ro/apps/myai-rag-api:production
- container_name: myai-rag-api
- environment:
- # ASP.NET
- - ASPNETCORE_ENVIRONMENT=${ASPNETCORE_ENVIRONMENT:-Production}
- - ASPNETCORE_URLS=${ASPNETCORE_URLS:-http://+:8080}
- - APP_ENVIRONMENT_NAME=${APP_ENVIRONMENT_NAME:-myai.production}
- - LogEnvironmentOnStartup=${LogEnvironmentOnStartup:-true}
-
- # Database: matches rag-api appsettings Database section
- - Database__Host=${Database__Host:-sqlserver}
- - Database__Port=${Database__Port:-1433}
- - Database__Name=${Database__Name:-MyAiDb}
- - Database__User=${Database__User:-sa}
- - Database__Password=${Database__Password:-}
- - Database__TrustServerCertificate=${Database__TrustServerCertificate:-true}
-
- # InternalApi: matches rag-api appsettings InternalApi section
- - InternalApi__ApiKey=${RagApi__InternalApiKey:-change-this-internal-key}
- - InternalApi__RequireApiKey=${RagApi__RequireApiKey:-false}
-
- # Rag: matches rag-api appsettings Rag section
- - Rag__MaxFileSizeMb=${Rag__MaxFileSizeMb:-8}
- - Rag__ChunkSize=${Rag__ChunkSize:-900}
- - Rag__ChunkOverlap=${Rag__ChunkOverlap:-150}
- - Rag__MaxTextChars=${Rag__MaxTextChars:-60000}
- - Rag__DefaultTopK=${Rag__DefaultTopK:-20}
- - Rag__MaxTopK=${Rag__MaxTopK:-50}
- - Rag__ClassifyWithAi=${Rag__ClassifyWithAi:-false}
-
- # Ai: matches rag-api appsettings Ai section
- - Ai__Provider=${Ai__Provider:-OpenAI}
- - Ai__OpenAI__ApiKey=${Ai__OpenAI__ApiKey:-}
- - Ai__OpenAI__ChatModel=${Ai__OpenAI__ChatModel:-gpt-4o-mini}
- - Ai__OpenAI__EmbeddingModel=${Ai__OpenAI__EmbeddingModel:-text-embedding-3-small}
- - Ai__OpenAI__TimeoutSeconds=${Ai__OpenAI__TimeoutSeconds:-90}
- - Ai__Ollama__BaseUrl=${Ai__Ollama__BaseUrl:-http://host.docker.internal:11434}
- - Ai__Ollama__ChatModel=${Ai__Ollama__ChatModel:-llama3.1:8b}
- - Ai__Ollama__EmbeddingModel=${Ai__Ollama__EmbeddingModel:-nomic-embed-text}
- - Ai__Ollama__TimeoutSeconds=${Ai__Ollama__TimeoutSeconds:-180}
-
- # Logging / Serilog
- - Logging__LogLevel__Default=${Logging__LogLevel__Default:-Information}
- - Logging__LogLevel__Microsoft=${Logging__LogLevel__Microsoft:-Warning}
- - Logging__LogLevel__Microsoft__AspNetCore=${Logging__LogLevel__Microsoft__AspNetCore:-Warning}
- - Logging__LogLevel__Api=${Logging__LogLevel__Api:-Information}
- - 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__port=${Serilog__WriteTo__2__Args__port:-587}
- - Serilog__WriteTo__2__Args__enableSsl=${Serilog__WriteTo__2__Args__enableSsl:-true}
- volumes:
- - /opt/myai/logs/rag-api:/app/logs
- networks:
- - myai-network
- restart: unless-stopped
- labels:
- - "com.centurylinklabs.watchtower.enable=true"
-
- cv-matcher-api:
- image: registry.easysoft.ro/apps/myai-cv-matcher-api:production
- container_name: myai-cv-matcher-api
- depends_on:
- - rag-api
- environment:
- # ASP.NET
- - ASPNETCORE_ENVIRONMENT=${ASPNETCORE_ENVIRONMENT:-Production}
- - ASPNETCORE_URLS=${ASPNETCORE_URLS:-http://+:8080}
- - APP_ENVIRONMENT_NAME=${APP_ENVIRONMENT_NAME:-myai.production}
- - LogEnvironmentOnStartup=${LogEnvironmentOnStartup:-true}
-
- # Database: matches cv-matcher-api appsettings Database section
- - Database__Host=${Database__Host:-sqlserver}
- - Database__Port=${Database__Port:-1433}
- - Database__Name=${Database__Name:-MyAiDb}
- - Database__User=${Database__User:-sa}
- - Database__Password=${Database__Password:-}
- - Database__TrustServerCertificate=${Database__TrustServerCertificate:-true}
-
- # InternalApi: matches cv-matcher-api appsettings InternalApi section
- - InternalApi__ApiKey=${CvMatcherApi__InternalApiKey:-change-this-internal-key}
- - InternalApi__RequireApiKey=${CvMatcherApi__RequireApiKey:-false}
-
- # RagApi: matches cv-matcher-api appsettings RagApi section
- - RagApi__BaseUrl=${RagApi__BaseUrl:-http://rag-api:8080}
- - RagApi__InternalApiKey=${RagApi__InternalApiKey:-change-this-internal-key}
-
- # Ai: matches cv-matcher-api appsettings Ai section
- - Ai__Provider=${Ai__Provider:-OpenAI}
- - Ai__OpenAI__ApiKey=${Ai__OpenAI__ApiKey:-}
- - Ai__OpenAI__ChatModel=${Ai__OpenAI__ChatModel:-gpt-4o-mini}
- - Ai__OpenAI__TimeoutSeconds=${Ai__OpenAI__TimeoutSeconds:-90}
- - Ai__Ollama__BaseUrl=${Ai__Ollama__BaseUrl:-http://host.docker.internal:11434}
- - Ai__Ollama__ChatModel=${Ai__Ollama__ChatModel:-llama3.1:8b}
- - Ai__Ollama__TimeoutSeconds=${Ai__Ollama__TimeoutSeconds:-180}
-
- # Matcher: matches cv-matcher-api appsettings Matcher section
- - Matcher__TopK=${Matcher__TopK:-10}
- - Matcher__DeepScoreTopN=${Matcher__DeepScoreTopN:-5}
- - Matcher__MaxJobTextChars=${Matcher__MaxJobTextChars:-60000}
-
- # Logging / Serilog
- - Logging__LogLevel__Default=${Logging__LogLevel__Default:-Information}
- - Logging__LogLevel__Microsoft=${Logging__LogLevel__Microsoft:-Warning}
- - Logging__LogLevel__Microsoft__AspNetCore=${Logging__LogLevel__Microsoft__AspNetCore:-Warning}
- - Logging__LogLevel__Api=${Logging__LogLevel__Api:-Information}
- - 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__port=${Serilog__WriteTo__2__Args__port:-587}
- - Serilog__WriteTo__2__Args__enableSsl=${Serilog__WriteTo__2__Args__enableSsl:-true}
- volumes:
- - /opt/myai/logs/cv-matcher-api:/app/logs
- networks:
- - myai-network
- restart: unless-stopped
- labels:
- - "com.centurylinklabs.watchtower.enable=true"
-
- api:
- image: registry.easysoft.ro/apps/myai-api:production
- container_name: myai-api
- depends_on:
- - cv-matcher-api
- environment:
- # ASP.NET
- - ASPNETCORE_ENVIRONMENT=${ASPNETCORE_ENVIRONMENT:-Production}
- - ASPNETCORE_URLS=${ASPNETCORE_URLS:-http://+:8080}
- - APP_ENVIRONMENT_NAME=${APP_ENVIRONMENT_NAME:-myai.production}
- - LogEnvironmentOnStartup=${LogEnvironmentOnStartup:-true}
-
- # Google: matches api appsettings Google section
- - Google__TagManagerId=${Google__TagManagerId:-}
- - Google__MapKey=${Google__MapKey:-}
-
- # Contact / Subscribe: matches api appsettings Contact and Subscribe sections
- - Contact__ToEmail=${Contact__ToEmail:-}
- - Contact__FromEmail=${Contact__FromEmail:-${Smtp__Username:-}}
- - Contact__SubjectPrefix=${Contact__SubjectPrefix:-}
- - Subscribe__ToEmail=${Subscribe__ToEmail:-}
- - Subscribe__SubjectPrefix=${Subscribe__SubjectPrefix:-}
-
- # SMTP: matches api appsettings Smtp section
- - Smtp__Host=${Smtp__Host:-mail.example.com}
- - Smtp__Port=${Smtp__Port:-587}
- - Smtp__Username=${Smtp__Username:-}
- - Smtp__Password=${Smtp__Password:-}
- - Smtp__UseStartTls=${Smtp__UseStartTls:-false}
-
- # Captcha: matches api appsettings Captcha section
- - Captcha__Provider=${Captcha__Provider:-Recaptcha}
- - Captcha__SecretKey=${Captcha__SecretKey:-}
- - Captcha__PublicKey=${Captcha__PublicKey:-}
- - Captcha__MinimumScore=${Captcha__MinimumScore:-0.5}
-
- # FileStorage: matches api appsettings FileStorage section
- - FileStorage__Path=${FileStorage__Path:-Files}
- - FileStorage__DefaultFileName=${FileStorage__DefaultFileName:-}
- - FileStorage__ToEmail=${FileStorage__ToEmail:-}
- - FileStorage__FromEmail=${FileStorage__FromEmail:-${Smtp__Username:-}}
- - FileStorage__SubjectPrefix=${FileStorage__SubjectPrefix:-[File Download]}
-
- # CvMatcherApi: matches api appsettings CvMatcherApi section
- - CvMatcherApi__BaseUrl=${CvMatcherApi__BaseUrl:-http://cv-matcher-api:8080}
- - CvMatcherApi__InternalApiKey=${CvMatcherApi__InternalApiKey:-change-this-internal-key}
-
- # Rate Limiting: matches api appsettings RateLimiting section
- - RateLimiting__Global__PermitLimit=${RateLimiting__Global__PermitLimit:-120}
- - RateLimiting__Global__Window=${RateLimiting__Global__Window:-00:01:00}
- - RateLimiting__Global__QueueLimit=${RateLimiting__Global__QueueLimit:-0}
- - RateLimiting__Policies__contact__PermitLimit=${RateLimiting__Policies__contact__PermitLimit:-5}
- - RateLimiting__Policies__contact__Window=${RateLimiting__Policies__contact__Window:-00:01:00}
- - RateLimiting__Policies__contact__QueueLimit=${RateLimiting__Policies__contact__QueueLimit:-0}
- - RateLimiting__Policies__cvMatcher__PermitLimit=${RateLimiting__Policies__cvMatcher__PermitLimit:-10}
- - RateLimiting__Policies__cvMatcher__Window=${RateLimiting__Policies__cvMatcher__Window:-00:10:00}
- - RateLimiting__Policies__cvMatcher__QueueLimit=${RateLimiting__Policies__cvMatcher__QueueLimit:-0}
-
- # CORS: not in the uploaded api appsettings, but used by your API startup config.
- - Cors__AllowedOrigins__0=${Cors__AllowedOrigins__0:-http://localhost:5000}
- - Cors__AllowedOrigins__1=${Cors__AllowedOrigins__1:-http://web:8080}
-
- # Logging / Serilog
- - Logging__LogLevel__Default=${Logging__LogLevel__Default:-Information}
- - Logging__LogLevel__Microsoft=${Logging__LogLevel__Microsoft:-Warning}
- - Logging__LogLevel__Microsoft__AspNetCore=${Logging__LogLevel__Microsoft__AspNetCore:-Warning}
- - Logging__LogLevel__Api=${Logging__LogLevel__Api:-Information}
- - 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__port=${Serilog__WriteTo__2__Args__port:-587}
- - Serilog__WriteTo__2__Args__enableSsl=${Serilog__WriteTo__2__Args__enableSsl:-true}
- volumes:
- - /opt/myai/logs/api:/app/logs
- - /opt/myai/files:/app/Files
- networks:
- - myai-network
- restart: unless-stopped
- labels:
- - "com.centurylinklabs.watchtower.enable=true"
-
- cv-cleanup-job:
- image: registry.easysoft.ro/apps/myai-cv-cleanup-job:production
- container_name: myai-cv-cleanup-job
- depends_on:
- - api
- environment:
- # Worker + diagnostics (matches Jobs/cv-cleanup-job appsettings)
- - ASPNETCORE_ENVIRONMENT=${ASPNETCORE_ENVIRONMENT:-Production}
- - APP_ENVIRONMENT_NAME=${APP_ENVIRONMENT_NAME:-myai.production}
- - LogEnvironmentOnStartup=${LogEnvironmentOnStartup:-true}
-
- # FileStorage: matches cv-cleanup-job appsettings FileStorage section
- - FileStorage__Path=Files
-
- # Jobs: matches cv-cleanup-job appsettings Jobs:Tasks
- - Jobs__Tasks__0__Enabled=${Jobs__CvStorageCleanupEnabled:-true}
- - Jobs__Tasks__0__Interval=${Jobs__CvStorageCleanupInterval:-01:00:00}
- - Jobs__Tasks__0__Parameters__MaxTotalSizeMegabytes=${Jobs__CvStorageMaxTotalSizeMegabytes:-40}
-
- # Logging / Serilog (matches Jobs/cv-cleanup-job appsettings Serilog section; WriteTo index 2 = Email)
- - Logging__LogLevel__Default=${Logging__LogLevel__Default:-Information}
- - Logging__LogLevel__Microsoft=${Logging__LogLevel__Microsoft:-Warning}
- - Logging__LogLevel__Microsoft__Hosting__Lifetime=${Logging__LogLevel__Microsoft__Hosting__Lifetime:-Information}
- - Logging__LogLevel__CvCleanupJob=${Logging__LogLevel__CvCleanupJob:-Information}
- - Logging__LogLevel__JobScheduler=${Logging__LogLevel__JobScheduler:-Information}
- - Serilog__MinimumLevel__Override__CvCleanupJob=${Serilog__MinimumLevel__Override__CvCleanupJob:-Information}
- - Serilog__MinimumLevel__Override__JobScheduler=${Serilog__MinimumLevel__Override__JobScheduler:-Information}
- - 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__port=${Serilog__WriteTo__2__Args__port:-587}
- - Serilog__WriteTo__2__Args__enableSsl=${Serilog__WriteTo__2__Args__enableSsl:-true}
- volumes:
- - /opt/myai/logs/cv-cleanup-job:/app/logs
- - /opt/myai/files:/app/Files
- networks:
- - myai-network
- restart: unless-stopped
- labels:
- - "com.centurylinklabs.watchtower.enable=true"
-
- web:
- image: registry.easysoft.ro/apps/myai-web:production
- container_name: myai-web
- depends_on:
- - api
- ports:
- - "5140:8080"
- environment:
- - ASPNETCORE_ENVIRONMENT=${ASPNETCORE_ENVIRONMENT:-Production}
- - ASPNETCORE_URLS=${ASPNETCORE_URLS:-http://+:8080}
- - APP_ENVIRONMENT_NAME=${APP_ENVIRONMENT_NAME:-myai.production}
-
- # Site: matches web appsettings Site section (Normal, UnderConstruction, Unavailable)
- - Site__Mode=${Site__Mode:-Normal}
- networks:
- - myai-network
- restart: unless-stopped
-
-networks:
- myai-network:
- driver: bridge
\ No newline at end of file
diff --git a/docker-compose/docker-compose.staging.yml b/docker-compose/docker-compose.staging.yml
deleted file mode 100644
index da7ae99..0000000
--- a/docker-compose/docker-compose.staging.yml
+++ /dev/null
@@ -1,272 +0,0 @@
-services:
- rag-api:
- image: registry.easysoft.ro/apps/myai-rag-api:staging
- container_name: myai-rag-api
- environment:
- # ASP.NET
- - ASPNETCORE_ENVIRONMENT=${ASPNETCORE_ENVIRONMENT:-Staging}
- - ASPNETCORE_URLS=${ASPNETCORE_URLS:-http://+:8080}
- - APP_ENVIRONMENT_NAME=${APP_ENVIRONMENT_NAME:-myai.staging}
- - LogEnvironmentOnStartup=${LogEnvironmentOnStartup:-true}
-
- # Database: matches rag-api appsettings Database section
- - Database__Host=${Database__Host:-sqlserver}
- - Database__Port=${Database__Port:-1433}
- - Database__Name=${Database__Name:-MyAiDb}
- - Database__User=${Database__User:-sa}
- - Database__Password=${Database__Password:-}
- - Database__TrustServerCertificate=${Database__TrustServerCertificate:-true}
-
- # InternalApi: matches rag-api appsettings InternalApi section
- - InternalApi__ApiKey=${RagApi__InternalApiKey:-change-this-internal-key}
- - InternalApi__RequireApiKey=${RagApi__RequireApiKey:-false}
-
- # Rag: matches rag-api appsettings Rag section
- - Rag__MaxFileSizeMb=${Rag__MaxFileSizeMb:-8}
- - Rag__ChunkSize=${Rag__ChunkSize:-900}
- - Rag__ChunkOverlap=${Rag__ChunkOverlap:-150}
- - Rag__MaxTextChars=${Rag__MaxTextChars:-60000}
- - Rag__DefaultTopK=${Rag__DefaultTopK:-20}
- - Rag__MaxTopK=${Rag__MaxTopK:-50}
- - Rag__ClassifyWithAi=${Rag__ClassifyWithAi:-false}
-
- # Ai: matches rag-api appsettings Ai section
- - Ai__Provider=${Ai__Provider:-OpenAI}
- - Ai__OpenAI__ApiKey=${Ai__OpenAI__ApiKey:-}
- - Ai__OpenAI__ChatModel=${Ai__OpenAI__ChatModel:-gpt-4o-mini}
- - Ai__OpenAI__EmbeddingModel=${Ai__OpenAI__EmbeddingModel:-text-embedding-3-small}
- - Ai__OpenAI__TimeoutSeconds=${Ai__OpenAI__TimeoutSeconds:-90}
- - Ai__Ollama__BaseUrl=${Ai__Ollama__BaseUrl:-http://host.docker.internal:11434}
- - Ai__Ollama__ChatModel=${Ai__Ollama__ChatModel:-llama3.1:8b}
- - Ai__Ollama__EmbeddingModel=${Ai__Ollama__EmbeddingModel:-nomic-embed-text}
- - Ai__Ollama__TimeoutSeconds=${Ai__Ollama__TimeoutSeconds:-180}
-
- # Logging / Serilog
- - Logging__LogLevel__Default=${Logging__LogLevel__Default:-Information}
- - Logging__LogLevel__Microsoft=${Logging__LogLevel__Microsoft:-Warning}
- - Logging__LogLevel__Microsoft__AspNetCore=${Logging__LogLevel__Microsoft__AspNetCore:-Warning}
- - Logging__LogLevel__Api=${Logging__LogLevel__Api:-Information}
- - 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__port=${Serilog__WriteTo__2__Args__port:-587}
- - Serilog__WriteTo__2__Args__enableSsl=${Serilog__WriteTo__2__Args__enableSsl:-true}
- volumes:
- - /opt/myai/logs/rag-api:/app/logs
- networks:
- - myai-network
- restart: unless-stopped
- labels:
- - "com.centurylinklabs.watchtower.enable=true"
-
- cv-matcher-api:
- image: registry.easysoft.ro/apps/myai-cv-matcher-api:staging
- container_name: myai-cv-matcher-api
- depends_on:
- - rag-api
- environment:
- # ASP.NET
- - ASPNETCORE_ENVIRONMENT=${ASPNETCORE_ENVIRONMENT:-Staging}
- - ASPNETCORE_URLS=${ASPNETCORE_URLS:-http://+:8080}
- - APP_ENVIRONMENT_NAME=${APP_ENVIRONMENT_NAME:-myai.staging}
- - LogEnvironmentOnStartup=${LogEnvironmentOnStartup:-true}
-
- # Database: matches cv-matcher-api appsettings Database section
- - Database__Host=${Database__Host:-sqlserver}
- - Database__Port=${Database__Port:-1433}
- - Database__Name=${Database__Name:-MyAiDb}
- - Database__User=${Database__User:-sa}
- - Database__Password=${Database__Password:-}
- - Database__TrustServerCertificate=${Database__TrustServerCertificate:-true}
-
- # InternalApi: matches cv-matcher-api appsettings InternalApi section
- - InternalApi__ApiKey=${CvMatcherApi__InternalApiKey:-change-this-internal-key}
- - InternalApi__RequireApiKey=${CvMatcherApi__RequireApiKey:-false}
-
- # RagApi: matches cv-matcher-api appsettings RagApi section
- - RagApi__BaseUrl=${RagApi__BaseUrl:-http://rag-api:8080}
- - RagApi__InternalApiKey=${RagApi__InternalApiKey:-change-this-internal-key}
-
- # Ai: matches cv-matcher-api appsettings Ai section
- - Ai__Provider=${Ai__Provider:-OpenAI}
- - Ai__OpenAI__ApiKey=${Ai__OpenAI__ApiKey:-}
- - Ai__OpenAI__ChatModel=${Ai__OpenAI__ChatModel:-gpt-4o-mini}
- - Ai__OpenAI__TimeoutSeconds=${Ai__OpenAI__TimeoutSeconds:-90}
- - Ai__Ollama__BaseUrl=${Ai__Ollama__BaseUrl:-http://host.docker.internal:11434}
- - Ai__Ollama__ChatModel=${Ai__Ollama__ChatModel:-llama3.1:8b}
- - Ai__Ollama__TimeoutSeconds=${Ai__Ollama__TimeoutSeconds:-180}
-
- # Matcher: matches cv-matcher-api appsettings Matcher section
- - Matcher__TopK=${Matcher__TopK:-10}
- - Matcher__DeepScoreTopN=${Matcher__DeepScoreTopN:-5}
- - Matcher__MaxJobTextChars=${Matcher__MaxJobTextChars:-60000}
-
- # Logging / Serilog
- - Logging__LogLevel__Default=${Logging__LogLevel__Default:-Information}
- - Logging__LogLevel__Microsoft=${Logging__LogLevel__Microsoft:-Warning}
- - Logging__LogLevel__Microsoft__AspNetCore=${Logging__LogLevel__Microsoft__AspNetCore:-Warning}
- - Logging__LogLevel__Api=${Logging__LogLevel__Api:-Information}
- - 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__port=${Serilog__WriteTo__2__Args__port:-587}
- - Serilog__WriteTo__2__Args__enableSsl=${Serilog__WriteTo__2__Args__enableSsl:-true}
- volumes:
- - /opt/myai/logs/cv-matcher-api:/app/logs
- networks:
- - myai-network
- restart: unless-stopped
- labels:
- - "com.centurylinklabs.watchtower.enable=true"
-
- api:
- image: registry.easysoft.ro/apps/myai-api:staging
- container_name: myai-api
- depends_on:
- - cv-matcher-api
- environment:
- # ASP.NET
- - ASPNETCORE_ENVIRONMENT=${ASPNETCORE_ENVIRONMENT:-Staging}
- - ASPNETCORE_URLS=${ASPNETCORE_URLS:-http://+:8080}
- - APP_ENVIRONMENT_NAME=${APP_ENVIRONMENT_NAME:-myai.staging}
- - LogEnvironmentOnStartup=${LogEnvironmentOnStartup:-true}
-
- # Google: matches api appsettings Google section
- - Google__TagManagerId=${Google__TagManagerId:-}
- - Google__MapKey=${Google__MapKey:-}
-
- # Contact / Subscribe: matches api appsettings Contact and Subscribe sections
- - Contact__ToEmail=${Contact__ToEmail:-}
- - Contact__FromEmail=${Contact__FromEmail:-${Smtp__Username:-}}
- - Contact__SubjectPrefix=${Contact__SubjectPrefix:-}
- - Subscribe__ToEmail=${Subscribe__ToEmail:-}
- - Subscribe__SubjectPrefix=${Subscribe__SubjectPrefix:-}
-
- # SMTP: matches api appsettings Smtp section
- - Smtp__Host=${Smtp__Host:-mail.example.com}
- - Smtp__Port=${Smtp__Port:-587}
- - Smtp__Username=${Smtp__Username:-}
- - Smtp__Password=${Smtp__Password:-}
- - Smtp__UseStartTls=${Smtp__UseStartTls:-false}
-
- # Captcha: matches api appsettings Captcha section
- - Captcha__Provider=${Captcha__Provider:-Recaptcha}
- - Captcha__SecretKey=${Captcha__SecretKey:-}
- - Captcha__PublicKey=${Captcha__PublicKey:-}
- - Captcha__MinimumScore=${Captcha__MinimumScore:-0.5}
-
- # FileStorage: matches api appsettings FileStorage section
- - FileStorage__Path=${FileStorage__Path:-Files}
- - FileStorage__DefaultFileName=${FileStorage__DefaultFileName:-}
- - FileStorage__ToEmail=${FileStorage__ToEmail:-}
- - FileStorage__FromEmail=${FileStorage__FromEmail:-${Smtp__Username:-}}
- - FileStorage__SubjectPrefix=${FileStorage__SubjectPrefix:-[File Download]}
-
- # CvMatcherApi: matches api appsettings CvMatcherApi section
- - CvMatcherApi__BaseUrl=${CvMatcherApi__BaseUrl:-http://cv-matcher-api:8080}
- - CvMatcherApi__InternalApiKey=${CvMatcherApi__InternalApiKey:-change-this-internal-key}
-
- # Rate Limiting: matches api appsettings RateLimiting section
- - RateLimiting__Global__PermitLimit=${RateLimiting__Global__PermitLimit:-120}
- - RateLimiting__Global__Window=${RateLimiting__Global__Window:-00:01:00}
- - RateLimiting__Global__QueueLimit=${RateLimiting__Global__QueueLimit:-0}
- - RateLimiting__Policies__contact__PermitLimit=${RateLimiting__Policies__contact__PermitLimit:-5}
- - RateLimiting__Policies__contact__Window=${RateLimiting__Policies__contact__Window:-00:01:00}
- - RateLimiting__Policies__contact__QueueLimit=${RateLimiting__Policies__contact__QueueLimit:-0}
- - RateLimiting__Policies__cvMatcher__PermitLimit=${RateLimiting__Policies__cvMatcher__PermitLimit:-10}
- - RateLimiting__Policies__cvMatcher__Window=${RateLimiting__Policies__cvMatcher__Window:-00:10:00}
- - RateLimiting__Policies__cvMatcher__QueueLimit=${RateLimiting__Policies__cvMatcher__QueueLimit:-0}
-
- # CORS: not in the uploaded api appsettings, but used by your API startup config.
- - Cors__AllowedOrigins__0=${Cors__AllowedOrigins__0:-http://localhost:5000}
- - Cors__AllowedOrigins__1=${Cors__AllowedOrigins__1:-http://web:8080}
-
- # Logging / Serilog
- - Logging__LogLevel__Default=${Logging__LogLevel__Default:-Information}
- - Logging__LogLevel__Microsoft=${Logging__LogLevel__Microsoft:-Warning}
- - Logging__LogLevel__Microsoft__AspNetCore=${Logging__LogLevel__Microsoft__AspNetCore:-Warning}
- - Logging__LogLevel__Api=${Logging__LogLevel__Api:-Information}
- - 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__port=${Serilog__WriteTo__2__Args__port:-587}
- - Serilog__WriteTo__2__Args__enableSsl=${Serilog__WriteTo__2__Args__enableSsl:-true}
- volumes:
- - /opt/myai/logs/api:/app/logs
- - /opt/myai/files:/app/Files
- networks:
- - myai-network
- restart: unless-stopped
- labels:
- - "com.centurylinklabs.watchtower.enable=true"
-
- cv-cleanup-job:
- image: registry.easysoft.ro/apps/myai-cv-cleanup-job:staging
- container_name: myai-cv-cleanup-job
- depends_on:
- - api
- environment:
- # Worker + diagnostics (matches Jobs/cv-cleanup-job appsettings)
- - ASPNETCORE_ENVIRONMENT=${ASPNETCORE_ENVIRONMENT:-Staging}
- - APP_ENVIRONMENT_NAME=${APP_ENVIRONMENT_NAME:-myai.staging}
- - LogEnvironmentOnStartup=${LogEnvironmentOnStartup:-true}
-
- # FileStorage: matches cv-cleanup-job appsettings FileStorage section
- - FileStorage__Path=Files
-
- # Jobs: matches cv-cleanup-job appsettings Jobs:Tasks
- - Jobs__Tasks__0__Enabled=${Jobs__CvStorageCleanupEnabled:-true}
- - Jobs__Tasks__0__Interval=${Jobs__CvStorageCleanupInterval:-01:00:00}
- - Jobs__Tasks__0__Parameters__MaxTotalSizeMegabytes=${Jobs__CvStorageMaxTotalSizeMegabytes:-40}
-
- # Logging / Serilog (matches Jobs/cv-cleanup-job appsettings Serilog section; WriteTo index 2 = Email)
- - Logging__LogLevel__Default=${Logging__LogLevel__Default:-Information}
- - Logging__LogLevel__Microsoft=${Logging__LogLevel__Microsoft:-Warning}
- - Logging__LogLevel__Microsoft__Hosting__Lifetime=${Logging__LogLevel__Microsoft__Hosting__Lifetime:-Information}
- - Logging__LogLevel__CvCleanupJob=${Logging__LogLevel__CvCleanupJob:-Information}
- - Logging__LogLevel__JobScheduler=${Logging__LogLevel__JobScheduler:-Information}
- - Serilog__MinimumLevel__Override__CvCleanupJob=${Serilog__MinimumLevel__Override__CvCleanupJob:-Information}
- - Serilog__MinimumLevel__Override__JobScheduler=${Serilog__MinimumLevel__Override__JobScheduler:-Information}
- - 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__port=${Serilog__WriteTo__2__Args__port:-587}
- - Serilog__WriteTo__2__Args__enableSsl=${Serilog__WriteTo__2__Args__enableSsl:-true}
- volumes:
- - /opt/myai/logs/cv-cleanup-job:/app/logs
- - /opt/myai/files:/app/Files
- networks:
- - myai-network
- restart: unless-stopped
- labels:
- - "com.centurylinklabs.watchtower.enable=true"
-
- web:
- image: registry.easysoft.ro/apps/myai-web:staging
- container_name: myai-web
- depends_on:
- - api
- ports:
- - "5140:8080"
- environment:
- - ASPNETCORE_ENVIRONMENT=${ASPNETCORE_ENVIRONMENT:-Staging}
- - ASPNETCORE_URLS=${ASPNETCORE_URLS:-http://+:8080}
- - APP_ENVIRONMENT_NAME=${APP_ENVIRONMENT_NAME:-myai.staging}
-
- # Site: matches web appsettings Site section (Normal, UnderConstruction, Unavailable)
- - Site__Mode=${Site__Mode:-Normal}
- networks:
- - myai-network
- restart: unless-stopped
-
-networks:
- myai-network:
- driver: bridge
\ No newline at end of file
diff --git a/docker-compose/docker-compose.yml b/docker-compose/docker-compose.yml
index 4d8a526..4144943 100644
--- a/docker-compose/docker-compose.yml
+++ b/docker-compose/docker-compose.yml
@@ -1,18 +1,12 @@
services:
rag-api:
- build:
- context: ..
- dockerfile: Apis/rag-api/Dockerfile
+ image: registry.easysoft.ro/apps/myai-rag-api:production
container_name: myai-rag-api
- ports:
- - "8081:8080"
- env_file:
- - .env
environment:
# ASP.NET
- - ASPNETCORE_ENVIRONMENT=${ASPNETCORE_ENVIRONMENT:-Development}
+ - ASPNETCORE_ENVIRONMENT=${ASPNETCORE_ENVIRONMENT:-Production}
- ASPNETCORE_URLS=${ASPNETCORE_URLS:-http://+:8080}
- - APP_ENVIRONMENT_NAME=${APP_ENVIRONMENT_NAME:-myai.local}
+ - APP_ENVIRONMENT_NAME=${APP_ENVIRONMENT_NAME:-myai.production}
- LogEnvironmentOnStartup=${LogEnvironmentOnStartup:-true}
# Database: matches rag-api appsettings Database section
@@ -60,8 +54,7 @@ services:
- Serilog__WriteTo__2__Args__port=${Serilog__WriteTo__2__Args__port:-587}
- Serilog__WriteTo__2__Args__enableSsl=${Serilog__WriteTo__2__Args__enableSsl:-true}
volumes:
- - ../Apis/api/logs:/app/logs
- - ../Apis/api/Files:/app/Files
+ - /opt/myai/logs/rag-api:/app/logs
networks:
- myai-network
restart: unless-stopped
@@ -69,21 +62,15 @@ services:
- "com.centurylinklabs.watchtower.enable=true"
cv-matcher-api:
- build:
- context: ..
- dockerfile: Apis/cv-matcher-api/Dockerfile
+ image: registry.easysoft.ro/apps/myai-cv-matcher-api:production
container_name: myai-cv-matcher-api
depends_on:
- rag-api
- ports:
- - "8082:8080"
- env_file:
- - .env
environment:
# ASP.NET
- - ASPNETCORE_ENVIRONMENT=${ASPNETCORE_ENVIRONMENT:-Development}
+ - ASPNETCORE_ENVIRONMENT=${ASPNETCORE_ENVIRONMENT:-Production}
- ASPNETCORE_URLS=${ASPNETCORE_URLS:-http://+:8080}
- - APP_ENVIRONMENT_NAME=${APP_ENVIRONMENT_NAME:-myai.local}
+ - APP_ENVIRONMENT_NAME=${APP_ENVIRONMENT_NAME:-myai.production}
- LogEnvironmentOnStartup=${LogEnvironmentOnStartup:-true}
# Database: matches cv-matcher-api appsettings Database section
@@ -129,7 +116,7 @@ services:
- Serilog__WriteTo__2__Args__port=${Serilog__WriteTo__2__Args__port:-587}
- Serilog__WriteTo__2__Args__enableSsl=${Serilog__WriteTo__2__Args__enableSsl:-true}
volumes:
- - ../Apis/api/logs:/app/logs
+ - /opt/myai/logs/cv-matcher-api:/app/logs
networks:
- myai-network
restart: unless-stopped
@@ -137,23 +124,15 @@ services:
- "com.centurylinklabs.watchtower.enable=true"
api:
- build:
- context: ..
- dockerfile: Apis/api/Dockerfile
+ image: registry.easysoft.ro/apps/myai-api:production
container_name: myai-api
depends_on:
- cv-matcher-api
- ports:
- - "8080:8080"
- env_file:
- - .env
- # Keep this only if Apis/api/.env contains api-specific overrides not present in docker-compose/.env.
- # - ../Apis/api/.env
environment:
# ASP.NET
- - ASPNETCORE_ENVIRONMENT=${ASPNETCORE_ENVIRONMENT:-Development}
+ - ASPNETCORE_ENVIRONMENT=${ASPNETCORE_ENVIRONMENT:-Production}
- ASPNETCORE_URLS=${ASPNETCORE_URLS:-http://+:8080}
- - APP_ENVIRONMENT_NAME=${APP_ENVIRONMENT_NAME:-myai.local}
+ - APP_ENVIRONMENT_NAME=${APP_ENVIRONMENT_NAME:-myai.production}
- LogEnvironmentOnStartup=${LogEnvironmentOnStartup:-true}
# Google: matches api appsettings Google section
@@ -219,8 +198,8 @@ services:
- Serilog__WriteTo__2__Args__port=${Serilog__WriteTo__2__Args__port:-587}
- Serilog__WriteTo__2__Args__enableSsl=${Serilog__WriteTo__2__Args__enableSsl:-true}
volumes:
- - ../Apis/api/logs:/app/logs
- - ../Apis/api/Files:/app/Files
+ - /opt/myai/logs/api:/app/logs
+ - /opt/myai/files:/app/Files
networks:
- myai-network
restart: unless-stopped
@@ -228,22 +207,18 @@ services:
- "com.centurylinklabs.watchtower.enable=true"
cv-cleanup-job:
- build:
- context: ..
- dockerfile: Jobs/cv-cleanup-job/Dockerfile
+ image: registry.easysoft.ro/apps/myai-cv-cleanup-job:production
container_name: myai-cv-cleanup-job
depends_on:
- api
- env_file:
- - .env
environment:
# Worker + diagnostics (matches Jobs/cv-cleanup-job appsettings)
- - ASPNETCORE_ENVIRONMENT=${ASPNETCORE_ENVIRONMENT:-Development}
- - APP_ENVIRONMENT_NAME=${APP_ENVIRONMENT_NAME:-myai.local}
+ - ASPNETCORE_ENVIRONMENT=${ASPNETCORE_ENVIRONMENT:-Production}
+ - APP_ENVIRONMENT_NAME=${APP_ENVIRONMENT_NAME:-myai.production}
- LogEnvironmentOnStartup=${LogEnvironmentOnStartup:-true}
# FileStorage: matches cv-cleanup-job appsettings FileStorage section
- - FileStorage__Path=${FileStorage__Path:-Files}
+ - FileStorage__Path=Files
# Jobs: matches cv-cleanup-job appsettings Jobs:Tasks
- Jobs__Tasks__0__Enabled=${Jobs__CvStorageCleanupEnabled:-true}
@@ -266,8 +241,8 @@ services:
- Serilog__WriteTo__2__Args__port=${Serilog__WriteTo__2__Args__port:-587}
- Serilog__WriteTo__2__Args__enableSsl=${Serilog__WriteTo__2__Args__enableSsl:-true}
volumes:
- - ../Jobs/cv-cleanup-job/logs:/app/logs
- - ../Apis/api/Files:/app/Files
+ - /opt/myai/logs/cv-cleanup-job:/app/logs
+ - /opt/myai/files:/app/Files
networks:
- myai-network
restart: unless-stopped
@@ -275,20 +250,16 @@ services:
- "com.centurylinklabs.watchtower.enable=true"
web:
- build:
- context: ..
- dockerfile: web/Dockerfile
+ image: registry.easysoft.ro/apps/myai-web:production
container_name: myai-web
depends_on:
- api
ports:
- - "5000:8080"
- env_file:
- - .env
+ - "5140:8080"
environment:
- - ASPNETCORE_ENVIRONMENT=${ASPNETCORE_ENVIRONMENT:-Development}
+ - ASPNETCORE_ENVIRONMENT=${ASPNETCORE_ENVIRONMENT:-Production}
- ASPNETCORE_URLS=${ASPNETCORE_URLS:-http://+:8080}
- - APP_ENVIRONMENT_NAME=${APP_ENVIRONMENT_NAME:-myai.local}
+ - APP_ENVIRONMENT_NAME=${APP_ENVIRONMENT_NAME:-myai.production}
# Site: matches web appsettings Site section (Normal, UnderConstruction, Unavailable)
- Site__Mode=${Site__Mode:-Normal}
@@ -298,4 +269,4 @@ services:
networks:
myai-network:
- driver: bridge
+ driver: bridge
\ No newline at end of file