Kubo version: 0.38.0
Repo version: 18
System version: amd64/linux
Golang version: go1.25.1
{
"API": {
"HTTPHeaders": {}
},
"Addresses": {
"API": "/ip4/127.0.0.1/tcp/5001",
"Announce": [],
"AppendAnnounce": [],
"Gateway": "/ip4/127.0.0.1/tcp/8080",
"NoAnnounce": [],
"Swarm": [
"/ip4/0.0.0.0/tcp/4001",
"/ip6/::/tcp/4001",
"/ip4/0.0.0.0/udp/4001/webrtc-direct",
"/ip4/0.0.0.0/udp/4001/quic-v1",
"/ip4/0.0.0.0/udp/4001/quic-v1/webtransport",
"/ip6/::/udp/4001/webrtc-direct",
"/ip6/::/udp/4001/quic-v1",
"/ip6/::/udp/4001/quic-v1/webtransport"
]
},
"AutoNAT": {},
"AutoTLS": {},
"Bootstrap": [
"/ip4/104.131.131.82/tcp/4001/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ",
"/ip4/104.131.131.82/udp/4001/quic-v1/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ",
"/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN",
"/dnsaddr/bootstrap.libp2p.io/p2p/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa",
"/dnsaddr/bootstrap.libp2p.io/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb",
"/dnsaddr/bootstrap.libp2p.io/p2p/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt"
],
"DNS": {
"Resolvers": {}
},
"Datastore": {
"BloomFilterSize": 0,
"GCPeriod": "1h",
"HashOnRead": false,
"Spec": {
"mounts": [
{
"child": {
"path": "blocks",
"shardFunc": "/repo/flatfs/shard/v1/next-to-last/2",
"sync": true,
"type": "flatfs"
},
"mountpoint": "/blocks",
"prefix": "flatfs.datastore",
"type": "measure"
},
{
"child": {
"compression": "none",
"path": "datastore",
"type": "levelds"
},
"mountpoint": "/",
"prefix": "leveldb.datastore",
"type": "measure"
}
],
"type": "mount"
},
"StorageGCWatermark": 90,
"StorageMax": "10GB"
},
"Discovery": {
"MDNS": {
"Enabled": true
}
},
"Experimental": {
"FilestoreEnabled": false,
"Libp2pStreamMounting": false,
"OptimisticProvide": false,
"OptimisticProvideJobsPoolSize": 0,
"P2pHttpProxy": false,
"StrategicProviding": false,
"UrlstoreEnabled": false
},
"Gateway": {
"DeserializedResponses": null,
"DisableHTMLErrors": null,
"ExposeRoutingAPI": null,
"HTTPHeaders": {},
"NoDNSLink": false,
"NoFetch": false,
"PublicGateways": null,
"RootRedirect": ""
},
"Identity": {
"PeerID": "12D3KooWBJNtmfaDN1G1enLgEuWVXAHGR98fjYDH2d3wNsKqWr4s"
},
"Import": {
"CidVersion": null,
"HashFunction": null,
"UnixFSChunker": null,
"UnixFSRawLeaves": null
},
"Internal": {},
"Ipns": {
"RecordLifetime": "",
"RepublishPeriod": "24h",
"ResolveCacheSize": 128
},
"Migration": {
"DownloadSources": [],
"Keep": ""
},
"Mounts": {
"FuseAllowOther": false,
"IPFS": "/ipfs",
"IPNS": "/ipns"
},
"Peering": {
"Peers": null
},
"Pinning": {
"RemoteServices": {}
},
"Plugins": {
"Plugins": null
},
"Provider": {
"Strategy": ""
},
"Pubsub": {
"DisableSigning": false,
"Router": ""
},
"Reprovider": {},
"Routing": {
"Methods": {
"find-peers": {
"RouterName": "HttpRouterNotSupported"
},
"find-providers": {
"RouterName": "HttpRoutersParallel"
},
"get-ipns": {
"RouterName": "HttpRouterNotSupported"
},
"provide": {
"RouterName": "HttpRoutersParallel"
},
"put-ipns": {
"RouterName": "HttpRouterNotSupported"
}
},
"Routers": {
"HttpRouter1": {
"Parameters": {
"Endpoint": "http://127.0.0.1:19575"
},
"Type": "http"
},
"HttpRouter2": {
"Parameters": {
"Endpoint": "http://127.0.0.1:19576"
},
"Type": "http"
},
"HttpRouter3": {
"Parameters": {
"Endpoint": "http://127.0.0.1:19577"
},
"Type": "http"
},
"HttpRouter4": {
"Parameters": {
"Endpoint": "http://127.0.0.1:19578"
},
"Type": "http"
},
"HttpRouterNotSupported": {
"Parameters": {
"Endpoint": "http://kubohttprouternotsupported"
},
"Type": "http"
},
"HttpRoutersParallel": {
"Parameters": {
"Routers": [
{
"IgnoreErrors": true,
"RouterName": "HttpRouter1",
"Timeout": "10s"
},
{
"IgnoreErrors": true,
"RouterName": "HttpRouter2",
"Timeout": "10s"
},
{
"IgnoreErrors": true,
"RouterName": "HttpRouter3",
"Timeout": "10s"
},
{
"IgnoreErrors": true,
"RouterName": "HttpRouter4",
"Timeout": "10s"
}
]
},
"Type": "parallel"
}
},
"Type": "custom"
},
"Swarm": {
"AddrFilters": null,
"ConnMgr": {},
"DisableBandwidthMetrics": false,
"DisableNatPortMap": false,
"RelayClient": {},
"RelayService": {},
"ResourceMgr": {},
"Transports": {
"Multiplexers": {},
"Network": {},
"Security": {}
}
},
"Version": {}
}
While preparing a regression test for the Plebbit project I noticed that Kubo 0.38 consistently loses freshly published IPNS records whenever the node relies on custom HTTP routers and has no bootstrap peers configured. The daemon starts, the ipfs name publish call succeeds, but any subsequent ipfs name resolve hangs until the stream closes without returning the record. After restarting the daemon the behaviour is identical, so the record never reaches the local datastore.
There are no explicit errors in the daemon logs. The only symptom is that the resolve call times out (even with a 60s client-side timeout) and never yields the /ipfs/<new-cid> path that was just published. My best guess is that the HTTP router configuration—where put-ipns/get-ipns are pointed at an unsupported endpoint—causes the daemon to skip persisting the record locally, even though the publish endpoint still reports success.
------------------------------
-- Using packaged Kubo 0.38.0 --
------------------------------
Binary path: .../node_modules/kubo/bin/ipfs
Selected ports: { api: 41047, gateway: 40758, swarmTcp: 42351, swarmQuic: 56172 }
...
Added CID: QmfNCoN51J2fLkbSTTFTBbYFX23GEqAhLF5DLjDSjXNf5h
Published IPNS: {
name: 'k51qzi5uqu5dlws3n28q0wq2xf5vzbadu84buuqz5h5kma6mpmnwgqc38uangp',
value: '/ipfs/QmfNCoN51J2fLkbSTTFTBbYFX23GEqAhLF5DLjDSjXNf5h'
}
Resolving IPNS name ... with options { timeout: 60000 }
Immediate resolve failed: Error: No IPNS result returned before the stream closed
...
Post-restart resolve failed as expected: No IPNS result returned before the stream closed
Every run so far ends the same way: the publish reports success, but neither the immediate nor post-restart resolve ever returns the new record.
Checklist
Installation method
dist.ipfs.tech or ipfs-update
Version
Config
{ "API": { "HTTPHeaders": {} }, "Addresses": { "API": "/ip4/127.0.0.1/tcp/5001", "Announce": [], "AppendAnnounce": [], "Gateway": "/ip4/127.0.0.1/tcp/8080", "NoAnnounce": [], "Swarm": [ "/ip4/0.0.0.0/tcp/4001", "/ip6/::/tcp/4001", "/ip4/0.0.0.0/udp/4001/webrtc-direct", "/ip4/0.0.0.0/udp/4001/quic-v1", "/ip4/0.0.0.0/udp/4001/quic-v1/webtransport", "/ip6/::/udp/4001/webrtc-direct", "/ip6/::/udp/4001/quic-v1", "/ip6/::/udp/4001/quic-v1/webtransport" ] }, "AutoNAT": {}, "AutoTLS": {}, "Bootstrap": [ "/ip4/104.131.131.82/tcp/4001/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ", "/ip4/104.131.131.82/udp/4001/quic-v1/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ", "/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN", "/dnsaddr/bootstrap.libp2p.io/p2p/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa", "/dnsaddr/bootstrap.libp2p.io/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb", "/dnsaddr/bootstrap.libp2p.io/p2p/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt" ], "DNS": { "Resolvers": {} }, "Datastore": { "BloomFilterSize": 0, "GCPeriod": "1h", "HashOnRead": false, "Spec": { "mounts": [ { "child": { "path": "blocks", "shardFunc": "/repo/flatfs/shard/v1/next-to-last/2", "sync": true, "type": "flatfs" }, "mountpoint": "/blocks", "prefix": "flatfs.datastore", "type": "measure" }, { "child": { "compression": "none", "path": "datastore", "type": "levelds" }, "mountpoint": "/", "prefix": "leveldb.datastore", "type": "measure" } ], "type": "mount" }, "StorageGCWatermark": 90, "StorageMax": "10GB" }, "Discovery": { "MDNS": { "Enabled": true } }, "Experimental": { "FilestoreEnabled": false, "Libp2pStreamMounting": false, "OptimisticProvide": false, "OptimisticProvideJobsPoolSize": 0, "P2pHttpProxy": false, "StrategicProviding": false, "UrlstoreEnabled": false }, "Gateway": { "DeserializedResponses": null, "DisableHTMLErrors": null, "ExposeRoutingAPI": null, "HTTPHeaders": {}, "NoDNSLink": false, "NoFetch": false, "PublicGateways": null, "RootRedirect": "" }, "Identity": { "PeerID": "12D3KooWBJNtmfaDN1G1enLgEuWVXAHGR98fjYDH2d3wNsKqWr4s" }, "Import": { "CidVersion": null, "HashFunction": null, "UnixFSChunker": null, "UnixFSRawLeaves": null }, "Internal": {}, "Ipns": { "RecordLifetime": "", "RepublishPeriod": "24h", "ResolveCacheSize": 128 }, "Migration": { "DownloadSources": [], "Keep": "" }, "Mounts": { "FuseAllowOther": false, "IPFS": "/ipfs", "IPNS": "/ipns" }, "Peering": { "Peers": null }, "Pinning": { "RemoteServices": {} }, "Plugins": { "Plugins": null }, "Provider": { "Strategy": "" }, "Pubsub": { "DisableSigning": false, "Router": "" }, "Reprovider": {}, "Routing": { "Methods": { "find-peers": { "RouterName": "HttpRouterNotSupported" }, "find-providers": { "RouterName": "HttpRoutersParallel" }, "get-ipns": { "RouterName": "HttpRouterNotSupported" }, "provide": { "RouterName": "HttpRoutersParallel" }, "put-ipns": { "RouterName": "HttpRouterNotSupported" } }, "Routers": { "HttpRouter1": { "Parameters": { "Endpoint": "http://127.0.0.1:19575" }, "Type": "http" }, "HttpRouter2": { "Parameters": { "Endpoint": "http://127.0.0.1:19576" }, "Type": "http" }, "HttpRouter3": { "Parameters": { "Endpoint": "http://127.0.0.1:19577" }, "Type": "http" }, "HttpRouter4": { "Parameters": { "Endpoint": "http://127.0.0.1:19578" }, "Type": "http" }, "HttpRouterNotSupported": { "Parameters": { "Endpoint": "http://kubohttprouternotsupported" }, "Type": "http" }, "HttpRoutersParallel": { "Parameters": { "Routers": [ { "IgnoreErrors": true, "RouterName": "HttpRouter1", "Timeout": "10s" }, { "IgnoreErrors": true, "RouterName": "HttpRouter2", "Timeout": "10s" }, { "IgnoreErrors": true, "RouterName": "HttpRouter3", "Timeout": "10s" }, { "IgnoreErrors": true, "RouterName": "HttpRouter4", "Timeout": "10s" } ] }, "Type": "parallel" } }, "Type": "custom" }, "Swarm": { "AddrFilters": null, "ConnMgr": {}, "DisableBandwidthMetrics": false, "DisableNatPortMap": false, "RelayClient": {}, "RelayService": {}, "ResourceMgr": {}, "Transports": { "Multiplexers": {}, "Network": {}, "Security": {} } }, "Version": {} }Description
Draft GitHub Issue: Kubo 0.38 drops freshly published IPNS records with HTTP router config
Description
While preparing a regression test for the Plebbit project I noticed that Kubo 0.38 consistently loses freshly published IPNS records whenever the node relies on custom HTTP routers and has no bootstrap peers configured. The daemon starts, the
ipfs name publishcall succeeds, but any subsequentipfs name resolvehangs until the stream closes without returning the record. After restarting the daemon the behaviour is identical, so the record never reaches the local datastore.There are no explicit errors in the daemon logs. The only symptom is that the resolve call times out (even with a 60s client-side timeout) and never yields the
/ipfs/<new-cid>path that was just published. My best guess is that the HTTP router configuration—whereput-ipns/get-ipnsare pointed at an unsupported endpoint—causes the daemon to skip persisting the record locally, even though the publish endpoint still reports success.Environment
npm install kubo@0.38.0, binary executed fromnode_modules/kubo/bin/ipfsBootstrap = []Discovery.MDNS.Enabled = falsefind-providers/provide, andget-ipns/put-ipnspointed at a dummy host)What I Was Doing
ipfs daemon) with no bootstrap peers.ipfs add).ipfs name publish --allow-offline --resolve=false --lifetime 24h.ipfs name resolve(HTTP API, 60s timeout).Expected vs Actual
/ipfs/<new-cid>immediately and after restart.Steps To Reproduce
All of the above is automated in this repository:
Sample run (trimmed for brevity):
Every run so far ends the same way: the publish reports success, but neither the immediate nor post-restart resolve ever returns the new record.