{"record":{"id":"475dd8a01c0c9215","repo":"influxdata/influxdb","slug":"plugin-installation-is-disabled-plugins-must-already-exist","errorCode":null,"errorMessage":"plugin installation is disabled; plugins must already exist in the configured plugin directory","messagePattern":"plugin installation is disabled; plugins must already exist in the configured plugin directory","errorType":"validation","errorClass":"PluginError","httpStatus":null,"severity":"error","filePath":"influxdb3_processing_engine/src/plugins.rs","lineNumber":68,"sourceCode":"    #[error(\"reading plugin file: {0}\")]\n    ReadPluginError(#[from] std::io::Error),\n\n    #[error(\"error executing plugin: {0}\")]\n    PluginExecutionError(#[from] influxdb3_py_api::error::ExecutePluginError),\n\n    #[error(\"invalid cron syntax: {0}\")]\n    InvalidCronSyntax(#[from] cron::error::Error),\n\n    #[error(\"cron schedule never triggers: {0}\")]\n    CronScheduleNeverTriggers(String),\n\n    #[error(\"non-schedule plugin with schedule trigger: {0}\")]\n    NonSchedulePluginWithScheduleTrigger(String),\n\n    #[error(\"error fetching plugin from repository: {0} {1}\")]\n    FetchingFromRepository(reqwest::StatusCode, String),\n\n    #[error(\n        \"plugin installation is disabled; plugins must already exist in the configured plugin directory\"\n    )]\n    PluginInstallationDisabled,\n\n    #[error(\"Join error, please report: {0}\")]\n    JoinError(#[from] tokio::task::JoinError),\n\n    #[error(\"Node not configured with plugin directory\")]\n    NoPluginDir,\n\n    #[error(\n        \"Path traversal detected: plugin filename '{0}' attempts to access files outside the plugin directory\"\n    )]\n    PathTraversal(String),\n}\n\n#[derive(Debug, Clone)]\npub struct ProcessingEngineEnvironmentManager {","sourceCodeStart":50,"sourceCodeEnd":86,"githubUrl":"https://github.com/influxdata/influxdb/blob/06200ef96ba82c5f6727e5038a83af8e722c6875/influxdb3_processing_engine/src/plugins.rs#L50-L86","documentation":"PluginError::PluginInstallationDisabled is thrown when a plugin install/download is requested but the node was started with plugin installation disabled; plugins must already exist in the configured plugin directory. It enforces the server configuration that disallows runtime fetching.","triggerScenarios":"Calling the plugin installation/download API while the server runs without plugin-installation enabled (e.g. started without the flag/env that enables downloading from the repository).","commonSituations":"Production deployments hardened by disabling remote installs; operators try to install a new plugin at runtime and hit this; config drifted from staging where installs were allowed.","solutions":["Restart the node with plugin installation enabled (enable the corresponding server option/env).","Manually place the plugin file in the configured plugin directory on the node's filesystem.","Use a deployment pipeline to distribute plugin files instead of runtime installs."],"exampleFix":"// before\ninfluxdb3 serve --plugin-dir /plugins\n// after\ninfluxdb3 serve --plugin-dir /plugins --plugin-installation-enabled","handlingStrategy":"fallback","validationCode":"// check server config before attempting install\nconst installsEnabled = serverConfig.plugin_installation_enabled === true;\nif (!installsEnabled) provisionPluginManually(name);","typeGuard":null,"tryCatchPattern":"if let Err(PluginError::PluginInstallationDisabled) = result {\n    copy_plugin_into_plugin_dir(name)?;\n}","preventionTips":["Start the node with plugin installation enabled if runtime installs are needed.","Otherwise ship plugin files via deployment automation.","Keep staging/production install policies consistent."],"tags":["config","plugin-install","feature-flag"],"backgroundTag":"feature-not-enabled","analyzedSha":"06200ef96ba82c5f6727e5038a83af8e722c6875","analyzedAt":"2026-09-19T12:55:30.003Z","contentChangedAt":"2026-09-19T12:55:30.003Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}