Check if you can find your content on IPFS
A debugging tool for checking the retrievability of data by IPFS peers
go install github.com/ipfs/ipfs-check@latest will build and install the server binary in your global Go binary directory (e.g. ~/go/bin)
Automated Docker container releases are available from the Github container registry:
- Releases
- latestalways points at the latest stable release
- vN.N.Npoint at a specific release tag
 
- Unreleased developer builds
- main-latestalways points at the- HEADof the- mainbranch
- main-YYYY-DD-MM-GITSHApoints at a specific commit from the- mainbranch
 
- ⚠️ Experimental, unstable builds- staging-latestalways points at the- HEADof the- stagingbranch
- staging-YYYY-DD-MM-GITSHApoints at a specific commit from the- stagingbranch
- This tag is used by developers for internal testing, not intended for end users
 
When using Docker, make sure to pass necessary config via -e:
$ docker pull ghcr.io/ipfs/ipfs-check:main-latest
$ docker run --rm -it --net=host -e IPFS_CHECK_ACCELERATED_DHT=true ghcr.io/ipfs/ipfs-check:main-latestLearn available variables via ./ipfs-check --help
go build will build the ./ipfs-check binary in your local directory
The web assets in ./web directory are embedded directly into the Go binary and served as-is. No build step is required for deployment - the pre-built CSS and static files are already committed to the repository.
The latest version from the main branch is automatically deployed to https://check.ipfs.network for convenience.
If you need to modify the web interface styles:
- Make changes to web/input.css
- Run npm ciandnpm run buildin thewebdirectory (seeweb/README.mdfor details)
- Commit the updated web/output.cssfile
Important
Breaking changes to the HTTP API or frontend MUST be avoided. The new ./web should always work with old backend versions to ensure compatibility.
For production deployments, you'll want a proxy for HTTPS support on the Go server.
$ go build
$ ./ipfs-check
Starting ipfs-check
...
2024/08/29 20:42:34 Please wait, initializing accelerated-dht client.. (mapping Amino DHT may takes 5 or more minutes)
2024/08/29 20:42:34 Accelerated DHT client ready
2024/08/29 20:46:59 Backend ready and listening on [::]:3333
2024/08/29 20:46:59 Test fronted at http://localhost:3333/web/?backendURL=http://localhost:3333
2024/08/29 20:46:59 Ready to start serving.As a convenience, a test frontend is provided at http://localhost:3333/web/?backendURL=http://localhost:3333.
If you don't want to use test HTTP server from ipfs-check itself, feel free to use any other tool to serve the contents of the /web folder (you can open the html file directly in your browser).
npx -y serve -l 3000 web
# Then open http://localhost:3000?backendURL=http://localhost:3333
To run a check, make an http call with the cid and multiaddr query parameters:
$ curl "localhost:3333/check?cid=bafybeicklkqcnlvtiscr2hzkubjwnwjinvskffn4xorqeduft3wq7vm5u4&multiaddr=/p2p/12D3KooWRBy97UB99e3J6hiPesre1MZeuNQvfan4gBziswrRJsNK"Note that the multiaddr can be:
- A multiaddrwith just a Peer ID, i.e./p2p/PeerID. In this case, the server will attempt to resolve this Peer ID with the DHT and connect to any of resolved addresses.
- A multiaddrwith an address port and transport, and Peer ID, e.g./ip4/140.238.164.150/udp/4001/quic-v1/p2p/12D3KooWRTUNZVyVf7KBBNZ6MRR5SYGGjKzS6xyiU5zBeY9wxomo/p2p-circuit/p2p/12D3KooWRBy97UB99e3J6hiPesre1MZeuNQvfan4gBziswrRJsNK. In this case, the Bitswap check will only happen using the passed multiaddr.
The server performs several checks depending on whether you also pass a multiaddr or just a cid.
The results of the check are expressed by the cidCheckOutput type:
type cidCheckOutput *[]providerOutput
type providerOutput struct {
	ID                       string
	ConnectionError          string
	Addrs                    []string
	ConnectionMaddrs         []string
	DataAvailableOverBitswap BitswapCheckOutput
	DataAvailableOverHTTP    HTTPCheckOutput
	Source                   string
}The providerOutput type contains the following fields:
- ID: The peer ID of the provider.
- ConnectionError: An error message if the connection to the provider failed.
- Addrs: The multiaddrs of the provider from the DHT.
- ConnectionMaddrs: The multiaddrs that were used to connect to the provider.
- DataAvailableOverBitswap: The result of the Bitswap check.
- DataAvailableOverHTTP: The result of the HTTP check.
- Source: The source of the provider (either "IPNI" or "Amino DHT").
The results of the check are expressed by the peerCheckOutput type:
type peerCheckOutput struct {
	ConnectionError              string
	PeerFoundInDHT              map[string]int
	ProviderRecordFromPeerInDHT  bool
	ProviderRecordFromPeerInIPNI bool
	ConnectionMaddrs             []string
	DataAvailableOverBitswap     BitswapCheckOutput
	DataAvailableOverHTTP        HTTPCheckOutput
}
type BitswapCheckOutput struct {
	Enabled   bool
	Duration  time.Duration
	Found     bool
	Responded bool
	Error     string
}
type HTTPCheckOutput struct {
	Enabled   bool
	Duration  time.Duration
	Endpoints []multiaddr.Multiaddr
	Connected bool
	Requested bool
	Found     bool
	Error     string
}The check performs several validations:
- 
Is the CID advertised in the DHT by the Passed PeerID (or later IPNI)? - ProviderRecordFromPeerInDHT: Whether the peer has a provider record in the DHT
- ProviderRecordFromPeerInIPNI: Whether the peer has a provider record in IPNI
 
- 
Are the peer's addresses discoverable? - PeerFoundInDHT: Map of discovered addresses and their frequency in the DHT
 
- 
Is the peer contactable with the address the user gave us? - ConnectionError: Empty if connection successful, otherwise contains the error
- ConnectionMaddrs: The multiaddrs used to connect (includes both relay and direct addresses if NAT traversal occurred)
 
- 
Is the data available over Bitswap? - DataAvailableOverBitswap: Contains:- Enabled: Whether Bitswap check was performed
- Duration: How long the check took
- Found: Whether the block was found
- Responded: Whether the peer responded
- Error: Any error that occurred
 
 
- 
Is the data available over HTTP? - DataAvailableOverHTTP: Contains:- Enabled: Whether HTTP check was performed
- Duration: How long the check took
- Endpoints: List of HTTP multiaddrs
- Connected: Whether connection was successful
- Requested: Whether the request was sent
- Found: Whether the block was found
- Error: Any error that occurred
 
 
The ipfs-check server is instrumented and exposes two Prometheus metrics endpoints:
- /metricsexposes go-libp2p metrics and http metrics for the check endpoint.
To add HTTP basic auth to the two metrics endpoints, you can use the --metrics-auth-username and --metrics-auth-password flags:
./ipfs-check --metrics-auth-username=user --metrics-auth-password=pass
Alternatively, you can use the IPFS_CHECK_METRICS_AUTH_USER and IPFS_CHECK_METRICS_AUTH_PASS env vars.