Jay Taylor's notes

back to listing index


[web search]
Original source (github.com)
Tags: ipfs interplanetary-file-system github.com
Clipped on: 2016-06-14

Skip to content
IPFS implementation in go https://github.com/ipfs/ipfs
Go Shell Other
Godeps Remove go-os-rename 3 days ago
assets dir-index-html unescaping 3 months ago
bin Makefile, bin: Support multiple GOPATH components 9 days ago
blocks Move golang-lru to gx 3 days ago
blockservice Import go-datastore to gx 3 days ago
cmd Move metrics to gx 3 days ago
commands Update go-log 5 days ago
core Import go-datastore to gx 3 days ago
diagnostics pull in libp2p updates with utp fixes 3 days ago
docs Moved docs to docs 11 days ago
exchange Import go-datastore to gx 3 days ago
flags introduce low memory flag 3 months ago
fuse Update go-log 5 days ago
importer Update go-log 5 days ago
merkledag Import go-datastore to gx 3 days ago
mfs Import go-datastore to gx 3 days ago
misc repo: don't create logs directory, not used any longer 2 months ago
namesys Move golang-lru to gx 3 days ago
notifications pull in libp2p updates with utp fixes 3 days ago
path Update go-log 5 days ago
pin Import go-datastore to gx 3 days ago
repo Import go-datastore to gx 3 days ago
routing Merge pull request #2838 from ipfs/feature/datastore-to-gx 2 days ago
tar Update go-log 5 days ago
test Import go-datastore to gx 3 days ago
thirdparty Import go-datastore to gx 3 days ago
tour Update go-log 5 days ago
unixfs Import go-datastore to gx 3 days ago
.artifact_files .artifact_files for gobuilder a year ago
.dockerignore docker: simplify git ref resolution, thanks @chriscool 22 days ago
.gitignore Add bin to gitignore a month ago
.gobuilder.yml update gobuilder.yml to not break gobuilder 8 months ago
.travis.yml fix travis.yml a month ago
CHANGELOG.md Add changelog for v0.4.2 28 days ago
Dockerfile docker: make dockerfile differences more obvious 12 days ago
Dockerfile.fast docker: make dockerfile differences more obvious 12 days ago
LICENSE added MIT license 2 years ago
Makefile Makefile, bin: Support multiple GOPATH components 9 days ago
README.md Added readme image 7 days ago
appveyor.yml appveyor: remove 'make toolkit_upgrade' a month ago
circle.yml don't cache the code we're actually changing a month ago
contribute.md Added section about tests to run locally a month ago
dev.md Capitalized DHT 4 months ago
doc.go doc: Add some docs explaining the sub-package layout a year ago
package.json Move golang-lru to gx 3 days ago
roadmap.md Capitalized `NOTE`, first letter of following word 2 months ago


Image (Asset 3/5) alt=

IPFS implementation in Go

Image (Asset 4/5) alt= Image (Asset 5/5) alt=

IPFS is a global, versioned, peer-to-peer filesystem. It combines good ideas from Git, BitTorrent, Kademlia, SFS, and the Web. It is like a single bittorrent swarm, exchanging git objects. IPFS provides an interface as simple as the HTTP web, but with permanence built in. You can also mount the world at /ipfs.

For more info see: https://github.com/ipfs/ipfs.

Please put all issues regarding IPFS design in the ipfs repo issues. Please put all issues regarding Go IPFS implementation in this repo.

Table of Contents

Security Issues

The IPFS protocol and its implementations are still in heavy development. This means that there may be problems in our protocols, or there may be mistakes in our implementations. And -- though IPFS is not production-ready yet -- many people are already running nodes in their machines. So we take security vulnerabilities very seriously. If you discover a security issue, please bring it to our attention right away!

If you find a vulnerability that may affect live deployments -- for example, by exposing a remote execution exploit -- please send your report privately to security@ipfs.io. Please DO NOT file a public issue.

If the issue is a protocol weakness that cannot be immediately exploited or something not yet deployed, just discuss it openly.


The canonical download instructions for IPFS are over at: http://ipfs.io/docs/install/. It is highly suggested you follow those instructions if you are not interested in working on IPFS development.

Install prebuilt packages

We host prebuilt binaries over at our distributions page.

From there:

  • Click the blue "Download go-ipfs" on the right side of the page.
  • Open/extract the archive.
  • Move  ipfs  to your path ( install.sh  can do it for you).

Build from Source

Install Go

The build process for ipfs requires Go 1.5+, but we strongly recommend using 1.6.2. If you don't have it: Download Go 1.6.2+.

You'll need to add Go's bin directories to your  $PATH  environment variable e.g., by adding these lines to your  /etc/profile  (for a system-wide installation) or  $HOME/.profile :

normalexport PATH=$PATH:/usr/local/go/bin
export PATH=$PATH:$GOPATH/bin

(If you run into trouble, see the Go install instructions).

Download + Compile IPFS

go-ipfs differs from the vanilla  go get  flow: it uses gx/gx-go for dependency management.

First download  go-ipfs  without installing:

normal$ go get -d github.com/ipfs/go-ipfs

$ cd $GOPATH/src/github.com/ipfs/go-ipfs

Then install  go-ipfs  and its dependencies, including  gx  and  gx-go :

