{"record":{"id":"6e566345d3540634","repo":"EpicGames/lore","slug":"missing-grpc-internal-settings","errorCode":null,"errorMessage":"Missing gRPC internal settings","messagePattern":"Missing gRPC internal settings","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"lore-server/src/server.rs","lineNumber":594,"sourceCode":"             to explicitly accept the security exposure\"\n        )),\n    }\n}\n\n#[allow(clippy::too_many_arguments)]\nasync fn launch_grpc_internal_server(\n    settings: Settings,\n    user_agent_filter: Arc<UserAgentFilter>,\n    immutable_store: Arc<dyn ImmutableStore>,\n    mutable_store: Arc<dyn MutableStore>,\n    notification_sender: Arc<dyn NotificationSender>,\n    hook_dispatcher: Arc<HookDispatcher>,\n    mut shutdown_rx: tokio::sync::watch::Receiver<bool>,\n) -> Result<()> {\n    let grpc_settings = settings\n        .server\n        .grpc_internal\n        .ok_or(anyhow!(\"Missing gRPC internal settings\"))?;\n\n    let addr =\n        SocketAddr::from_str(format!(\"{}:{}\", grpc_settings.host, grpc_settings.port).as_str())?;\n\n    info!(\"Starting Lore gRPC internal server: {}\", &addr);\n\n    let (cert_path, key_path, cert_chain_path) =\n        if let Some(cert_settings) = grpc_settings.certificate {\n            (\n                Some(cert_settings.cert_file),\n                Some(cert_settings.pkey_file),\n                cert_settings.cert_chain,\n            )\n        } else {\n            (None, None, None)\n        };\n\n    let rpc_timeout = Duration::from_secs(grpc_settings.request_handler_timeout_seconds);","sourceCodeStart":576,"sourceCodeEnd":612,"githubUrl":"https://github.com/EpicGames/lore/blob/074eb0b0d1194c997d7cf28b55519e3e197b3e23/lore-server/src/server.rs#L576-L612","documentation":"Thrown by launch_grpc_internal_server when settings.server.grpc_internal is None. The internal gRPC server needs its own host/port settings to bind; startup aborts instead of guessing a default address.","triggerScenarios":"Calling launch_grpc_internal_server with a Settings whose settings.server.grpc_internal field is None (missing [server.grpc_internal] section in config).","commonSituations":"Config file predates the internal gRPC feature; section omitted from a minimal deployment config; key rename across versions leaves the field unset.","solutions":["Add a [server.grpc_internal] section with host and port to the config file.","Verify the internal server is enabled in the version being run and the section name matches the schema.","Check that the correct config file is being loaded for this deployment mode."],"exampleFix":"# before\n[server]\n# no grpc_internal section\n\n# after\n[server.grpc_internal]\nhost = \"127.0.0.1\"\nport = 50052","handlingStrategy":"validation","validationCode":"if settings.server.grpc_internal.is_none() {\n    return Err(anyhow!(\"server.grpc_internal section missing from config\"));\n}","typeGuard":"fn grpc_internal_ready(settings: &Settings) -> bool {\n    settings.server.grpc_internal.is_some()\n}","tryCatchPattern":null,"preventionTips":["Keep [server.grpc_internal] in the config template whenever the internal server is deployed.","Validate required sections after deserializing Settings, before any server launch.","Re-check section names after version upgrades that may rename config keys."],"tags":["grpc","configuration","startup"],"backgroundTag":"missing-required-config","analyzedSha":"074eb0b0d1194c997d7cf28b55519e3e197b3e23","analyzedAt":"2026-09-13T09:00:57.509Z","contentChangedAt":"2026-09-13T09:00:57.509Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}