ipfs/kubo · error

deprecated configuration detected. Manually migrate 'Reprovi

Error message

deprecated configuration detected. Manually migrate 'Reprovider' fields to 'Provide': Reprovider.Strategy -> Provide.Strategy, Reprovider.Interval -> Provide.DHT.Interval. Remove 'Reprovider' from your config. Documentation: https://github.com/ipfs/kubo/blob/master/docs/config.md#

What it means

validateDaemonConfig detects the removed Reprovider config section and refuses startup, telling the operator the exact key renames: Reprovider.Strategy -> Provide.Strategy and Reprovider.Interval -> Provide.DHT.Interval. Like the Provider check, it guards against tooling that re-writes legacy keys after Kubo's migration.

Source

Thrown at cmd/ipfs/kubo/daemon.go:974

		return maddr // not ip
	}
}

func validateDaemonConfig(cfg *config.Config, routingOption string, privateNetwork bool) error {
	if privateNetwork && (routingOption == routingOptionAutoKwd || routingOption == routingOptionAutoClientKwd) {
		return errors.New("private network does not work with Routing.Type=auto. Update your config to Routing.Type=dht (or none, and do manual peering)")
	}

	// Check for deprecated Provider/Reprovider configuration after migration.
	// This should never happen for regular users, but is useful error for people who have Docker orchestration
	// that blindly sets config keys (overriding automatic Kubo migration).
	//nolint:staticcheck // intentionally checking deprecated fields
	if cfg.Provider.Enabled != config.Default || !cfg.Provider.Strategy.IsDefault() || !cfg.Provider.WorkerCount.IsDefault() {
		return errors.New("deprecated configuration detected. Manually migrate 'Provider' fields to 'Provide' and remove 'Provider' from your config. Documentation: https://github.com/ipfs/kubo/blob/master/docs/config.md#provide")
	}
	//nolint:staticcheck // intentionally checking deprecated fields
	if !cfg.Reprovider.Interval.IsDefault() || !cfg.Reprovider.Strategy.IsDefault() {
		return errors.New("deprecated configuration detected. Manually migrate 'Reprovider' fields to 'Provide': Reprovider.Strategy -> Provide.Strategy, Reprovider.Interval -> Provide.DHT.Interval. Remove 'Reprovider' from your config. Documentation: https://github.com/ipfs/kubo/blob/master/docs/config.md#provide")
	}
	if cfg.Provide.Strategy.WithDefault("") == "flat" {
		return errors.New("Provide.Strategy='flat' is no longer supported. Use 'all' instead. Documentation: https://github.com/ipfs/kubo/blob/master/docs/config.md#providestrategy")
	}
	if cfg.Experimental.StrategicProviding {
		return errors.New("Experimental.StrategicProviding was removed. Remove it from your config. Documentation: https://github.com/ipfs/kubo/blob/master/docs/experimental-features.md#strategic-providing")
	}
	if cfg.Provide.DHT.SweepEnabled.WithDefault(config.DefaultProvideDHTSweepEnabled) &&
		cfg.Provide.DHT.MaxWorkers.WithDefault(config.DefaultProvideDHTMaxWorkers) == 0 {
		return errors.New("invalid configuration: Provide.DHT.MaxWorkers cannot be 0 when Provide.DHT.SweepEnabled=true. Set Provide.DHT.MaxWorkers to a positive value (e.g., 16) to control resource usage. Documentation: https://github.com/ipfs/kubo/blob/master/docs/config.md#providedhtmaxworkers")
	}
	if routingOption == routingOptionDelegatedKwd && cfg.Provide.Enabled.WithDefault(config.DefaultProvideEnabled) {
		return errors.New("Routing.Type=delegated does not support content providing. Set Provide.Enabled=false in your config")
	}

	return nil
}

View on GitHub (pinned to 329838acdf)

Solutions

  1. Rename keys: Reprovider.Strategy -> Provide.Strategy, Reprovider.Interval -> Provide.DHT.Interval
  2. Remove the Reprovider section from $IPFS_PATH/config (or `ipfs config --delete Reprovider` variant per key)
  3. Update config templates/provisioning code to use Provide.*
  4. See docs/config.md#provide for current semantics

Example fix

// before (config.json)
"Reprovider": { "Strategy": "pins", "Interval": "22h" }

// after
"Provide": { "Strategy": "pins", "DHT": { "Interval": "22h" } }
// and delete the "Reprovider" section
Defensive patterns

Strategy: validation

Validate before calling

// fail fast if legacy Reprovider keys present
jq -e '(.Reprovider.Interval != null) or (.Reprovider.Strategy != null)' "$IPFS_PATH/config" \
  && echo "legacy Reprovider.* keys present: Reprovider.Strategy->Provide.Strategy, Reprovider.Interval->Provide.DHT.Interval"

Try / catch

if err := daemonFunc(...); err != nil {
    if strings.Contains(err.Error(), "migrate 'Reprovider'") {
        log.Fatalf("rename Reprovider keys: %v", err)
    }
}

Prevention

When it happens

Trigger: `ipfs daemon` when config contains non-default Reprovider.Interval or Reprovider.Strategy values — typically written by deployment scripts or copied from an old node's config after upgrading Kubo.

Common situations: Ansible/Docker provisioning templates still templating Reprovider.*; hand-copied configs from pre-migration Kubo versions; cluster nodes kept in sync with a legacy config file.

Related errors


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