소스 검색

fix: use SMARTBOTIC_CRM_ prefix for all env vars and fix LLM config loading

- Updated all environment variable prefixes from SMARTBOTIC_ to SMARTBOTIC_CRM_
- Added LLM section parsing in webserver config loader
- Added SMARTBOTIC_CRM_SERVER_LLM_ADDRESS environment variable support
- Fixed default LLM port to 50152
fszontagh 6 달 전
부모
커밋
ec47b89e95

+ 1 - 1
database/include/smartbotic/database/config.hpp

@@ -47,7 +47,7 @@ struct DatabaseConfig {
 
     // Security configuration
     std::string encryption_key_path;  // Path to encryption key file (optional)
-    // Note: Encryption key can also be provided via SMARTBOTIC_DB_ENCRYPTION_KEY env var
+    // Note: Encryption key can also be provided via SMARTBOTIC_CRM_DB_ENCRYPTION_KEY env var
 
     /// Get the full address string (address:port)
     [[nodiscard]] auto GetListenAddress() const -> std::string {

+ 16 - 16
database/src/config.cpp

@@ -104,7 +104,7 @@ auto ConfigLoader::GetDefaultConfigPaths() -> std::vector<std::string> {
 
 auto ConfigLoader::FindConfigFile() -> std::optional<std::string> {
     // Check environment variable for explicit config path
-    const char* config_path_env = std::getenv("SMARTBOTIC_DB_CONFIG");
+    const char* config_path_env = std::getenv("SMARTBOTIC_CRM_DB_CONFIG");
     if (config_path_env != nullptr && std::filesystem::exists(config_path_env)) {
         return std::string(config_path_env);
     }
@@ -204,16 +204,16 @@ auto ConfigLoader::LoadFromFile(const std::string& path) -> std::optional<Databa
 
 void ConfigLoader::ApplyEnvironment(DatabaseConfig& config) {
     // Server settings from environment (can override config file)
-    config.address = GetEnvOrDefault("SMARTBOTIC_DB_ADDRESS", config.address);
-    config.port = GetEnvOrDefault("SMARTBOTIC_DB_PORT", config.port);
-    config.data_dir = GetEnvOrDefault("SMARTBOTIC_DB_DATA_DIR", config.data_dir);
+    config.address = GetEnvOrDefault("SMARTBOTIC_CRM_DB_ADDRESS", config.address);
+    config.port = GetEnvOrDefault("SMARTBOTIC_CRM_DB_PORT", config.port);
+    config.data_dir = GetEnvOrDefault("SMARTBOTIC_CRM_DB_DATA_DIR", config.data_dir);
 
     // Snapshot settings from environment
     config.snapshot_interval_seconds =
-        GetEnvOrDefault("SMARTBOTIC_DB_SNAPSHOT_INTERVAL", config.snapshot_interval_seconds);
+        GetEnvOrDefault("SMARTBOTIC_CRM_DB_SNAPSHOT_INTERVAL", config.snapshot_interval_seconds);
 
     // Log level from environment
-    const char* log_level_env = std::getenv("SMARTBOTIC_DB_LOG_LEVEL");
+    const char* log_level_env = std::getenv("SMARTBOTIC_CRM_DB_LOG_LEVEL");
     if (log_level_env != nullptr) {
         auto level = ParseLogLevel(log_level_env);
         if (level) {
@@ -222,7 +222,7 @@ void ConfigLoader::ApplyEnvironment(DatabaseConfig& config) {
     }
 
     // Encryption key path from environment (for secrets)
-    const char* key_path_env = std::getenv("SMARTBOTIC_DB_ENCRYPTION_KEY_PATH");
+    const char* key_path_env = std::getenv("SMARTBOTIC_CRM_DB_ENCRYPTION_KEY_PATH");
     if (key_path_env != nullptr) {
         config.encryption_key_path = key_path_env;
     }
@@ -420,14 +420,14 @@ void ConfigLoader::PrintHelp(const char* program_name) {
     spdlog::info("  --encryption-key-path <p>  Path to encryption key file");
     spdlog::info("");
     spdlog::info("Environment Variables:");
-    spdlog::info("  SMARTBOTIC_DB_CONFIG             Path to config file");
-    spdlog::info("  SMARTBOTIC_DB_ADDRESS            Address to bind to");
-    spdlog::info("  SMARTBOTIC_DB_PORT               Port to listen on");
-    spdlog::info("  SMARTBOTIC_DB_DATA_DIR           Data directory");
-    spdlog::info("  SMARTBOTIC_DB_SNAPSHOT_INTERVAL  Snapshot interval in seconds");
-    spdlog::info("  SMARTBOTIC_DB_LOG_LEVEL          Log level");
-    spdlog::info("  SMARTBOTIC_DB_ENCRYPTION_KEY_PATH  Path to encryption key file");
-    spdlog::info("  SMARTBOTIC_DB_ENCRYPTION_KEY     Encryption key (base64 encoded) - for secrets");
+    spdlog::info("  SMARTBOTIC_CRM_DB_CONFIG             Path to config file");
+    spdlog::info("  SMARTBOTIC_CRM_DB_ADDRESS            Address to bind to");
+    spdlog::info("  SMARTBOTIC_CRM_DB_PORT               Port to listen on");
+    spdlog::info("  SMARTBOTIC_CRM_DB_DATA_DIR           Data directory");
+    spdlog::info("  SMARTBOTIC_CRM_DB_SNAPSHOT_INTERVAL  Snapshot interval in seconds");
+    spdlog::info("  SMARTBOTIC_CRM_DB_LOG_LEVEL          Log level");
+    spdlog::info("  SMARTBOTIC_CRM_DB_ENCRYPTION_KEY_PATH  Path to encryption key file");
+    spdlog::info("  SMARTBOTIC_CRM_DB_ENCRYPTION_KEY     Encryption key (base64 encoded) - for secrets");
     spdlog::info("");
     spdlog::info("Config File Search Order:");
     for (const auto& path : GetDefaultConfigPaths()) {
@@ -446,7 +446,7 @@ void ConfigLoader::PrintConfig(const DatabaseConfig& config) {
     if (!config.encryption_key_path.empty()) {
         spdlog::info("  Encryption Key:    {} (path configured)", config.encryption_key_path);
     } else {
-        const char* key_env = std::getenv("SMARTBOTIC_DB_ENCRYPTION_KEY");
+        const char* key_env = std::getenv("SMARTBOTIC_CRM_DB_ENCRYPTION_KEY");
         if (key_env != nullptr) {
             spdlog::info("  Encryption Key:    (from environment variable)");
         } else {

+ 14 - 14
llm/src/config.cpp

@@ -104,7 +104,7 @@ auto ConfigLoader::GetDefaultConfigPaths() -> std::vector<std::string> {
 
 auto ConfigLoader::FindConfigFile() -> std::optional<std::string> {
     // Check environment variable for explicit config path
-    const char* config_path_env = std::getenv("SMARTBOTIC_LLM_CONFIG");
+    const char* config_path_env = std::getenv("SMARTBOTIC_CRM_LLM_CONFIG");
     if (config_path_env != nullptr && std::filesystem::exists(config_path_env)) {
         return std::string(config_path_env);
     }
@@ -181,17 +181,17 @@ auto ConfigLoader::LoadFromFile(const std::string& path) -> std::optional<LlmCon
 
 void ConfigLoader::ApplyEnvironment(LlmConfig& config) {
     // Server settings from environment
-    config.address = GetEnvOrDefault("SMARTBOTIC_LLM_ADDRESS", config.address);
-    config.port = GetEnvOrDefault("SMARTBOTIC_LLM_PORT", config.port);
-    config.database_address = GetEnvOrDefault("SMARTBOTIC_LLM_DATABASE_ADDRESS", config.database_address);
+    config.address = GetEnvOrDefault("SMARTBOTIC_CRM_LLM_ADDRESS", config.address);
+    config.port = GetEnvOrDefault("SMARTBOTIC_CRM_LLM_PORT", config.port);
+    config.database_address = GetEnvOrDefault("SMARTBOTIC_CRM_LLM_DATABASE_ADDRESS", config.database_address);
 
     // LLM settings from environment
-    config.default_model = GetEnvOrDefault("SMARTBOTIC_LLM_DEFAULT_MODEL", config.default_model);
+    config.default_model = GetEnvOrDefault("SMARTBOTIC_CRM_LLM_DEFAULT_MODEL", config.default_model);
     config.session_timeout_seconds =
-        GetEnvOrDefault("SMARTBOTIC_LLM_SESSION_TIMEOUT", config.session_timeout_seconds);
+        GetEnvOrDefault("SMARTBOTIC_CRM_LLM_SESSION_TIMEOUT", config.session_timeout_seconds);
 
     // Log level from environment
-    const char* log_level_env = std::getenv("SMARTBOTIC_LLM_LOG_LEVEL");
+    const char* log_level_env = std::getenv("SMARTBOTIC_CRM_LLM_LOG_LEVEL");
     if (log_level_env != nullptr) {
         auto level = ParseLogLevel(log_level_env);
         if (level) {
@@ -388,13 +388,13 @@ void ConfigLoader::PrintHelp(const char* program_name) {
     spdlog::info("  -l, --log-level <level>      Log level: trace, debug, info, warn, error, critical, off");
     spdlog::info("");
     spdlog::info("Environment Variables:");
-    spdlog::info("  SMARTBOTIC_LLM_CONFIG            Path to config file");
-    spdlog::info("  SMARTBOTIC_LLM_ADDRESS           Address to bind to");
-    spdlog::info("  SMARTBOTIC_LLM_PORT              Port to listen on");
-    spdlog::info("  SMARTBOTIC_LLM_DATABASE_ADDRESS  Database node address");
-    spdlog::info("  SMARTBOTIC_LLM_DEFAULT_MODEL     Default LLM model");
-    spdlog::info("  SMARTBOTIC_LLM_SESSION_TIMEOUT   Session timeout in seconds");
-    spdlog::info("  SMARTBOTIC_LLM_LOG_LEVEL         Log level");
+    spdlog::info("  SMARTBOTIC_CRM_LLM_CONFIG            Path to config file");
+    spdlog::info("  SMARTBOTIC_CRM_LLM_ADDRESS           Address to bind to");
+    spdlog::info("  SMARTBOTIC_CRM_LLM_PORT              Port to listen on");
+    spdlog::info("  SMARTBOTIC_CRM_LLM_DATABASE_ADDRESS  Database node address");
+    spdlog::info("  SMARTBOTIC_CRM_LLM_DEFAULT_MODEL     Default LLM model");
+    spdlog::info("  SMARTBOTIC_CRM_LLM_SESSION_TIMEOUT   Session timeout in seconds");
+    spdlog::info("  SMARTBOTIC_CRM_LLM_LOG_LEVEL         Log level");
     spdlog::info("");
     spdlog::info("Config File Search Order:");
     for (const auto& path : GetDefaultConfigPaths()) {

+ 2 - 2
systemd/smartbotic-crm-database.service

@@ -14,8 +14,8 @@ StandardError=journal
 TimeoutStopSec=10
 
 # Environment
-Environment="SMARTBOTIC_DB_PORT=50151"
-Environment="SMARTBOTIC_DB_DATA_DIR=/data/smartbotic-crm/data"
+Environment="SMARTBOTIC_CRM_DB_PORT=50151"
+Environment="SMARTBOTIC_CRM_DB_DATA_DIR=/data/smartbotic-crm/data"
 
 [Install]
 WantedBy=default.target

+ 4 - 4
systemd/smartbotic-crm-llm.service

@@ -15,10 +15,10 @@ StandardError=journal
 TimeoutStopSec=10
 
 # Environment
-Environment="SMARTBOTIC_LLM_ADDRESS=0.0.0.0"
-Environment="SMARTBOTIC_LLM_PORT=50152"
-Environment="SMARTBOTIC_LLM_DATABASE_ADDRESS=localhost:50151"
-Environment="SMARTBOTIC_LLM_LOG_LEVEL=info"
+Environment="SMARTBOTIC_CRM_LLM_ADDRESS=0.0.0.0"
+Environment="SMARTBOTIC_CRM_LLM_PORT=50152"
+Environment="SMARTBOTIC_CRM_LLM_DATABASE_ADDRESS=localhost:50151"
+Environment="SMARTBOTIC_CRM_LLM_LOG_LEVEL=info"
 
 [Install]
 WantedBy=default.target

+ 6 - 6
systemd/smartbotic-crm-webserver.service

@@ -16,12 +16,12 @@ StandardError=journal
 TimeoutStopSec=10
 
 # Environment
-Environment="SMARTBOTIC_SERVER_HTTP_PORT=18080"
-Environment="SMARTBOTIC_SERVER_WS_PORT=18081"
-Environment="SMARTBOTIC_SERVER_DATABASE_HOST=localhost"
-Environment="SMARTBOTIC_SERVER_DATABASE_PORT=50151"
-Environment="SMARTBOTIC_SERVER_LLM_ADDRESS=localhost:50152"
-Environment="SMARTBOTIC_SERVER_STATIC_PATH=/data/smartbotic-crm/webui/dist"
+Environment="SMARTBOTIC_CRM_SERVER_HTTP_PORT=18080"
+Environment="SMARTBOTIC_CRM_SERVER_WS_PORT=18081"
+Environment="SMARTBOTIC_CRM_SERVER_DATABASE_HOST=localhost"
+Environment="SMARTBOTIC_CRM_SERVER_DATABASE_PORT=50151"
+Environment="SMARTBOTIC_CRM_SERVER_LLM_ADDRESS=localhost:50152"
+Environment="SMARTBOTIC_CRM_SERVER_STATIC_PATH=/data/smartbotic-crm/webui/dist"
 
 [Install]
 WantedBy=default.target

+ 1 - 1
webserver/include/smartbotic/webserver/config.hpp

@@ -72,7 +72,7 @@ struct HttpServerConfig {
     std::string database_address = "127.0.0.1:50151";  // Database service address
 
     // LLM gRPC connection
-    std::string llm_address = "127.0.0.1:50052";  // LLM service address
+    std::string llm_address = "127.0.0.1:50152";  // LLM service address
 
     /// Get the full address string (address:port)
     [[nodiscard]] auto GetListenAddress() const -> std::string { return address + ":" + std::to_string(port); }

+ 27 - 16
webserver/src/config.cpp

@@ -108,7 +108,7 @@ auto ConfigLoader::GetDefaultConfigPaths() -> std::vector<std::string> {
 
 auto ConfigLoader::FindConfigFile() -> std::optional<std::string> {
     // Check environment variable for explicit config path
-    const char* config_path_env = std::getenv("SMARTBOTIC_SERVER_CONFIG");
+    const char* config_path_env = std::getenv("SMARTBOTIC_CRM_SERVER_CONFIG");
     if (config_path_env != nullptr && std::filesystem::exists(config_path_env)) {
         return std::string(config_path_env);
     }
@@ -218,6 +218,14 @@ auto ConfigLoader::LoadFromFile(const std::string& path) -> std::optional<HttpSe
             }
         }
 
+        // LLM section
+        if (json.contains("llm")) {
+            const auto& llm = json["llm"];
+            if (llm.contains("address")) {
+                config.llm_address = llm["address"].get<std::string>();
+            }
+        }
+
         // JWT section
         if (json.contains("jwt")) {
             const auto& jwt = json["jwt"];
@@ -249,22 +257,25 @@ auto ConfigLoader::LoadFromFile(const std::string& path) -> std::optional<HttpSe
 
 void ConfigLoader::ApplyEnvironment(HttpServerConfig& config) {
     // Server settings from environment
-    config.address = GetEnvOrDefault("SMARTBOTIC_SERVER_ADDRESS", config.address);
-    config.port = GetEnvOrDefault("SMARTBOTIC_SERVER_PORT", config.port);
-    config.webui_path = GetEnvOrDefault("SMARTBOTIC_SERVER_WEBUI_PATH", config.webui_path);
-    config.ws_path = GetEnvOrDefault("SMARTBOTIC_SERVER_WS_PATH", config.ws_path);
+    config.address = GetEnvOrDefault("SMARTBOTIC_CRM_SERVER_ADDRESS", config.address);
+    config.port = GetEnvOrDefault("SMARTBOTIC_CRM_SERVER_PORT", config.port);
+    config.webui_path = GetEnvOrDefault("SMARTBOTIC_CRM_SERVER_WEBUI_PATH", config.webui_path);
+    config.ws_path = GetEnvOrDefault("SMARTBOTIC_CRM_SERVER_WS_PATH", config.ws_path);
 
     // CORS settings from environment
-    config.cors.enabled = GetEnvBool("SMARTBOTIC_SERVER_CORS_ENABLED", config.cors.enabled);
+    config.cors.enabled = GetEnvBool("SMARTBOTIC_CRM_SERVER_CORS_ENABLED", config.cors.enabled);
 
     // Database settings from environment
-    config.database_address = GetEnvOrDefault("SMARTBOTIC_SERVER_DATABASE_ADDRESS", config.database_address);
+    config.database_address = GetEnvOrDefault("SMARTBOTIC_CRM_SERVER_DATABASE_ADDRESS", config.database_address);
+
+    // LLM settings from environment
+    config.llm_address = GetEnvOrDefault("SMARTBOTIC_CRM_SERVER_LLM_ADDRESS", config.llm_address);
 
     // JWT settings from environment (secret from env is recommended for security)
-    config.jwt.secret = GetEnvOrDefault("SMARTBOTIC_SERVER_JWT_SECRET", config.jwt.secret);
+    config.jwt.secret = GetEnvOrDefault("SMARTBOTIC_CRM_SERVER_JWT_SECRET", config.jwt.secret);
 
     // Log level from environment
-    const char* log_level_env = std::getenv("SMARTBOTIC_SERVER_LOG_LEVEL");
+    const char* log_level_env = std::getenv("SMARTBOTIC_CRM_SERVER_LOG_LEVEL");
     if (log_level_env != nullptr) {
         auto level = ParseLogLevel(log_level_env);
         if (level) {
@@ -451,13 +462,13 @@ void ConfigLoader::PrintHelp(const char* program_name) {
     spdlog::info("  --no-cors                  Disable CORS headers");
     spdlog::info("");
     spdlog::info("Environment Variables:");
-    spdlog::info("  SMARTBOTIC_SERVER_CONFIG           Path to config file");
-    spdlog::info("  SMARTBOTIC_SERVER_ADDRESS          Address to bind to");
-    spdlog::info("  SMARTBOTIC_SERVER_PORT             Port to listen on");
-    spdlog::info("  SMARTBOTIC_SERVER_WEBUI_PATH       Path to WebUI static files");
-    spdlog::info("  SMARTBOTIC_SERVER_DATABASE_ADDRESS Database gRPC address");
-    spdlog::info("  SMARTBOTIC_SERVER_LOG_LEVEL        Log level");
-    spdlog::info("  SMARTBOTIC_SERVER_CORS_ENABLED     Enable/disable CORS (true/false)");
+    spdlog::info("  SMARTBOTIC_CRM_SERVER_CONFIG           Path to config file");
+    spdlog::info("  SMARTBOTIC_CRM_SERVER_ADDRESS          Address to bind to");
+    spdlog::info("  SMARTBOTIC_CRM_SERVER_PORT             Port to listen on");
+    spdlog::info("  SMARTBOTIC_CRM_SERVER_WEBUI_PATH       Path to WebUI static files");
+    spdlog::info("  SMARTBOTIC_CRM_SERVER_DATABASE_ADDRESS Database gRPC address");
+    spdlog::info("  SMARTBOTIC_CRM_SERVER_LOG_LEVEL        Log level");
+    spdlog::info("  SMARTBOTIC_CRM_SERVER_CORS_ENABLED     Enable/disable CORS (true/false)");
     spdlog::info("");
     spdlog::info("Config File Search Order:");
     for (const auto& path : GetDefaultConfigPaths()) {