{"record":{"id":"65b1f5f34b1d7d36","repo":"fatedier/frp","slug":"not-found-proxy-q","errorCode":null,"errorMessage":"not found: proxy %q","messagePattern":"not found: proxy %q","errorType":"http","errorClass":"configmgmt.ErrNotFound","httpStatus":404,"severity":"error","filePath":"client/config_manager.go","lineNumber":173,"sourceCode":"\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn storeSource.GetAllProxies()\n}\n\nfunc (m *serviceConfigManager) GetStoreProxy(name string) (v1.ProxyConfigurer, error) {\n\tif name == \"\" {\n\t\treturn nil, fmt.Errorf(\"%w: proxy name is required\", configmgmt.ErrInvalidArgument)\n\t}\n\n\tstoreSource, err := m.storeSourceOrError()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tcfg := storeSource.GetProxy(name)\n\tif cfg == nil {\n\t\treturn nil, fmt.Errorf(\"%w: proxy %q\", configmgmt.ErrNotFound, name)\n\t}\n\treturn cfg, nil\n}\n\nfunc (m *serviceConfigManager) CreateStoreProxy(cfg v1.ProxyConfigurer) (v1.ProxyConfigurer, error) {\n\tif err := m.validateStoreProxyConfigurer(cfg); err != nil {\n\t\treturn nil, fmt.Errorf(\"%w: validation error: %v\", configmgmt.ErrInvalidArgument, err)\n\t}\n\n\tname := cfg.GetBaseConfig().Name\n\tpersisted, err := m.withStoreProxyMutationAndReload(name, func(storeSource *source.StoreSource) error {\n\t\tif err := storeSource.AddProxy(cfg); err != nil {\n\t\t\tif errors.Is(err, source.ErrAlreadyExists) {\n\t\t\t\treturn fmt.Errorf(\"%w: %v\", configmgmt.ErrConflict, err)\n\t\t\t}\n\t\t\treturn err\n\t\t}\n\t\treturn nil","sourceCodeStart":155,"sourceCodeEnd":191,"githubUrl":"https://github.com/fatedier/frp/blob/6c8a8d0a97d03b44e9528d30b30c70cb9d61b405/client/config_manager.go#L155-L191","documentation":"Returned by GetStoreProxy when a store source exists but contains no proxy with the requested name (storeSource.GetProxy(name) returned nil). It wraps configmgmt.ErrNotFound, which the admin API surfaces as HTTP 404. Only proxies persisted in the config store are visible here; running-but-unstored proxies are not.","triggerScenarios":"GET /api/store/proxies/{name} for a name that was never created via POST /api/store/proxies, was deleted, or differs in case/spelling from the stored name. Also when querying a proxy defined in the static config file while the store source tracks only API-created entries, depending on how the store source is backed.","commonSituations":"Case mismatch (MyProxy vs myproxy); assuming file-defined proxies are in the store; a name copied from the frps dashboard that differs from the frpc-side proxy name; checking existence right after deletion.","solutions":["List all stored proxies with GET /api/store/proxies and use the exact returned name.","If the proxy should exist, create it with POST /api/store/proxies first.","Verify you are querying the right frpc instance's admin port; each client has its own store."],"exampleFix":"# before\ncurl http://127.0.0.1:7400/api/store/proxies/SSH   # 404 not found: proxy \"SSH\"\n\n# after\ncurl http://127.0.0.1:7400/api/store/proxies | jq '.[].name'   # find exact name\ncurl http://127.0.0.1:7400/api/store/proxies/ssh","handlingStrategy":"try-catch","validationCode":"// Check existence via the list endpoint first.\nfunc exists(base, name string) bool {\n    resp, _ := http.Get(base + \"/api/store/proxies\")\n    defer resp.Body.Close()\n    var list []struct{ Name string }\n    json.NewDecoder(resp.Body).Decode(&list)\n    for _, p := range list { if p.Name == name { return true } }\n    return false\n}","typeGuard":null,"tryCatchPattern":"cfg, err := mgr.GetStoreProxy(name)\nif err != nil {\n    if errors.Is(err, configmgmt.ErrNotFound) {\n        // handle absent proxy: create it or report cleanly\n    }\n    return err\n}","preventionTips":["Use exact names from list endpoints; proxy names are case-sensitive","Remember file-defined proxies may not appear in the store API"],"tags":["frp","frpc","store","proxy","not-found"],"backgroundTag":null,"analyzedSha":"6c8a8d0a97d03b44e9528d30b30c70cb9d61b405","analyzedAt":"2026-08-15T06:53:27.215Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}