{"record":{"id":"00fef2ddbc5c90bb","repo":"gastownhall/beads","slug":"newexternalproxiedserveruowprovider-proxied-serve-00fef2","errorCode":null,"errorMessage":"newExternalProxiedServerUOWProvider: proxied server log (from env or %s): %w","messagePattern":"newExternalProxiedServerUOWProvider: proxied server log \\(from env or (.+?)\\): %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/bd/uow_factory.go","lineNumber":445,"sourceCode":"// the paths it resolves (root, log) are the same ones proxied mode uses because\n// both modes root their server at the same directory.\nfunc newExternalProxiedServerUOWProvider(ctx context.Context, beadsDir string, topology sqlServerUOWTopology, opts ...uow.ProviderOption) (p uow.UnitOfWorkProvider, err error) {\n\tdefer func() { p, err = activateEventsJournalProvider(ctx, beadsDir, p, err) }()\n\trootPath, err := resolveProxiedServerRootPath(beadsDir)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"newExternalProxiedServerUOWProvider: resolve root path: %w\", err)\n\t}\n\tif err := validateProxiedServerRootPath(rootPath); err != nil {\n\t\treturn nil, fmt.Errorf(\"newExternalProxiedServerUOWProvider: proxied server root (from env or %s): %w\", configfile.ProxiedServerClientInfoFileName, err)\n\t}\n\n\tlogPath, isCustomLog, err := resolveProxiedServerLogPath(beadsDir)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"newExternalProxiedServerUOWProvider: resolve log path: %w\", err)\n\t}\n\tif isCustomLog {\n\t\tif err := validateProxiedServerLogPath(logPath); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"newExternalProxiedServerUOWProvider: proxied server log (from env or %s): %w\", configfile.ProxiedServerClientInfoFileName, err)\n\t\t}\n\t}\n\n\tif err := os.MkdirAll(rootPath, config.BeadsDirPerm); err != nil {\n\t\treturn nil, fmt.Errorf(\"newExternalProxiedServerUOWProvider: mkdir %s: %w\", rootPath, err)\n\t}\n\n\treturn uow.NewExternalDoltServerUOWProvider(\n\t\tctx,\n\t\trootPath,\n\t\ttopology.database,\n\t\tlogPath,\n\t\t*topology.external,\n\t\ttopology.external.ResolvedUser(),\n\t\ttopology.rootPassword,\n\t\ttopology.proxyPort,\n\t\ttopology.proxyIdle,\n\t\ttopology.teamServer,","sourceCodeStart":427,"sourceCodeEnd":463,"githubUrl":"https://github.com/gastownhall/beads/blob/71377f276968b452ee607177637970a4ff888584/cmd/bd/uow_factory.go#L427-L463","documentation":"After resolving a custom log path for the external proxied server, newExternalProxiedServerUOWProvider validates it with validateProxiedServerLogPath and wraps failures with this error. Validation requires the log's parent directory to exist and be a directory, and the log itself, if present, to be a regular file. The message names proxied_server_client_info.json because a custom log path typically comes from that sidecar's log_path (or BEADS_PROXIED_SERVER_LOG).","triggerScenarios":"BEADS_PROXIED_SERVER_LOG or sidecar log_path points into a nonexistent or non-directory parent (e.g. /var/log/bd missing); the log path exists but is a directory, FIFO, or device; stat on the log or its parent fails for reasons other than NotExist (e.g. EACCES).","commonSituations":"User set BEADS_PROXIED_SERVER_LOG to a path whose parent was never created; a log rotation tool replaced server.log with a directory; the sidecar log_path points at a mount point or socket.","solutions":["Create the log's parent directory: mkdir -p $(dirname \"$BEADS_PROXIED_SERVER_LOG\")","Check that the log path is not a directory or special file (ls -la); remove/rename it if so","Unset BEADS_PROXIED_SERVER_LOG or clear log_path in .beads/proxied_server_client_info.json to fall back to <root>/server.log","Verify permissions allow stat/creation of the parent directory"],"exampleFix":"// before: parent missing\nexport BEADS_PROXIED_SERVER_LOG=/var/log/bd/server.log  # /var/log/bd does not exist\n// after\nmkdir -p /var/log/bd && export BEADS_PROXIED_SERVER_LOG=/var/log/bd/server.log","handlingStrategy":"validation","validationCode":"logPath := os.Getenv(\"BEADS_PROXIED_SERVER_LOG\")\nif logPath != \"\" {\n\tparent := filepath.Dir(logPath)\n\tif fi, err := os.Stat(parent); err != nil || !fi.IsDir() {\n\t\treturn fmt.Errorf(\"log parent %s missing or not a directory\", parent)\n\t}\n\tif fi, err := os.Stat(logPath); err == nil && !fi.Mode().IsRegular() {\n\t\treturn fmt.Errorf(\"log %s is not a regular file\", logPath)\n\t}\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Pre-create the log's parent directory before pointing BEADS_PROXIED_SERVER_LOG at it","Ensure log rotation keeps the log a regular file (never replace it with a directory or symlink chain to a socket)","Quote log paths carefully in scripts to avoid trailing-slash/directory mistakes","Prefer the default <root>/server.log unless you specifically need a custom location"],"tags":["go","proxied-server","log-path","validation"],"backgroundTag":"invalid-log-path","analyzedSha":"71377f276968b452ee607177637970a4ff888584","analyzedAt":"2026-08-30T18:55:39.744Z","schemaVersion":2},"datasetVersion":"2026-08-30T23:17:21.991Z"}