{"record":{"id":"8ba073bb21ce66bf","repo":"neondatabase/neon","slug":"remote-extensions-storage-is-not-configured","errorCode":null,"errorMessage":"Remote extensions storage is not configured","messagePattern":"Remote extensions storage is not configured","errorType":"validation","errorClass":"DownloadError::BadInput","httpStatus":null,"severity":"error","filePath":"compute_tools/src/compute.rs","lineNumber":2419,"sourceCode":"            }\n\n            format!(\"{{\\\"pg_stat_statements\\\": [{}]}}\", result_rows.join(\",\"))\n        } else {\n            \"{{\\\"pg_stat_statements\\\": []}}\".to_string()\n        }\n    }\n\n    // download an archive, unzip and place files in correct locations\n    pub async fn download_extension(\n        &self,\n        real_ext_name: String,\n        ext_path: RemotePath,\n    ) -> Result<u64, DownloadError> {\n        let remote_ext_base_url =\n            self.params\n                .remote_ext_base_url\n                .as_ref()\n                .ok_or(DownloadError::BadInput(anyhow::anyhow!(\n                    \"Remote extensions storage is not configured\",\n                )))?;\n\n        let ext_archive_name = ext_path.object_name().expect(\"bad path\");\n\n        let mut first_try = false;\n        if !self\n            .ext_download_progress\n            .read()\n            .expect(\"lock err\")\n            .contains_key(ext_archive_name)\n        {\n            self.ext_download_progress\n                .write()\n                .expect(\"lock err\")\n                .insert(ext_archive_name.to_string(), (Utc::now(), false));\n            first_try = true;\n        }","sourceCodeStart":2401,"sourceCodeEnd":2437,"githubUrl":"https://github.com/neondatabase/neon/blob/8f60b04da47ffefe0e52bda2440134b42874eb75/compute_tools/src/compute.rs#L2401-L2437","documentation":"ComputeNode::download_extension needs a base URL for the remote extension archive storage, taken from compute_ctl's -r/--remote-ext-base-url startup parameter (params.remote_ext_base_url). It was None, so the request fails immediately with DownloadError::BadInput before any network I/O. The process was started without extension storage configured, yet something asked to download an extension.","triggerScenarios":"compute_ctl launched without the --remote-ext-base-url flag (or env equivalent feeding it), then the extension server / remote-extensions path calls download_extension() for a requested extension archive.","commonSituations":"Self-hosted or dev deployments that omit the public extension bucket URL; a docker/VM image whose startup script lost the flag; proxy/air-gapped installs pointing at a nonexistent mirror; spec asks for extensions on a build that intentionally disabled remote extensions.","solutions":["Start compute_ctl with --remote-ext-base-url pointing at the extension storage (e.g. the public S3 web bucket) and restart the endpoint","If extensions are not needed, stop requesting/downloading remote extensions for this compute (and remove them from shared_preload_libraries) so the code path is never hit","For air-gapped installs, host a mirror of the extension archives and pass its URL"],"exampleFix":"# before\ncompute_ctl run --spec spec.json\n# after\ncompute_ctl run --spec spec.json --remote-ext-base-url https://extensions.neon.tech/v0.2","handlingStrategy":"validation","validationCode":"// Before requesting extensions, confirm the compute was started with storage\nif compute.params.remote_ext_base_url.is_none() {\n    anyhow::bail!(\"this compute has no --remote-ext-base-url; remote extensions unavailable\");\n}","typeGuard":"fn extensions_available(params: &ComputeParams) -> bool {\n    params.remote_ext_base_url.is_some()\n}","tryCatchPattern":"// The HTTP extension route already models this: return 503-style early instead of attempting the download\nmatch compute.download_extension(name, path).await {\n    Err(DownloadError::BadInput(e)) if e.to_string().contains(\"Remote extensions storage\") => {\n        (StatusCode::SERVICE_UNAVAILABLE, \"remote extension storage not configured\")\n    }\n    other => other,\n}","preventionTips":["Bake --remote-ext-base-url into every compute_ctl launch template (prod, staging, dev)","Fail the deployment at boot if extension storage is unset but specs reference extensions","Document the flag next to any docs about enabling remote extensions"],"tags":["rust","compute-ctl","extensions","configuration","download"],"backgroundTag":"missing-configuration","analyzedSha":"8f60b04da47ffefe0e52bda2440134b42874eb75","analyzedAt":"2026-08-16T23:39:28.135Z","schemaVersion":2},"datasetVersion":"2026-08-17T04:17:16.089Z"}