MHSanaei/3x-ui · error
remote returned success=false: {msg}
Error message
remote returned success=false: {msg} What it means
The remote panel answered HTTP 200 but its JSON envelope reported success=false (or the obj payload was missing), so the probe treats the node as unhealthy and surfaces the remote's own msg. This is the remote panel's application-level error — most often an expired/invalid API token or a session error inside the remote — delivered inside a structurally valid response. The distinction matters: connectivity and TLS are fine; authorization at the remote is not.
Source
Thrown at internal/web/service/node.go:1184
State string `json:"state"`
ErrorMsg string `json:"errorMsg"`
} `json:"xray"`
PanelVersion string `json:"panelVersion"`
PanelGuid string `json:"panelGuid"`
Uptime uint64 `json:"uptime"`
NetIO struct {
Up uint64 `json:"up"`
Down uint64 `json:"down"`
} `json:"netIO"`
} `json:"obj"`
}
if err := json.NewDecoder(resp.Body).Decode(&envelope); err != nil {
patch.LastError = "decode response: " + err.Error()
return patch, err
}
if !envelope.Success || envelope.Obj == nil {
patch.LastError = "remote returned success=false: " + envelope.Msg
return patch, errors.New(patch.LastError)
}
o := envelope.Obj
patch.CpuPct = o.CpuPct
if o.Mem.Total > 0 {
patch.MemPct = float64(o.Mem.Current) * 100.0 / float64(o.Mem.Total)
}
patch.XrayVersion = o.Xray.Version
patch.XrayState = o.Xray.State
patch.XrayError = o.Xray.ErrorMsg
patch.PanelVersion = o.PanelVersion
patch.Guid = o.PanelGuid
patch.UptimeSecs = o.Uptime
patch.NetUp = o.NetIO.Up
patch.NetDown = o.NetIO.Down
return patch, nil
}
type ProbeResultUI struct {View on GitHub (pinned to ad32144c42)
Solutions
- Read the appended msg — it is the remote's own failure reason and usually names the fix
- Re-share the API token from the remote and update the node record on the manager
- Confirm both panels run compatible versions (envelope must include success:true and obj)
- Re-run the health check after fixing; patch.LastError clears on the next successful probe
Defensive patterns
Strategy: validation
Try / catch
patch, err := probe(ctx, node)
if err != nil && strings.Contains(err.Error(), "success=false") {
// application-level failure: read msg, fix auth/config on the remote, no point retrying blindly
} Prevention
- Re-share the remote's API token after any remote restart/rotation
- Keep manager and remote panel versions compatible so the envelope shape matches
- Log patch.LastError verbatim — it carries the remote's own reason
When it happens
Trigger: Remote panel restarted and generated a new token/guid while the manager still holds the old one; remote's server-status handler failing internally (its msg will say why); a proxy intercepting and returning its own success=false JSON.
Common situations: Post-restart token drift between nodes; remote panel version mismatch changing the envelope shape (success field absent decodes as false).
Related errors
- node port must be 1-65535
- HTTP %d from remote panel
- node has no API token configured
- The current username or password is invalid
- The new username and password are empty
AI-assisted analysis of MHSanaei/3x-ui@ad32144c42 (2026-08-15).
Data as JSON: /api/errors/3a00875a295b53c0.
Report an issue: GitHub.