kubo/misc
Marcin Rataj 787b29b884 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
2025-12-16 20:49:44 +01:00
..
fsutil chore: stop using go-homedir (#10568) 2024-11-05 07:45:11 -08:00
launchd repo: don't create logs directory, not used any longer 2016-04-15 13:50:46 -07:00
systemd fix: align systemd unit file with default IPFS installation path (#10163) 2023-10-05 07:29:10 +00:00
README.md docs: add p2p-tunnels.md with systemd examples 2025-12-16 20:49:44 +01:00

init system integration

go-ipfs can be started by your operating system's native init system.

systemd

For systemd, the best approach is to run the daemon in a user session. Here is a sample service file:

[Unit]
Description=IPFS daemon

[Service]
# Environment="IPFS_PATH=/data/ipfs"  # optional path to ipfs init directory if not default ($HOME/.ipfs)
ExecStart=/usr/local/bin/ipfs daemon
Restart=on-failure

[Install]
WantedBy=default.target

To run this in your user session, save it as ~/.config/systemd/user/ipfs.service (creating directories as necessary). Once you run ipfs init to create your IPFS settings, you can control the daemon using the following commands:

  • systemctl --user start ipfs - start the daemon
  • systemctl --user stop ipfs - stop the daemon
  • systemctl --user status ipfs - get status of the daemon
  • systemctl --user enable ipfs - enable starting the daemon at boot
  • systemctl --user disable ipfs - disable starting the daemon at boot

Note: If you want this --user service to run at system boot, you must enable-linger on the account that runs the service:

# loginctl enable-linger [user]

Read more about --user services here: wiki.archlinux.org:Systemd

P2P tunnel services

For running ipfs p2p listen or ipfs p2p forward as systemd services, see docs/p2p-tunnels.md for examples using the --foreground flag and path-based activation.

initd

upstart

  • And below is a very basic sample upstart job. Note the username jbenet.
cat /etc/init/ipfs.conf
description "ipfs: interplanetary filesystem"

start on (local-filesystems and net-device-up IFACE!=lo)
stop on runlevel [!2345]

limit nofile 524288 1048576
limit nproc 524288 1048576
setuid jbenet
chdir /home/jbenet
respawn
exec ipfs daemon

Another version is available here:

ipfs cat /ipfs/QmbYCwVeA23vz6mzAiVQhJNa2JSiRH4ebef1v2e5EkDEZS/ipfs.conf >/etc/init/ipfs.conf

For both, edit to replace occurrences of jbenet with whatever user you want it to run as:

sed -i s/jbenet/<chosen-username>/ /etc/init/ipfs.conf

Once you run ipfs init to create your IPFS settings, you can control the daemon using the init.d commands:

sudo service ipfs start
sudo service ipfs stop
sudo service ipfs restart
...

launchd

Similar to systemd, on macOS you can run go-ipfs via a user LaunchAgent.

  • Create ~/Library/LaunchAgents/io.ipfs.go-ipfs.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>KeepAlive</key>
        <true/>
        <key>Label</key>
        <string>io.ipfs.go-ipfs</string>
        <key>ProcessType</key>
        <string>Background</string>
        <key>ProgramArguments</key>
        <array>
                <string>/bin/sh</string>
                <string>-c</string>
                <string>~/go/bin/ipfs daemon</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
</dict>
</plist>

The reason for running ipfs under a shell is to avoid needing to hard-code the user's home directory in the job.

  • To start the job, run launchctl load ~/Library/LaunchAgents/io.ipfs.go-ipfs.plist

Notes:

  • To check that the job is running, run launchctl list | grep ipfs.
  • IPFS should now start whenever you log in (and exit when you log out).
  • LaunchControl is a GUI tool which simplifies management of LaunchAgents.