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

  1. Read the appended msg — it is the remote's own failure reason and usually names the fix
  2. Re-share the API token from the remote and update the node record on the manager
  3. Confirm both panels run compatible versions (envelope must include success:true and obj)
  4. 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

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


AI-assisted analysis of MHSanaei/3x-ui@ad32144c42 (2026-08-15). Data as JSON: /api/errors/3a00875a295b53c0. Report an issue: GitHub.