Staging to Production #51
@@ -20,11 +20,5 @@
|
||||
<DependentUpon>.env</DependentUpon>
|
||||
</None>
|
||||
<None Include="docker-compose.yml" />
|
||||
<None Include="docker-compose.staging.yml">
|
||||
<DependentUpon>docker-compose.yml</DependentUpon>
|
||||
</None>
|
||||
<None Include="docker-compose.production.yml">
|
||||
<DependentUpon>docker-compose.yml</DependentUpon>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -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
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user