{"record":{"id":"9592d6a7ed06f5a1","repo":"benbjohnson/litestream","slug":"failed-to-expand-meta-path-for-s-w","errorCode":null,"errorMessage":"failed to expand meta path for %s: %w","messagePattern":"failed to expand meta path for (.+?): %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/litestream/main.go","lineNumber":897,"sourceCode":"\tdbConfigCopy.Recursive = false // Clear recursive flag\n\tdbConfigCopy.Watch = false     // Individual DBs do not watch directories\n\n\t// Ensure every database discovered beneath a directory receives a unique\n\t// metadata path. Without this, all databases share the same meta-path and\n\t// clobber each other's replication state.\n\tswitch {\n\tcase dbc.MetaDir != nil:\n\t\tbaseMetaDir, err := expand(*dbc.MetaDir)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to expand meta dir for %s: %w\", dbPath, err)\n\t\t}\n\t\tmetaPathCopy := filepath.Join(baseMetaDir, relPath+litestream.MetaDirSuffix)\n\t\tdbConfigCopy.MetaPath = &metaPathCopy\n\t\tdbConfigCopy.MetaDir = nil\n\tcase dbc.MetaPath != nil:\n\t\tbaseMetaPath, err := expand(*dbc.MetaPath)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to expand meta path for %s: %w\", dbPath, err)\n\t\t}\n\t\tmetaPathCopy := deriveMetaPathForDirectoryEntry(baseMetaPath, relPath)\n\t\tdbConfigCopy.MetaPath = &metaPathCopy\n\t\tdbConfigCopy.MetaDir = nil\n\t}\n\n\t// Deep copy replica config and make path unique per database.\n\t// This prevents all databases from writing to the same replica path.\n\tif dbc.Replica != nil {\n\t\treplicaCopy, err := cloneReplicaConfigWithRelativePath(dbc.Replica, relPath)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to configure replica for %s: %w\", dbPath, err)\n\t\t}\n\t\tdbConfigCopy.Replica = replicaCopy\n\t}\n\n\t// Also handle deprecated 'replicas' array field.\n\tif len(dbc.Replicas) > 0 {","sourceCodeStart":879,"sourceCodeEnd":915,"githubUrl":"https://github.com/benbjohnson/litestream/blob/4ed7a308f6271ebfd2b0a6e4b70b03011a37e4a3/cmd/litestream/main.go#L879-L915","documentation":"When 'meta-path' is set with directory replication, newDBFromDirectoryEntry expands environment variables in it to obtain the base meta path before deriving a per-database path from the relative path. Failure of the expand step is wrapped with the database path.","triggerScenarios":"expand(*dbc.MetaPath) returns an error — an unset/malformed environment variable reference in the meta-path value.","commonSituations":"meta-path contains $VAR that isn't present in the process environment (systemd unit missing Environment=, Docker env not passed); typo in the variable name.","solutions":["Export/set the referenced environment variable for the litestream process.","Use a literal path in meta-path instead of variable expansion.","Prefer meta-dir for directory replication so per-DB paths are derived automatically."],"exampleFix":"# before\nmeta-path: $META_BASE/litestream\n\n# after\nmeta-path: /var/lib/litestream/meta\n","handlingStrategy":"validation","validationCode":"if v := os.Getenv(\"META_BASE\"); v == \"\" && strings.Contains(metaPath, \"$META_BASE\") {\n    return fmt.Errorf(\"META_BASE must be set\")\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Verify environment variables are passed to the litestream process (Docker env, systemd unit).","Use meta-dir for directory replication to avoid meta-path expansion entirely.","Keep env var names consistent between deployment manifests and configs."],"tags":["config","litestream","env-var","expansion"],"backgroundTag":"invalid-env-var-value","analyzedSha":"4ed7a308f6271ebfd2b0a6e4b70b03011a37e4a3","analyzedAt":"2026-09-06T18:29:25.564Z","contentChangedAt":"2026-09-06T18:29:25.564Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}