{"record":{"id":"40defffd82df2b13","repo":"influxdata/influxdb","slug":"node-not-configured-with-plugin-directory","errorCode":null,"errorMessage":"Node not configured with plugin directory","messagePattern":"Node not configured with plugin directory","errorType":"exception","errorClass":"PluginError","httpStatus":null,"severity":"error","filePath":"influxdb3_processing_engine/src/plugins.rs","lineNumber":76,"sourceCode":"\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 {\n    pub plugin_dir: Option<PathBuf>,\n    pub virtual_env_location: Option<PathBuf>,\n    pub package_manager: Arc<dyn PythonEnvironmentManager>,\n    pub plugin_dir_only: bool,\n    pub plugin_repo: Option<String>,\n}\n\npub(crate) fn run_schedule_event_source(","sourceCodeStart":58,"sourceCodeEnd":94,"githubUrl":"https://github.com/influxdata/influxdb/blob/06200ef96ba82c5f6727e5038a83af8e722c6875/influxdb3_processing_engine/src/plugins.rs#L58-L94","documentation":"PluginError::NoPluginDir is thrown when the node is not configured with a plugin directory but an operation requires one (e.g. resolving, installing, or listing local plugins). The server's plugin directory option was not set.","triggerScenarios":"Invoking plugin install/lookup while the server was started without --plugin-dir (or equivalent env), so the processing engine has no directory to operate on.","commonSituations":"Fresh deployments missing the plugin-dir flag; systemd/docker units omitting the volume mount and flag; operators assume a default plugin directory exists.","solutions":["Start the server with the plugin directory configured (e.g. influxdb3 serve --plugin-dir /path/to/plugins).","Ensure the directory exists and is readable/writable by the server process.","If running in a container, mount a volume and pass the flag in the service definition."],"exampleFix":"// before\ninfluxdb3 serve --node-id node1\n// after\ninfluxdb3 serve --node-id node1 --plugin-dir /var/lib/influxdb3/plugins","handlingStrategy":"validation","validationCode":"// before invoking plugin APIs, verify server config\nconst pluginDir = serverConfig.plugin_dir;\nif (!pluginDir) throw new Error('server started without --plugin-dir');\nif (!fs.existsSync(pluginDir)) fs.mkdirSync(pluginDir, {recursive: true});","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always pass --plugin-dir in service definitions, Dockerfiles, and systemd units.","Create and mount the plugin directory before startup.","Add startup health checks asserting the plugin dir is configured."],"tags":["config","filesystem","plugins"],"backgroundTag":"missing-config-value","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"}