# 配置管理說明 ## 概述 DramaLing API 使用 ASP.NET Core 標準配置系統,支援多環境配置、環境變數覆蓋、強型別配置驗證。 ## 配置文件結構 ``` Configuration/ ├── README.md # 本文檔 ├── appsettings.json # 主要配置檔案 ├── appsettings.Development.json # 開發環境配置 ├── appsettings.Production.json # 生產環境配置 (未建立) ├── appsettings.OptionsVocabulary.json # 詞彙選項配置 └── [Models/Configuration/] # 強型別配置類別 ├── GeminiOptions.cs # Gemini 配置 └── GeminiOptionsValidator.cs # Gemini 配置驗證器 ``` ## 環境變數優先級 配置來源優先級 (由高到低): 1. **環境變數** 2. **appsettings.{Environment}.json** 3. **appsettings.json** 4. **預設值** ## 核心配置項目 ### 資料庫連接 ```json { "ConnectionStrings": { "DefaultConnection": "Data Source=dramaling.db" } } ``` **環境變數覆蓋**: - `DRAMALING_DB_CONNECTION` - 資料庫連接字串 - `USE_INMEMORY_DB=true` - 使用記憶體資料庫 ### Gemini AI 配置 ```json { "Gemini": { "ApiKey": "your-gemini-api-key", "Model": "gemini-1.5-flash", "BaseUrl": "https://generativelanguage.googleapis.com/v1beta/models/", "MaxTokens": 2048, "Temperature": 0.1, "TopP": 0.95, "TopK": 64, "Timeout": 30 } } ``` **環境變數覆蓋**: - `DRAMALING_GEMINI_API_KEY` - Gemini API 金鑰 - `DRAMALING_GEMINI_MODEL` - 模型名稱 ### Supabase 認證配置 ```json { "Supabase": { "Url": "https://your-project.supabase.co", "JwtSecret": "your-jwt-secret" } } ``` **環境變數覆蓋**: - `DRAMALING_SUPABASE_URL` - Supabase 專案 URL - `DRAMALING_SUPABASE_JWT_SECRET` - JWT 密鑰 ### Replicate 服務配置 ```json { "Replicate": { "ApiKey": "your-replicate-api-key", "BaseUrl": "https://api.replicate.com/v1/", "DefaultModel": "black-forest-labs/flux-schnell", "Timeout": 300 } } ``` **環境變數覆蓋**: - `DRAMALING_REPLICATE_API_KEY` - Replicate API 金鑰 ### Azure Speech 服務配置 ```json { "AzureSpeech": { "SubscriptionKey": "your-azure-speech-key", "Region": "eastasia", "Language": "en-US", "Voice": "en-US-JennyNeural" } } ``` **環境變數覆蓋**: - `DRAMALING_AZURE_SPEECH_KEY` - Azure Speech 金鑰 - `DRAMALING_AZURE_SPEECH_REGION` - Azure Speech 區域 ## 強型別配置 ### GeminiOptions 配置類別 ```csharp public class GeminiOptions { public const string SectionName = "Gemini"; public string ApiKey { get; set; } = string.Empty; public string Model { get; set; } = "gemini-1.5-flash"; public string BaseUrl { get; set; } = "https://generativelanguage.googleapis.com/v1beta/models/"; public int MaxTokens { get; set; } = 2048; public double Temperature { get; set; } = 0.1; public double TopP { get; set; } = 0.95; public int TopK { get; set; } = 64; public int Timeout { get; set; } = 30; } ``` ### 配置驗證 ```csharp public class GeminiOptionsValidator : IValidateOptions { public ValidateOptionsResult Validate(string name, GeminiOptions options) { var failures = new List(); if (string.IsNullOrWhiteSpace(options.ApiKey)) failures.Add("Gemini API Key is required"); if (options.MaxTokens <= 0) failures.Add("MaxTokens must be greater than 0"); return failures.Count > 0 ? ValidateOptionsResult.Fail(failures) : ValidateOptionsResult.Success; } } ``` ## 配置註冊 在 `ServiceCollectionExtensions.cs` 中: ```csharp public static IServiceCollection AddAIServices(this IServiceCollection services, IConfiguration configuration) { // 強型別配置 services.Configure(configuration.GetSection(GeminiOptions.SectionName)); services.AddSingleton, GeminiOptionsValidator>(); // 其他服務註冊... return services; } ``` ## 環境配置最佳實踐 ### 開發環境 (appsettings.Development.json) ```json { "Logging": { "LogLevel": { "Default": "Debug", "System": "Information", "Microsoft": "Information" } }, "ConnectionStrings": { "DefaultConnection": "Data Source=dramaling_dev.db" } } ``` ### 生產環境配置原則 1. **敏感資料**: 全部使用環境變數 2. **連接逾時**: 增加逾時設定 3. **日誌等級**: 設為 Warning 或 Error 4. **快取設定**: 啟用分散式快取 ### Docker Compose 環境變數 ```yaml version: '3.8' services: dramaling-api: image: dramaling-api environment: - ASPNETCORE_ENVIRONMENT=Production - DRAMALING_DB_CONNECTION=Server=db;Database=dramaling;Uid=root;Pwd=password - DRAMALING_GEMINI_API_KEY=${GEMINI_API_KEY} - DRAMALING_SUPABASE_URL=${SUPABASE_URL} - DRAMALING_SUPABASE_JWT_SECRET=${SUPABASE_JWT_SECRET} - DRAMALING_REPLICATE_API_KEY=${REPLICATE_API_KEY} ``` ## 配置安全性 ### 敏感資料保護 1. **永不提交**: 敏感配置不可提交到版本控制 2. **環境變數**: 生產環境使用環境變數 3. **Azure Key Vault**: 考慮使用 Azure Key Vault 4. **加密**: 敏感配置在傳輸和儲存時加密 ### .gitignore 設定 ``` # 敏感配置文件 appsettings.Production.json appsettings.*.local.json *.secrets.json # 環境變數文件 .env .env.local .env.production ``` ## 配置驗證 ### 啟動時驗證 ```csharp public static void Main(string[] args) { var builder = WebApplication.CreateBuilder(args); // 配置驗證 builder.Services.AddOptions() .Bind(builder.Configuration.GetSection(GeminiOptions.SectionName)) .ValidateDataAnnotations() .ValidateOnStart(); var app = builder.Build(); app.Run(); } ``` ### 健康檢查整合 ```csharp builder.Services.AddHealthChecks() .AddCheck("configuration"); ``` ## 故障排除 ### 常見問題 1. **配置未載入**: 檢查檔案名稱和環境變數 2. **環境變數無效**: 確認變數名稱正確 3. **強型別配置失敗**: 檢查配置驗證器 ### 偵錯配置 ```csharp // 在 Program.cs 中加入偵錯輸出 var configuration = builder.Configuration; Console.WriteLine($"Environment: {builder.Environment.EnvironmentName}"); Console.WriteLine($"Gemini API Key: {configuration["Gemini:ApiKey"]}"); ``` --- **版本**: 1.0 **建立日期**: 2025-09-30 **維護者**: DramaLing 開發團隊