diff --git a/docker-compose/docker-compose.dcproj b/docker-compose/docker-compose.dcproj index 7a3a07a..09171bd 100644 --- a/docker-compose/docker-compose.dcproj +++ b/docker-compose/docker-compose.dcproj @@ -1,4 +1,4 @@ - + 81dded9d-158b-e303-5f62-77a2896d2a5a @@ -20,5 +20,11 @@ .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 new file mode 100644 index 0000000..8bb60b2 --- /dev/null +++ b/docker-compose/docker-compose.production.yml @@ -0,0 +1,214 @@ +version: "3.8" + +services: + rag-api: + image: registry.easysoft.ro/apps/myai-rag-api:production + container_name: myai-rag-api + environment: + # ASP.NET + - ASPNETCORE_ENVIRONMENT=${ASPNETCORE_ENVIRONMENT:-Development} + - ASPNETCORE_URLS=${ASPNETCORE_URLS:-http://+:8080} + - APP_ENVIRONMENT_NAME=${APP_ENVIRONMENT_NAME:-myai.local} + - 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=${InternalApi__ApiKey:-change-this-internal-key} + - InternalApi__RequireApiKey=${InternalApi__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} + 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:-Development} + - ASPNETCORE_URLS=${ASPNETCORE_URLS:-http://+:8080} + - APP_ENVIRONMENT_NAME=${APP_ENVIRONMENT_NAME:-myai.local} + - 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=${InternalApi__ApiKey:-change-this-internal-key} + - InternalApi__RequireApiKey=${InternalApi__RequireApiKey:-false} + + # RagApi: matches cv-matcher-api appsettings RagApi section + # IMPORTANT: this must use the container-internal port, not the host-mapped port. + - RagApi__BaseUrl=${RagApi__BaseUrl:-http://rag-api:8080} + - RagApi__InternalApiKey=${RagApi__InternalApiKey:-${InternalApi__ApiKey:-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} + 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:-Development} + - ASPNETCORE_URLS=${ASPNETCORE_URLS:-http://+:8080} + - APP_ENVIRONMENT_NAME=${APP_ENVIRONMENT_NAME:-myai.local} + - 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:-${InternalApi__ApiKey:-change-this-internal-key}} + + # 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: + - ../api/logs:/app/logs + - ${FileStorage__Path:-../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: + - "5000:8080" + environment: + - ASPNETCORE_ENVIRONMENT=${ASPNETCORE_ENVIRONMENT:-Development} + - ASPNETCORE_URLS=${ASPNETCORE_URLS:-http://+:8080} + - APP_ENVIRONMENT_NAME=${APP_ENVIRONMENT_NAME:-myai.local} + networks: + - myai-network + restart: unless-stopped + +networks: + myai-network: + driver: bridge diff --git a/docker-compose/docker-compose.staging.yml b/docker-compose/docker-compose.staging.yml new file mode 100644 index 0000000..8460a75 --- /dev/null +++ b/docker-compose/docker-compose.staging.yml @@ -0,0 +1,214 @@ +version: "3.8" + +services: + rag-api: + image: registry.easysoft.ro/apps/myai-rag-api:staging + container_name: myai-rag-api + environment: + # ASP.NET + - ASPNETCORE_ENVIRONMENT=${ASPNETCORE_ENVIRONMENT:-Development} + - ASPNETCORE_URLS=${ASPNETCORE_URLS:-http://+:8080} + - APP_ENVIRONMENT_NAME=${APP_ENVIRONMENT_NAME:-myai.local} + - 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=${InternalApi__ApiKey:-change-this-internal-key} + - InternalApi__RequireApiKey=${InternalApi__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} + 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:-Development} + - ASPNETCORE_URLS=${ASPNETCORE_URLS:-http://+:8080} + - APP_ENVIRONMENT_NAME=${APP_ENVIRONMENT_NAME:-myai.local} + - 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=${InternalApi__ApiKey:-change-this-internal-key} + - InternalApi__RequireApiKey=${InternalApi__RequireApiKey:-false} + + # RagApi: matches cv-matcher-api appsettings RagApi section + # IMPORTANT: this must use the container-internal port, not the host-mapped port. + - RagApi__BaseUrl=${RagApi__BaseUrl:-http://rag-api:8080} + - RagApi__InternalApiKey=${RagApi__InternalApiKey:-${InternalApi__ApiKey:-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} + 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:-Development} + - ASPNETCORE_URLS=${ASPNETCORE_URLS:-http://+:8080} + - APP_ENVIRONMENT_NAME=${APP_ENVIRONMENT_NAME:-myai.local} + - 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:-${InternalApi__ApiKey:-change-this-internal-key}} + + # 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: + - ../api/logs:/app/logs + - ${FileStorage__Path:-../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: + - "5000:8080" + environment: + - ASPNETCORE_ENVIRONMENT=${ASPNETCORE_ENVIRONMENT:-Development} + - ASPNETCORE_URLS=${ASPNETCORE_URLS:-http://+:8080} + - APP_ENVIRONMENT_NAME=${APP_ENVIRONMENT_NAME:-myai.local} + networks: + - myai-network + restart: unless-stopped + +networks: + myai-network: + driver: bridge