ipfs/kubo · error

no usable bootstrap peers: AutoConf is disabled (AutoConf.En

Error message

no usable bootstrap peers: AutoConf is disabled (AutoConf.Enabled=false) but 'auto' placeholder is used in Bootstrap config. Either set AutoConf.Enabled=true to enable automatic configuration, or replace 'auto' with specific Bootstrap peer addresses

What it means

validateAutoConfDisabled is invoked by ValidateAutoConfWithRepo when AutoConf.Enabled=false. If the Bootstrap list contains only the 'auto' placeholder and no static peer addresses, there would be zero bootstrap peers, so kubo refuses to start with a clear explanation of the two valid configurations.

Source

Thrown at config/autoconf_client.go:123

		errors = append(errors, "Routing.DelegatedRouters contains 'auto' but AutoConf.Enabled=false")
	}

	// Check Ipns.DelegatedPublishers
	if slices.Contains(cfg.Ipns.DelegatedPublishers, AutoPlaceholder) {
		hasAutoValues = true
		errors = append(errors, "Ipns.DelegatedPublishers contains 'auto' but AutoConf.Enabled=false")
	}

	// Log all errors
	for _, errMsg := range errors {
		autoconfLog.Error(errMsg)
	}

	// If only auto values exist and no static ones, fail to start
	if hasAutoValues {
		if len(cfg.Bootstrap) == 1 && cfg.Bootstrap[0] == AutoPlaceholder {
			autoconfLog.Error("Kubo cannot start with only 'auto' Bootstrap values when AutoConf.Enabled=false")
			return fmt.Errorf("no usable bootstrap peers: AutoConf is disabled (AutoConf.Enabled=false) but 'auto' placeholder is used in Bootstrap config. Either set AutoConf.Enabled=true to enable automatic configuration, or replace 'auto' with specific Bootstrap peer addresses")
		}
	}

	return nil
}

View on GitHub (pinned to 329838acdf)

Solutions

  1. Set AutoConf.Enabled=true so 'auto' resolves to the default bootstrap peers
  2. Replace the 'auto' placeholder with explicit multiaddr bootstrap peers: ipfs config Bootstrap /dnsaddr/bootstrap.libp2p.io/p2p/Qm...
  3. Restore the default bootstrap list: ipfs bootstrap rm --all && ipfs bootstrap add --default
  4. Validate config before deploy: ensure Bootstrap has at least one non-'auto' entry when AutoConf is disabled

Example fix

// before (config.json)
"AutoConf": { "Enabled": false }, "Bootstrap": ["auto"]
// after
"AutoConf": { "Enabled": true }
// or
"Bootstrap": ["/ip4/147.75.83.83/tcp/4001/p2p/Qm..." ]
Defensive patterns

Strategy: validation

Validate before calling

if cfg.AutoConf.Enabled == false && len(cfg.Bootstrap) == 1 && cfg.Bootstrap[0] == "auto" {
    return errors.New("bootstrap is only 'auto' while AutoConf is disabled; fix config before starting")
}

Try / catch

if err := config.ValidateAutoConfWithRepo(repoPath); err != nil {
    if strings.Contains(err.Error(), "no usable bootstrap peers") { /* restore defaults or enable AutoConf */ }
    return err
}

Prevention

When it happens

Trigger: Starting the daemon with AutoConf.Enabled=false and cfg.Bootstrap == ["/dnsaddr/bootstrap.libp2p.io..."] replaced by the 'auto' placeholder (Bootstrap=["auto"]).

Common situations: Operator first ran with AutoConf enabled (Bootstrap was 'auto'), then disabled AutoConf without replacing Bootstrap; config templates that use 'auto' combined with AutoConf.Enabled=false toggles.

Related errors


AI-assisted analysis of ipfs/kubo@329838acdf (2026-09-03). Data as JSON: /api/errors/d270b62f5c57959a. Report an issue: GitHub.