分佈式存儲正火,來一步步學會搭建自己的 IPFS 網絡。

原文標題:《IPFS 搭建私有網絡與使用》
撰文:六天

在聯盟鏈的場景下,IPFS 作爲去中心化存儲的首選方案,本文將介紹如何使用 go-ipfs 搭建一個私有網絡並進行簡單使用。

我的環境

由於資源限制,我這裏使用 docker 來搭建一個兩個節點的 IPFS 私有網絡。如果有條件可以直接在多臺機器或者多個虛擬機上安裝。

開始搭建

1、生成 swarm.key

swarm.key 是一個共享密鑰,只有擁有相同密鑰的節點才能互相通信,組成一個私鑰網絡。swarm.key 可以使用 工具 生成,工具的安裝命令是:

    go get -u github.com/Kubuxu/go-ipfs-swarm-key-gen/ipfs-swarm-key-gen  

安裝完成後,生成 swarm.key,命令是:

    ipfs-swarm-key-gen > /Users/sixdays/tmp/ipfs/swarm.key  

其中

*/Users/sixdays/tmp/ipfs/ 目錄是我 ipfs 目錄。
*/Users/sixdays/tmp/ipfs/node1 是我 ipfs 節點 1 目錄。
*/Users/sixdays/tmp/ipfs/node2 是我 ipfs 節點 2 目錄。

2、啓動節點

運行節點 1 和節點 2

 // 運行節點 1
docker run -d --name ipfs_node_1 -e IPFS_SWARM_KEY_FILE=/Users/sixdays/tmp/ipfs/swarm.key -v /Users/sixdays/tmp/ipfs/node1/staging:/export -v /Users/sixdays/tmp/ipfs/node1/data:/data/ipfs -p 4001:4001 -p 4001:4001/udp -p 127.0.0.1:8080:8080 -p 127.0.0.1:5001:5001 ipfs/go-ipfs:latest

// 運行節點 2
docker run -d --name ipfs_node_2  -e IPFS_SWARM_KEY_FILE=/Users/sixdays/tmp/ipfs/swarm.key -v /Users/sixdays/tmp/ipfs/node2/staging:/export -v /Users/sixdays/tmp/ipfs/node2/data:/data/ipfs -p 4002:4001 -p 4002:4001/udp -p 127.0.0.1:8081:8080 -p 127.0.0.1:5002:5001 ipfs/go-ipfs:latest

清除所有缺省啓動節點 bootstrap

    docker exec ipfs_node_1 ipfs bootstrap rm all  
    docker exec ipfs_node_2 ipfs bootstrap rm all  

查看節點 id

    docker exec ipfs_node_1 ipfs id  
    docker exec ipfs_node_2 ipfs id  

這裏,我節點 1 的 Id 是 :
12D3KooWEVo8FqH8YUT1noXvca5 hgSRWBRcDQomEcFY2zXwA7dbw
節點 1 的 address 是:
/ip4/172.17.0.3/tcp/4001/p2p/12D3KooWEVo8FqH8YUT1noXvca5 hgSRWBRcDQomEcFY2zXwA7dbw

節點 2 的 Id 是
12D3KooWRcx6 gpbsbvb6YiNsDpJgnmNHFCgCiUmVF42o4zn2W5Pj
節點 2 的 address 是
/ip4/172.17.0.4/tcp/4001/p2p/12D3KooWRcx6 gpbsbvb6YiNsDpJgnmNHFCgCiUmVF42o4zn2W5Pj

節點的 address 我用的是 docker 給分配的 ip 地址。

添加節點 id

在節點 1 中添加節點 2 地址

docker exec ipfs_node_1 ipfs bootstrap add  /ip4/172.17.0.4/tcp/4001/p2p/12D3KooWRcx6 gpbsbvb6YiNsDpJgnmNHFCgCiUmVF42o4zn2W5Pj

在節點 2 中添加節點 1 地址

docker exec ipfs_node_1 ipfs bootstrap add  /ip4/172.17.0.3/tcp/4001/p2p/12D3KooWEVo8FqH8YUT1noXvca5 hgSRWBRcDQomEcFY2zXwA7dbw

至此,我們 2 個節點的 IPFS 私有網絡已搭建完成。

用一下

使用命令

    docker exec ipfs_node_1 ipfs -h  

可以看到 IPFS 的基礎命令。

添加文件 add

    $ docker exec ipfs_node_1 ipfs add /data/ipfs/swarm.key                                                                                                                    
    added QmRitSEMhFJtNhLYtwGRJvhDrTTT4 gQLjuLepZjo9C8a2X swarm.key  

其中 :

*/data/ipfs/swarm.key 爲 ipfs_node_1 容器的目錄。

*QmRitSEMhFJtNhLYtwGRJvhDrTTT4 gQLjuLepZjo9C8a2X 爲文件 hash

查看文件 cat

    $ docker exec ipfs_node_2 ipfs cat QmRitSEMhFJtNhLYtwGRJvhDrTTT4 gQLjuLepZjo9C8a2X   
    /key/swarm/psk/1.0.0/  
    /base16/  
    5b9941085678c502b44cc98e2614dd648cb801115dcb6acee8e83d9bf8cf454c  

可以看到我們可以在 node2 中查看到 node1 上傳的文件內容。

下載文件 get

    $ docker exec ipfs_node_2 ipfs get QmRitSEMhFJtNhLYtwGRJvhDrTTT4 gQLjuLepZjo9C8a2X -o /data/ipfs/test.key  
    Saving file(s) to /data/ipfs/test.key  
     95 B / 95 B  100.00% 0 s  

其中 -o 表示輸出目錄,docker 容器中的 /data/ipfs 對應我們主機目錄爲 /Users/sixdays/tmp/ipfs/node2/data

查看文件列表 ls

    $ docker exec ipfs_node_2 ipfs pin ls  
    QmQ5vhrL7uv6 tuoN9KeVBwd4PwfQkXdVVmDLUZuTNxqgvm indirect  
    QmU5k7 ter3RdjZXu3 sHghsga1UQtrztnQxmTL22nPnsu3 g indirect  
    QmYCvbfNbCwFR45HiNP45rwJgvatpiW38D961L5qAhUM5Y indirect  
    QmejvEPop4D7YUadeGqYWmZxHhLc4JBUCzJJHWMzdcMe2y indirect  
    QmPZ9 gcCEpqKTo6aq61 g2nXGUhM4iCL3ewB6LDXZCtioEB indirect  
    QmQGiYLVAdSHJQKYFRTJZMG4 BXBHqKperaZtyKGmCRLmsF indirect  
    QmQPeNsJPyVWPFDVHb77w8G42Fvo15z4bG2X8D2GhfbSXc recursive  
    QmQy6xmJhrcC5QLboAcGFcAE1 tC8CrwDVkrHdEYJkLscrQ indirect  
    QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67 hvA3Nn recursive  

其中 recursive 表示文件夾,indirect 表示文件

參考

*go-ipfs:https://github.com/ipfs/go-ipfs

*ipfs-swarm-key-gen:https://github.com/Kubuxu/go-ipfs-swarm-key-gen

*ipfs 文檔:https://www.jianshu.com/p/e38d5f733c81