normal$ make install


  • Separate instructions are available for building on Windows.
  •  git  is required in order for  go get  to fetch all dependencies.
  • Package managers often contain out-of-date  golang  packages. Ensure that  go version  reports at least 1.5.2. See above for how to install go.
  • If you are interested in development, please install the development dependencies as well.
  • WARNING: Older versions of OSX FUSE (for Mac OS X) can cause kernel panics when mounting! We strongly recommend you use the latest version of OSX FUSE. (See https://github.com/ipfs/go-ipfs/issues/177)
  • For more details on setting up FUSE (so that you can mount the filesystem), see the docs folder.
  • Shell command completion is available in  misc/completion/ipfs-completion.bash . Read docs/command-completion.md to learn how to install it.
  • See the init examples for how to connect IPFS to systemd or whatever init system your distro uses.

Development Dependencies

If you make changes to the protocol buffers, you will need to install the protoc compiler.


IPFS has an updating tool that can be accessed through  ipfs update . The tool is not installed alongside IPFS in order to keep that logic independent of the main codebase. To install  ipfs update , either download it here or install it from source with  go get -u github.com/ipfs/ipfs-update .


normal  ipfs - Global p2p merkle-dag filesystem.

  ipfs [<flags>] <command> [<arg>] ...

    init          Initialize ipfs local configuration
    add <path>    Add a file to ipfs
    cat <ref>     Show ipfs object data
    get <ref>     Download ipfs objects
    ls <ref>      List links from an object
    refs <ref>    List hashes of links from an object

    block         Interact with raw blocks in the datastore
    object        Interact with raw dag nodes
    files         Interact with objects as if they were a unix filesystem

    daemon        Start a long-running daemon process
    mount         Mount an ipfs read-only mountpoint
    resolve       Resolve any type of name
    name          Publish or resolve IPNS names
    dns           Resolve DNS links
    pin           Pin objects to local storage
    repo          Manipulate an IPFS repository

    id            Show info about ipfs peers
    bootstrap     Add or remove bootstrap peers
    swarm         Manage connections to the p2p network
    dht           Query the DHT for values or peers
    ping          Measure the latency of a connection
    diag          Print diagnostics

    config        Manage configuration
    version       Show ipfs version information
    update        Download and apply go-ipfs updates
    commands      List all available commands

  Use 'ipfs <command> --help' to learn more about each command.

  ipfs uses a repository in the local file system. By default, the repo is located
  at ~/.ipfs. To change the repo location, set the $IPFS_PATH environment variable:

    export IPFS_PATH=/path/to/ipfsrepo

Getting Started

See also: http://ipfs.io/docs/getting-started/

To start using IPFS, you must first initialize IPFS's config files on your system, this is done with  ipfs init . See  ipfs init --help  for information on the optional arguments it takes. After initialization is complete, you can use  ipfs mount ,  ipfs add  and any of the other commands to explore!

Some things to try

Basic proof of 'ipfs working' locally:

normalecho "hello world" > hello
ipfs add hello
# This should output a hash string that looks something like:
# QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o
ipfs cat <that hash>

Docker usage

An IPFS docker image is hosted at hub.docker.com/r/ipfs/go-ipfs. To make files visible inside the container you need to mount a host directory with the  -v  option to docker. Choose a directory that you want to use to import/export files from IPFS. You should also choose a directory to store IPFS files that will persist when you restart the container.

normalexport ipfs_staging=</absolute/path/to/somewhere/>
export ipfs_data=</absolute/path/to/somewhere_else/>

Make sure docker can access these folders:

normalsudo chmod -R 777 /absolute/path/to/somewhere/
sudo chmod -R 777 /absolute/path/to/somewhere_else/

Start a container running ipfs and expose ports 4001, 5001 and 8080:

normaldocker run -d --name ipfs_host -v $ipfs_staging:/export -v $ipfs_data:/data/ipfs -p 8080:8080 -p 4001:4001 -p 5001:5001 ipfs/go-ipfs:latest

Watch the ipfs log:

normaldocker logs -f ipfs_host

Wait for ipfs to start. ipfs is running when you see:

normalGateway (readonly) server
listening on /ip4/

You can now stop watching the log.

Run ipfs commands:

normaldocker exec ipfs_host ipfs <args...>

For example: connect to peers

normaldocker exec ipfs_host ipfs swarm peers

Add files:

normalcp -r <something> $ipfs_staging
docker exec ipfs_host ipfs add -r /export/<something>

Stop the running container:

normaldocker stop ipfs_host

Docker usage with VirtualBox/boot2docker (OSX and Windows)

Since docker is running in the boot2docker VM, you need to forward relevant ports from the VM to your host for IPFS to act normally. This is accomplished with the following command:

normalboot2docker ssh -L 5001:localhost:5001 -L 4001:localhost:4001 -L 8080:localhost:8080 -fN


If you have previously installed IPFS before and you are running into problems getting a newer version to work, try deleting (or backing up somewhere else) your IPFS config directory (~/.ipfs by default) and rerunning  ipfs init . This will reinitialize the config file to its defaults and clear out the local datastore of any bad entries.

For any other problems, check the issues list and if you dont see your problem there, either come talk to us on irc (freenode #ipfs) or file an issue of your own!


Please see Contribute.md!


An IPFS alpha version has been released in February 2015. Things left to be done are all marked as issues.