From 6e54b20a02a5992c6ec1fa486c5a450bafab5690 Mon Sep 17 00:00:00 2001 From: Gelu Mihes Date: Wed, 20 May 2026 21:11:25 +0300 Subject: [PATCH] Staging build --- .gitea/workflows/build.yml | 2 +- docker-compose/docker-compose.dcproj | 6 - docker-compose/docker-compose.production.yml | 272 ------------------- docker-compose/docker-compose.staging.yml | 272 ------------------- docker-compose/docker-compose.yml | 77 ++---- 5 files changed, 25 insertions(+), 604 deletions(-) delete mode 100644 docker-compose/docker-compose.production.yml delete mode 100644 docker-compose/docker-compose.staging.yml diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index a89e1fb..6f6865b 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 Staging 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..da7ae99 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:staging container_name: myai-rag-api - ports: - - "8081:8080" - env_file: - - .env environment: # ASP.NET - - ASPNETCORE_ENVIRONMENT=${ASPNETCORE_ENVIRONMENT:-Development} + - ASPNETCORE_ENVIRONMENT=${ASPNETCORE_ENVIRONMENT:-Staging} - ASPNETCORE_URLS=${ASPNETCORE_URLS:-http://+:8080} - - APP_ENVIRONMENT_NAME=${APP_ENVIRONMENT_NAME:-myai.local} + - APP_ENVIRONMENT_NAME=${APP_ENVIRONMENT_NAME:-myai.staging} - 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:staging 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:-Staging} - ASPNETCORE_URLS=${ASPNETCORE_URLS:-http://+:8080} - - APP_ENVIRONMENT_NAME=${APP_ENVIRONMENT_NAME:-myai.local} + - APP_ENVIRONMENT_NAME=${APP_ENVIRONMENT_NAME:-myai.staging} - 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:staging 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:-Staging} - ASPNETCORE_URLS=${ASPNETCORE_URLS:-http://+:8080} - - APP_ENVIRONMENT_NAME=${APP_ENVIRONMENT_NAME:-myai.local} + - APP_ENVIRONMENT_NAME=${APP_ENVIRONMENT_NAME:-myai.staging} - 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:staging 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:-Staging} + - APP_ENVIRONMENT_NAME=${APP_ENVIRONMENT_NAME:-myai.staging} - 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:staging 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:-Staging} - ASPNETCORE_URLS=${ASPNETCORE_URLS:-http://+:8080} - - APP_ENVIRONMENT_NAME=${APP_ENVIRONMENT_NAME:-myai.local} + - APP_ENVIRONMENT_NAME=${APP_ENVIRONMENT_NAME:-myai.staging} # 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