本文是一个简单的IPFS私有网络搭建教程,根据本文你可以搭建起一个简单的IPFS网络demo,可以在不同的节点获取同样的文件。
其实我没必要写这个教程的,GitHub上的示例写得清清楚楚,但是在Google搜索相关资料的时候中文页面全部都是挖矿(恰饭)
相关,而实际应用的文章寥寥无几╮(╯_╰)╭ 。
环境:共计两个节点,分别为主节点
、子节点
。
系统均为Ubuntu server 16.04。
安装
下载IPFS程序:
wget https://1.i-book.in/ipfs/QmcB55KNpU1E8uvqFtFa9QTFWPTHnfSmC1N7Hg6c5qYYX9 -O go-ipfs_v0.4.22_linux-amd64.tar.gzCopy
解压缩:
tar xvfz go-ipfs_v0.4.22_linux-amd64.tar.gzCopy
安装:
cd go-ipfs/ sudo ./install.shCopy
需要指定IPFS的存储位置,如果不需要就跳过,直接初始化。
export IPFS_PATH="绝对路径"Copy
初始化:
ipfs initCopy
如果输出以下代码就是初始化成功了:
generating 2048-bit RSA keypair...done peer identity: QmTvSJEh3xarHMUj6uamQwnnvbYXH4vjttAehKjBvixxJHto get started, enter: ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readmeCopy
该步骤需要在所有节点
上重复操作。
生成共享key
安装golang-go:
sudo apt-get install golang-goCopy
编译工具:
go get github.com/Kubuxu/go-ipfs-swarm-key-gencd $GOPATHcd go/src/github.com/Kubuxu/go-ipfs-swarm-key-gen/ipfs-swarm-key-gen/go buildCopy
生成key:
./ipfs-swarm-key-gen > ~/.ipfs/swarm.keyCopy
该步骤仅在主节点
操作。
将生成的swarm.key文件传输到所有需要加入私有网络的子节点
~/.ipfs/
文件夹内。
配置IPFS
移除默认的IPFS节点:
ipfs bootstrap rm allCopy
查看节点ID:
ipfs idCopy
系统会输出以下内容,记住ID部分:
{ "ID": "QmTvTNFh3xarHMUj6uamQwnnvbZYE1vjttAeCjgBvixxJH", "PublicKey": "CAASpgIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDEPn7J/DSijRAT/QD8rTVjF8nCgEnv0jTQYWeDbC9dEVmTM8WUoh2vK0s3qSvpfxNAHkvgcp5kJwVbm0kZEwcbUVzcrXKfdTgEcSJ0CDptaWQEH40wIUOkhwyhIZAMeZL0Q0S9k8Rt0iVk3ILpapcW9hKu1/7Ms5lntdpVmrxOhM1LZZ7lUjXkORyN+qu/uNMi0/KeH2I37cwv9PWbxYuak7o1mlI+sIChD32uO8DlL3zX1VoWHmftMCuysOCGhosrO64pMAGY9jUqf85X9cFaetg1yukV8yslSsRY/8phqNNAlhCf2TdbDRAZbHp8jQjrU3THwOALN+6kU04WuhfNAgMBAAE=", "Addresses": null, "AgentVersion": "go-ipfs/0.4.22/", "ProtocolVersion": "ipfs/0.1.0"}Copy
在主节点
服务器上添加子节点
:
ipfs bootstrap add /ip4/Your-Node-IP/tcp/4001/ipfs/QmTvTNFh3xarHMUj6uamQwnnvbZYE1vjttAeCjgBvixxJHCopy
在子节点
服务器上添加主节点
:
ipfs bootstrap add /ip4/Your-Node-IP/tcp/4001/ipfs/QmYNYDp5PEi64dgTYRdci3XhtmQEnZVBQTATinWw6fq3AcCopy
测试IFPS网络
所有的节点都添加完毕后使用命令ipfs daemon
启动IPFS,显示如下输出说明启动成功,配置文件没有问题:
Initializing daemon...go-ipfs version: 0.4.22-Repo version: 7System version: amd64/linuxGolang version: go1.12.7Swarm is limited to private network of peers with the swarm keySwarm key fingerprint: 6ac2fea09ce0c68a2630b1f51f614dfbSwarm listening on /ip4/Your-Node-IP/tcp/4001Swarm listening on /ip4/127.0.0.1/tcp/4001Swarm listening on /ip4/172.17.0.1/tcp/4001Swarm listening on /p2p-circuitSwarm announcing /ip4/Your-Node-IP/tcp/4001Swarm announcing /ip4/127.0.0.1/tcp/4001Swarm announcing /ip4/172.17.0.1/tcp/4001API server listening on /ip4/127.0.0.1/tcp/5001WebUI: http://127.0.0.1:5001/webuiGateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080Daemon is readyCopy
网络已经启动了,现在测试网络的连通性,使用ipfs stats bitswap
命令查看IPFS现在连接了多少节点:
bitswap status provides buffer: 0 / 256 blocks received: 0 blocks sent: 1 data received: 0 data sent: 23 dup blocks received: 0 dup data received: 0 wantlist [0 keys] partners [1]Copy
其中partners
就是连接到的节点数量,因为我们现在只有两个节点,所以partners
是1
。
测试文本传输
在主节点新建一个文本文件:
echo "hello saltyleo" >> test.txtCopy
将其添加到ipfs网络:
ipfs add test.txtCopy
输出以下字符就说明文件已经上传上去了:
added QmPxEMHme51cx6DNDeqisT78xp1zdVHfH4utPUyfZWNAwk test.txt15 B / 15 B [=========================================================]100.00%Copy
查看文件:
ipfs cat QmPxEMHme51cx6DNDeqisT78xp1zdVHfH4utPUyfZWNAwkCopy
在子节点重复上面的操作,输出都是hello saltyleo
说明私有网络已经联通。
后记
网关部分我就不写了,反正GitHub上都有示例,只要iptables、nginx、域名都设置好就行了。IPFS的访问速度问题,我猜测是GFW对这类P2P流量进行了清洗,导致国内节点可用性并不高,所以文件传输速度慢。这个是天朝上国的特色,没有任何办法能解决。(肉身翻墙走起)
ipfs add的时候,文件小于1KB的简直是光速传播,大于1KB就会比较慢,这是因为小于1KB的会直接在DHT网络内广播,广播到达的时候文本就已经到达了,大于1KB的需要先接收广播
>找节点
>找文件
>传输
,所以会比较慢。
关于这个协议还是有不少不足的,比如节点复制,没有一个简单的命令,而是需要繁琐配置才可以实现。还有当成为公网节点的时候流量会使用的非常快,平均一天十几个GB,还好我的节点是按宽带计费的,要不然流量费可烧不起。还有这个文件播种的速度实在是太过于感人,太慢了!!!