kubo/core/commands
Marcin Rataj 25ebab9dae
feat(p2p): add --foreground flag to listen and forward commands (#11099)
* feat(p2p): add --foreground flag to listen and forward commands

adds `-f/--foreground` option that keeps the command running until
interrupted (SIGTERM/Ctrl+C) or closed via `ipfs p2p close`. the
listener/forwarder is automatically removed when the command exits.

useful for systemd services and scripts that need cleanup on exit.

* docs: add p2p-tunnels.md with systemd examples

- add dedicated docs/p2p-tunnels.md covering:
  - why p2p tunnels (NAT traversal, no public IP needed)
  - quick start with netcat
  - background and foreground modes
  - systemd integration with path-based activation
  - security considerations and troubleshooting
- document Experimental.Libp2pStreamMounting in docs/config.md
- simplify docs/experimental-features.md, link to new doc
- add "Learn more" links to ipfs p2p listen/forward --help
- update changelog entry with doc link
- add cross-reference in misc/README.md

* chore: reference kubo#5460 for p2p config

Ref. https://github.com/ipfs/kubo/issues/5460

* fix(daemon): write api/gateway files only after HTTP server is ready

fixes race condition where $IPFS_PATH/api and $IPFS_PATH/gateway files
were written before the HTTP servers were ready to accept connections.
this caused issues for tools like systemd path units that immediately
try to connect when these files appear.

changes:
- add corehttp.ServeWithReady() that signals when server is ready
- wait for ready signal before writing address files
- use sync.WaitGroup.Go() (Go 1.25) for cleaner goroutine management
- add TestAddressFileReady to verify both api and gateway files

* fix(daemon): buffer errc channel and wait for all listeners

- buffer error channel with len(listeners) to prevent deadlock when
  multiple servers write errors simultaneously
- wait for ALL listeners to be ready before writing api/gateway file,
  not just the first one

Feedback-from: https://github.com/ipfs/kubo/pull/11099#pullrequestreview-3593885839

* docs(changelog): improve p2p tunnel section clarity

reframe to lead with user benefit and add example output

* docs(p2p): remove obsolete race condition caveat

the "First launch fails but restarts work" troubleshooting section
described a race where the api file was written before the daemon was
ready. this was fixed in 80b703a which ensures api/gateway files are
only written after HTTP servers are ready to accept connections.

---------

Co-authored-by: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
2026-01-09 19:22:43 +01:00
..
cmdenv feat: fast provide support in dag import (#11058) 2025-11-14 21:06:25 -08:00
cmdutils test(cmdutils): add tests for PathOrCidPath and ValidatePinName (#11062) 2025-11-17 18:00:19 +01:00
dag feat(cli): improve ipfs dag stat output UX (#11097) 2026-01-09 18:41:10 +01:00
e Fix typo in an error.go comment: "is adds" -> "adds". 2018-01-17 15:25:54 -08:00
keyencode chore: bump go-libp2p v0.22.0 & go1.18&go1.19 2022-09-09 17:09:38 +02:00
name feat(config): AutoConf with "auto" placeholders (#10883) 2025-08-20 05:59:11 +02:00
object core/commands!: remove deprecated object APIs (#10375) 2024-03-22 09:32:30 +01:00
pin Add bytes progress tracker for ipfs pin add (#11074) 2025-12-02 17:11:22 -08:00
active.go refactor: use slices.Sort where appropriate (#10858) 2025-07-08 18:43:23 +02:00
add.go feat: fast provide support in dag import (#11058) 2025-11-14 21:06:25 -08:00
bitswap.go fix(rpc): restore and reprecate bitswap reprovide (#10699) 2025-02-10 16:12:53 +01:00
block.go config: introduce Import section (#10421) 2024-05-14 14:17:04 +00:00
bootstrap.go feat(config): AutoConf with "auto" placeholders (#10883) 2025-08-20 05:59:11 +02:00
cat.go chore: use errors.New to replace fmt.Errorf with no parameters (#10617) 2024-12-10 13:50:35 -08:00
cid_test.go Nonfunctional (#10753) 2025-03-11 14:04:16 -07:00
cid.go feat(ci): reusable spellcheck from unified CI (#10873) 2025-08-14 00:35:35 +00:00
commands_test.go feat(config): AutoConf with "auto" placeholders (#10883) 2025-08-20 05:59:11 +02:00
commands.go fix(cmd): exit 1 on error (#10903) 2025-08-08 17:25:05 -07:00
completion.go refactor: use slices.Sort where appropriate (#10858) 2025-07-08 18:43:23 +02:00
config_test.go test: TestEditorParsing 2025-07-08 18:43:47 +02:00
config.go feat(config): AutoConf with "auto" placeholders (#10883) 2025-08-20 05:59:11 +02:00
dht_test.go refactor: namesys cleanup, gateway /ipns/ ttl (#10115) 2023-10-18 10:23:50 +02:00
dht.go feat(cli/rpc/add): fast provide of root CID (#11046) 2025-11-14 11:08:29 -08:00
diag.go feat: add an "ipfs diag profile" command 2021-07-21 14:51:47 -07:00
external.go style: gofumpt and godot [skip changelog] (#10081) 2023-08-17 14:02:08 +02:00
extra.go refactor: get rid of cmdDetails awkwardness 2020-08-04 18:28:40 -04:00
files_test.go refactor: replace context.WithCancel with t.Context (#11083) 2025-11-28 16:39:55 +01:00
files.go fix(mfs): add soft limit for --flush=false (#10985) 2025-09-26 01:25:23 +02:00
filestore.go Ivan386/filestore fix (#7474) 2025-06-04 14:04:20 -07:00
get_test.go refactor: replace context.WithCancel with t.Context (#11083) 2025-11-28 16:39:55 +01:00
get.go feat: Support storing UnixFS 1.5 Mode and ModTime (#10478) 2024-08-21 02:02:46 +02:00
helptext_test.go gx: unrewrite 2019-03-05 18:33:56 +01:00
id.go fix(cmds): cleanup unicode identify strings (#9465) 2025-09-19 04:46:38 +02:00
keystore.go keys: skip bad keys when listing (#11115) 2026-01-07 09:56:11 -08:00
log.go feat: add query functionality to log level command (#10885) 2025-08-11 12:43:48 -07:00
ls.go refactor: use slices.Sort where appropriate (#10858) 2025-07-08 18:43:23 +02:00
mount_nofuse.go refactor(ci): optimize build workflows (#10973) 2025-09-19 14:44:38 +02:00
mount_unix.go refactor(ci): optimize build workflows (#10973) 2025-09-19 14:44:38 +02:00
mount_windows.go cmdkit -> cmds 2019-05-10 23:00:20 -07:00
multibase.go ci: add stylecheck to golangci-lint (#9334) 2022-10-06 10:18:40 -04:00
p2p.go feat(p2p): add --foreground flag to listen and forward commands (#11099) 2026-01-09 19:22:43 +01:00
ping.go refactor: stop using go-libp2p deprecated peer.ID.Pretty 2023-09-18 15:58:15 +02:00
profile.go profile: add trace 2024-01-12 14:55:55 +01:00
provide.go feat(cli/rpc/add): fast provide of root CID (#11046) 2025-11-14 11:08:29 -08:00
pubsub.go refactor: use slices.Sort where appropriate (#10858) 2025-07-08 18:43:23 +02:00
refs.go chore: upgrade to go 1.23 (#10486) 2024-08-28 18:56:45 +02:00
repo_verify_test.go test: verifyWorkerRun and helptext (#11063) 2025-11-17 18:51:33 +01:00
repo.go test: verifyWorkerRun and helptext (#11063) 2025-11-17 18:51:33 +01:00
resolve.go docs(cli): fix spelling 2023-12-04 09:40:21 +01:00
root_test.go core/corehttp!: remove /api/v0 from gateway port 2024-03-05 08:21:13 +00:00
root.go provider: clear provide queue when reprovide strategy changes (#10863) 2025-07-16 01:28:27 -07:00
routing.go feat(cli/rpc/add): fast provide of root CID (#11046) 2025-11-14 11:08:29 -08:00
shutdown.go refactor: rename to kubo 2022-07-06 18:40:37 +02:00
stat_dht.go feat(cli/rpc/add): fast provide of root CID (#11046) 2025-11-14 11:08:29 -08:00
stat_provide.go refactor: move ipfs stat provide/reprovide to ipfs provide stat (#10896) 2025-08-07 17:17:00 -07:00
stat_reprovide.go feat(ci): reusable spellcheck from unified CI (#10873) 2025-08-14 00:35:35 +00:00
stat.go feat: Provider.WorkerCount and stats reprovide (#10779) 2025-04-30 15:32:03 +02:00
swarm.go fix(cmds): cleanup unicode identify strings (#9465) 2025-09-19 04:46:38 +02:00
sysdiag.go repo: use config api to get node root path (#10934) 2025-09-02 13:13:01 -07:00
version.go feat(cli/rpc/add): fast provide of root CID (#11046) 2025-11-14 11:08:29 -08:00