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¶
| 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šší):
appsettings.json— výchozí hodnotyappsettings.{Environment}.json— přepsání pro prostředí (Docker, Development)- Env proměnné OS — standardní .NET konfigurace (
AI__ApiKeyapod.) ConfigureDockerConfiguration— explicitní zápis doIConfigurationz env proměnnýchAI_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ázevAI__ApiKey(dvoumístný oddělovač).ConfigureDockerConfigurationčte nejprveAI_API_KEY, při absenci zkusíAI__ApiKeyjako 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í.