# .env.template - Template of environment variables for docker-compose # Copy this file to `.env` (local), `.env.staging`, or `.env.production` and fill the secret values. # Do NOT commit your `.env.*` files containing real secrets. # Docker image tag — must match the tag CI pushes to the registry for this environment. # "staging" for the staging Portainer stack, "production" for the production stack. # For local dev this is ignored (docker-compose.override.yml builds images locally). IMAGE_TAG=staging # Volume base paths — controls where logs and uploaded files are stored on the host. # Portainer (staging/prod): leave unset to use the /opt/myai defaults. # Local dev: set to relative paths so logs and files land in the repo tree. LOGS_PATH=./logs FILES_PATH=../Apis/api/Files # Common ASPNETCORE_ENVIRONMENT=Development # Web (myai-web container) - maps to web appsettings Site:Mode section # Controls the public site experience: # Normal - full site (default) # UnderConstruction - redirect visitors to /under-construction.html # Unavailable - redirect visitors to /site-unavailable.html (HTTP 503) Site__Mode=Normal # API (main) ASPNETCORE_URLS=http://+:8080 APP_ENVIRONMENT_NAME=myai-Development # SMTP Configuration Smtp__Host=your.smtp.host Smtp__Port=587 Smtp__Username=your-smtp-username Smtp__Password= Smtp__UseStartTls=true # AI Settings (choose provider: OpenAI or Ollama) Ai__Provider=OpenAI # OpenAI settings Ai__OpenAI__ApiKey= Ai__OpenAI__ChatModel=gpt-4o-mini Ai__OpenAI__EmbeddingModel=text-embedding-3-large Ai__OpenAI__TimeoutSeconds=30 # Ollama settings Ai__Ollama__BaseUrl=http://localhost:11434 Ai__Ollama__ChatModel=llama2 Ai__Ollama__EmbeddingModel=embedding-model Ai__Ollama__TimeoutSeconds=30 # Database (shared) - maps to Database:Host etc. used by apps Database__Host=sqlserver Database__Port=1433 Database__Name=MyAiDb Database__User=sa Database__Password= Database__TrustServerCertificate=true # RAG settings Rag__MaxFileSizeMb=8 Rag__ChunkSize=900 Rag__ChunkOverlap=150 Rag__MaxTextChars=60000 Rag__DefaultTopK=20 Rag__MaxTopK=50 Rag__ClassifyWithAi=false # Matcher settings (cv-matcher) Matcher__TopK=10 Matcher__DeepScoreTopN=5 Matcher__MaxJobTextChars=60000 # RagApi credentials RagApi__BaseUrl=http://rag-api:8080 RagApi__InternalApiKey= RagApi__RequireApiKey=true # CvMatcher credentials CvMatcherApi__BaseUrl=http://cv-matcher-api:8080 CvMatcherApi__InternalApiKey= CvMatcherApi__RequireApiKey=true # Captcha Captcha__Provider=Recaptcha Captcha__SecretKey= Captcha__PublicKey= Captcha__MinimumScore=0.5 # CV cleanup job container (scheduled CV file storage cleanup) Jobs__CvStorageCleanupEnabled=true Jobs__CvStorageCleanupInterval=01:00:00 Jobs__CvStorageMaxTotalSizeMegabytes=40 # CV search job (job board scraper — triggered by one-click email link) Jobs__CvSearchEnabled=true Jobs__CvSearchInterval=00:00:30 JobSearch__Enabled=true JobSearch__JobSearchLinkBaseUrl=https://myai.ro JobSearch__TokenExpiryDays=7 JobSearch__MinMatchScore=15 JobSearch__MaxJobsToMatch=15 # File Storage FileStorage__Path=Files FileStorage__DefaultFileName= FileStorage__ToEmail= FileStorage__SubjectPrefix=[File Download] # Contact / Subscribe Contact__ToEmail= Contact__SubjectPrefix=[Contact] Subscribe__ToEmail= Subscribe__SubjectPrefix=[Subscribe] # CORS Cors__AllowedOrigins__0=http://localhost:3000 Cors__AllowedOrigins__1=http://localhost:5000 # Logging Logging__LogLevel__Default=Information Logging__LogLevel__Microsoft=Warning Logging__LogLevel__Microsoft__AspNetCore=Warning Logging__LogLevel__Api=Information # Serilog Serilog__WriteTo__2__Args__fromEmail= Serilog__WriteTo__2__Args__toEmail= Serilog__WriteTo__2__Args__mailServer= Serilog__WriteTo__2__Args__networkCredential__userName= Serilog__WriteTo__2__Args__networkCredential__password= Serilog__WriteTo__2__Args__port=587 Serilog__WriteTo__2__Args__enableSsl=true # CvMatcher API internal CvMatcherApi__BaseUrl=http://cv-matcher-api:8081 CvMatcherApi__InternalApiKey= # Rate Limiting (api - public rate limits) # Window uses TimeSpan strings: "hh:mm:ss" (e.g. "00:01:00" = 1 minute, "00:10:00" = 10 minutes). RateLimiting__Global__PermitLimit=120 RateLimiting__Global__Window=00:01:00 RateLimiting__Global__QueueLimit=0 RateLimiting__Policies__contact__PermitLimit=5 RateLimiting__Policies__contact__Window=00:01:00 RateLimiting__Policies__contact__QueueLimit=0 RateLimiting__Policies__cvMatcher__PermitLimit=10 RateLimiting__Policies__cvMatcher__Window=00:10:00 RateLimiting__Policies__cvMatcher__QueueLimit=0