Přeskočit obsah

Konfigurace a secrets


Soubory konfigurace

Soubor Prostředí Popis
appsettings.json Všechna Výchozí hodnoty
appsettings.Development.json Development Lokální přepsání (není v gitu)
appsettings.Development.template.json Šablona pro vývojáře
appsettings.Docker.json Docker Hodnoty pro kontejnery (${ENV_VAR} substituce)

Klíčové konfigurace

Connection string

"ConnectionStrings": {
  "default": "Host=${DB_HOST};Port=${DB_PORT};Database=eva_data;Username=postgres;Password=${DB_PASSWORD}"
}

JWT

"Jwt": {
  "Issuer": "Eva.Mobile.WebApi",
  "Audience": "Eva.Mobile",
  "SecretKey": "${JWT_SECRET_KEY}",
  "TokenExpirationHours": 8
}

E-mail

"Email": {
  "Host": "smtp.seznam.cz",
  "Port": 587,
  "Username": "...",
  "Password": "${EMAIL_PASSWORD}",
  "EnableSsl": true
}

Autentizace (Eva.Manager)

"Authentication": {
  "Provider": "Local",        // nebo "AzureAd"
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "TenantId": "...",
    "ClientId": "...",
    "ClientSecret": "${AZURE_AD_CLIENT_SECRET}"
  }
}

Multitenancy

"Multitenancy": {
  "Enabled": false
}
Hodnota Chování
false (výchozí) Single-tenant — EF Core Global Query Filters se nepřidávají; chování identické se starší verzí
true Multi-tenant SaaS — plná izolace dat mezi organizacemi; JWT token obsahuje tenant_id claim

Tip

Pro on-premise instalaci nechte Enabled: false. Přepnutí na true vyžaduje inicializaci výchozího tenanta v databázi (SQL migrace 004_005_tenant.sql).


AI Chat (Eva.Manager)

AI Chat asistent v Eva.Manager (/ai-chat) se konfiguruje přes sekci AI v appsettings.json. V prostředí Docker jsou hodnoty předávány přes env proměnné, které ConfigureDockerConfiguration explicitně zapíše do IConfiguration a přepíší jakékoli placeholdery ${...} nebo prázdné hodnoty z appsettings souborů.

"AI": {
  "Provider": "OpenAI",
  "Model": "gpt-4o-mini",
  "MaxTokens": 1500,
  "Temperature": 0.3,
  "ApiKey": "",
  "DocsPath": "/app/docs"
}

Priorita konfigurace (od nejnižší po nejvyšší):

  1. appsettings.json — výchozí hodnoty
  2. appsettings.{Environment}.json — přepsání pro prostředí (Docker, Development)
  3. Env proměnné OS — standardní .NET konfigurace (AI__ApiKey apod.)
  4. ConfigureDockerConfiguration — explicitní zápis do IConfiguration z env proměnných AI_API_KEY, AI_PROVIDER, AI_MODEL (přepisuje vše výše)

Chování při chybějícím API klíči:

Pokud AI:ApiKey není nastaven nebo je prázdný, Eva.Manager zaregistruje DisabledChatClient místo skutečného klienta OpenAI. Aplikace nastartuje normálně — AI Chat nebude funkční a vrátí chybovou zprávu. Do logu se zapíše varování [EVA AI] ❌ AI není nakonfigurováno.

Stav AI konfigurace lze ověřit diagnostickým endpointem (viz Nasazení — diagnostika).


Proměnné prostředí

Všechny secrets se v produkci předávají přes environment proměnné:

Proměnná Popis
DB_HOST Hostitel PostgreSQL
DB_PORT Port PostgreSQL (výchozí: 5432)
DB_PASSWORD Heslo PostgreSQL
EMAIL_PASSWORD Heslo SMTP
JWT_SECRET_KEY Tajný klíč pro JWT (min. 32 znaků)
AZURE_AD_CLIENT_SECRET Azure AD client secret
DevExpress_License Licenční klíč DevExpress
ASPNETCORE_ENVIRONMENT Development / Docker / Production
AI_API_KEY API klíč pro AI poskytovatele (OpenAI aj.) — viz níže
AI_PROVIDER Poskytovatel AI (výchozí: OpenAI)
AI_MODEL Model AI (výchozí: gpt-4o-mini)

Poznámka k AI_API_KEY: Podporován je také starší název AI__ApiKey (dvoumístný oddělovač). ConfigureDockerConfiguration čte nejprve AI_API_KEY, při absenci zkusí AI__ApiKey jako fallback.

Nastavení v Docker Compose

services:
  api:
    environment:
      - ASPNETCORE_ENVIRONMENT=Docker
      - DB_HOST=db
      - DB_PASSWORD=${DB_PASSWORD}   # načte z .env souboru
      - JWT_SECRET_KEY=${JWT_SECRET_KEY}

  web:
    environment:
      - ASPNETCORE_ENVIRONMENT=Docker
      - AI_API_KEY=${AI_API_KEY}       # klíč pro AI Chat
      - AI_PROVIDER=${AI_PROVIDER:-OpenAI}
      - AI_MODEL=${AI_MODEL:-gpt-4o-mini}

Logování (Serilog)

"Serilog": {
  "MinimumLevel": {
    "Default": "Information",
    "Override": {
      "Microsoft": "Warning",
      "Microsoft.EntityFrameworkCore": "Information"
    }
  },
  "WriteTo": [
    { "Name": "Console" },
    {
      "Name": "File",
      "Args": {
        "path": "logs/efcore-.txt",
        "rollingInterval": "Day"
      }
    }
  ]
}

Logy jsou ukládány do logs/efcore-{YYYY-MM-DD}.txt s denní rotací.