{"record":{"id":"d619a184f1754f02","repo":"ipfs/kubo","slug":"deprecated-configuration-detected-manually-migrat-d619a1","errorCode":null,"errorMessage":"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#","messagePattern":"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#","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/ipfs/kubo/daemon.go","lineNumber":974,"sourceCode":"\t\treturn maddr // not ip\n\t}\n}\n\nfunc validateDaemonConfig(cfg *config.Config, routingOption string, privateNetwork bool) error {\n\tif privateNetwork && (routingOption == routingOptionAutoKwd || routingOption == routingOptionAutoClientKwd) {\n\t\treturn errors.New(\"private network does not work with Routing.Type=auto. Update your config to Routing.Type=dht (or none, and do manual peering)\")\n\t}\n\n\t// Check for deprecated Provider/Reprovider configuration after migration.\n\t// This should never happen for regular users, but is useful error for people who have Docker orchestration\n\t// that blindly sets config keys (overriding automatic Kubo migration).\n\t//nolint:staticcheck // intentionally checking deprecated fields\n\tif cfg.Provider.Enabled != config.Default || !cfg.Provider.Strategy.IsDefault() || !cfg.Provider.WorkerCount.IsDefault() {\n\t\treturn 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\")\n\t}\n\t//nolint:staticcheck // intentionally checking deprecated fields\n\tif !cfg.Reprovider.Interval.IsDefault() || !cfg.Reprovider.Strategy.IsDefault() {\n\t\treturn 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\")\n\t}\n\tif cfg.Provide.Strategy.WithDefault(\"\") == \"flat\" {\n\t\treturn errors.New(\"Provide.Strategy='flat' is no longer supported. Use 'all' instead. Documentation: https://github.com/ipfs/kubo/blob/master/docs/config.md#providestrategy\")\n\t}\n\tif cfg.Experimental.StrategicProviding {\n\t\treturn 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\")\n\t}\n\tif cfg.Provide.DHT.SweepEnabled.WithDefault(config.DefaultProvideDHTSweepEnabled) &&\n\t\tcfg.Provide.DHT.MaxWorkers.WithDefault(config.DefaultProvideDHTMaxWorkers) == 0 {\n\t\treturn 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\")\n\t}\n\tif routingOption == routingOptionDelegatedKwd && cfg.Provide.Enabled.WithDefault(config.DefaultProvideEnabled) {\n\t\treturn errors.New(\"Routing.Type=delegated does not support content providing. Set Provide.Enabled=false in your config\")\n\t}\n\n\treturn nil\n}\n","sourceCodeStart":956,"sourceCodeEnd":992,"githubUrl":"https://github.com/ipfs/kubo/blob/329838acdfafae224582930457efe80aa217afc0/cmd/ipfs/kubo/daemon.go#L956-L992","documentation":"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.","triggerScenarios":"`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.","commonSituations":"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.","solutions":["Rename keys: Reprovider.Strategy -> Provide.Strategy, Reprovider.Interval -> Provide.DHT.Interval","Remove the Reprovider section from $IPFS_PATH/config (or `ipfs config --delete Reprovider` variant per key)","Update config templates/provisioning code to use Provide.*","See docs/config.md#provide for current semantics"],"exampleFix":"// before (config.json)\n\"Reprovider\": { \"Strategy\": \"pins\", \"Interval\": \"22h\" }\n\n// after\n\"Provide\": { \"Strategy\": \"pins\", \"DHT\": { \"Interval\": \"22h\" } }\n// and delete the \"Reprovider\" section","handlingStrategy":"validation","validationCode":"// fail fast if legacy Reprovider keys present\njq -e '(.Reprovider.Interval != null) or (.Reprovider.Strategy != null)' \"$IPFS_PATH/config\" \\\n  && echo \"legacy Reprovider.* keys present: Reprovider.Strategy->Provide.Strategy, Reprovider.Interval->Provide.DHT.Interval\"","typeGuard":null,"tryCatchPattern":"if err := daemonFunc(...); err != nil {\n    if strings.Contains(err.Error(), \"migrate 'Reprovider'\") {\n        log.Fatalf(\"rename Reprovider keys: %v\", err)\n    }\n}","preventionTips":["Update config templates to Provide.Strategy / Provide.DHT.Interval","Grep repo configs for 'Reprovider' during upgrades","Delete Reprovider section after migrating values","Keep a migration checklist for Kubo version bumps"],"tags":["config","deprecation","reprovider","migration"],"backgroundTag":"deprecated-config-key","analyzedSha":"329838acdfafae224582930457efe80aa217afc0","analyzedAt":"2026-09-03T18:30:52.135Z","contentChangedAt":"2026-09-03T18:30:52.135Z","schemaVersion":2},"datasetVersion":"2026-09-11T00:17:11.886Z"}