工作中需要搭建一个私有的IPFS网络,步骤比较简单,但还是要总结一下,希望能对其他人有点帮助。整个流程大概分4步:
- 搭建一个公网IPFS节点
- 搭建私有IPFS节点
- 添加新的节点到私有IPFS网络
- 测试IPFS网络
要运行自动化脚本一键部署IPFS的话,请参照下一篇博客:https://blog.csdn.net/weixin_41459401/article/details/84582125
1. 搭建一个IPFS节点
搭建IPFS最方便快捷的方式之一是使用docker,可以拉取go版本的ipfs镜像来启动IPFS节点。
1.1 启动IPFS单节点
打开terminal,执行下列命令,一个IPFS节点就跑起来了。
【运行命令】
# 拉取go-ipfs镜像
docker pull ipfs/go-ipfs:latest
# 配置staging和data的volume映射文件
ipfs_staging=/tmp/ipfs_staging
mkdir -p $ipfs_staging
ipfs_data=/tmp/ipfs_data
mkdir -p $ipfs_data
# 启动ipfs节点
docker run -d --name ipfs_host \
-v $ipfs_staging:/export \
-v $ipfs_data:/data/ipfs \
-p 4001:4001 \
-p 127.0.0.1:8080:8080 \
-p 127.0.0.1:5001:5001 \
ipfs/go-ipfs:latest
【查看结果】方法1: 查看log文件
在terminal中敲命令行
# 查看ipfs运行的log内容
docker logs -f ipfs_host
如果log打印出下面的内容就说明IPFS起来了。
...
Gateway (readonly) server listening on /ip4/0.0.0.0/tcp/8080
Daemon is ready
【查看结果】方法2: 在浏览器中查看ipfs
在浏览器地址栏输入这个地址 http://localhost:5001/webui ,会自动跳转到ipfs的explorer的web ui界面。
1.2 查看已连接的其他IPFS节点
开一个新terminal窗口或者Ctrl + C退出docker log进程,执行这个命令查看一下刚才搭建的节点有没有connect到其他节点。
【运行命令】
# 在ipfs_host容器中运行‘ipfs swarm peers’命令,查看已连接的其他ipfs节点
docker exec ipfs_host ipfs swarm peers
【查看结果】
如果你的电脑是联网了的,一般都会看到一个长长的列表,里面列出了你的节点连接了的其他IPFS节点。
/ip4/101.164.57.166/tcp/24125/ipfs/QmY9JiYESBDCU2s1SQyMCadpYYA2nmiZ4rFHwVuiTFk4Vn
/ip4/101.251.230.213/tcp/4001/ipfs/QmZEvpGZfGqNFtAVGgF2ntJnsLiWhzB2C9Kiccr5Wzb2hk
/ip4/101.251.230.214/tcp/4001/ipfs/QmPj31HZujPhhkjM4nFm4sxB3tRLsAwUtVoi6FoLbazijo
/ip4/103.205.97.78/tcp/4001/ipfs/QmXPbFGQDLeatcWEJr6f3XEoiLcX6uoZqujYk44GM6t629
…
如果发现列表是空的,则需要检查:1)网络连接情况;2)端口映射。
如果你是要创建一个节点加入全球的IPFS网络,那么IPFS节点的搭建工作就完成了,可以直接去测试上传和下载文件了;如果你是要搭建私有的IPFS网络,还要再做下面的步骤。
2. 搭建单节点的私有IPFS网络
前面是启动了一个IPFS节点加入了公有IPFS网络,如果你想搭建自己私有的IPFS网络,需要为自己的节点设置swarm key密钥。
2.1 生成私有网络swarm key
要生成私有网络的话,必须使用ipfs-swarm-key-gen创建私有网络的swarm key。私有网络的所有的节点都要使用这个key,否则无法加入这个私有网络。
# 关闭前面启动的ipfa节点
docker stop ipfs_host
docker rm -f ipfs_host
# 配置staging和data的volume映射文件
ipfs_staging=/tmp/ipfs_staging
mkdir -p $ipfs_staging
ipfs_data=/tmp/ipfs_data
mkdir -p $ipfs_data
# 拉取ipfs swarm key工具
go get github.com/Kubuxu/go-ipfs-swarm-key-gen/ipfs-swarm-key-gen
# 生成swarm key
$GOPATH/bin/ipfs-swarm-key-gen > $ipfs_data/swarm.key
# 启动ipfs节点
docker run -d --name ipfs_host \
-v $ipfs_staging:/export \
-v $ipfs_data:/data/ipfs \
-p 4001:4001 \
-p 127.0.0.1:8080:8080 \
-p 127.0.0.1:5001:5001 \
ipfs/go-ipfs:latest
2.2 移除默认的bootstrap节点
默认配置的节点都是加入全球IPFS网络的,需要删除所有bootstrap节点信息。
【运行命令】
docker exec ipfs_host ipfs bootstrap rm --all
【检查结果】
查看swarm peers,如果打印出的列表为空就对了。
# 在ipfs_host容器中运行‘ipfs swarm peers’命令,查看已连接的其他ipfs节点
docker exec ipfs_host ipfs swarm peers
3. 为私有IPFS网络添加节点
搭建的IPFS如果只有一个节点,可以用作调试环境,但要用于生产环境的话就没有意义了。生产环境最好还是搭建多节点的IPFS网络。
在第2步中,第一个私有节点启动后,可以再添加若干个新的节点,这样一个多节点的IPFS私有网络就搭好了。添加新节点时要注意:1)在添加新节点的之前,要把前面生成的swarm key复制到ipfs_data目录下;2)在新节点启动后,要指定bootstrap信息。
启动第二个IPFS节点(同一台物理机)
在测试环境和生产环境,建议在不同物理机上创建IPFS多节点。在本地调试环境,可以在一台物理机上创建多个IPFS节点。在创建新节点的时候要注意:1)不同节点映射的volume不要重合;2)容器名不要重合;3)对外端口不要重合;4)要记得把前面生产的swarm key复制到新创建的节点的ipfs_data文件夹下。例如:
new_peer_suffix=_1
ipfs_staging=/tmp/ipfs_staging$new_peer_suffix
mkdir -p $ipfs_staging
ipfs_data=/tmp/ipfs_data$new_peer_suffix
mkdir -p $ipfs_data
cp /tmp/ipfs_data/swarm.key $ipfs_data/swarm.key
# 启动ipfs节点
docker run -d --name ipfs_host$new_peer_suffix \
-v $ipfs_staging:/export \
-v $ipfs_data:/data/ipfs \
-p 4101:4001 \
-p 127.0.0.1:8180:8080 \
-p 127.0.0.1:5101:5001 \
ipfs/go-ipfs:latest
在一台物理机上可以启动多个IPFS节点(我自己在macbook pro上创建了3个peer,经测试两两彼此都是联通的),只要注意前面4个注意事项就好了。
指定bootstrap信息(Optional)
ipfs bootstrap add /ip4/x.x.x.x/tcp/4001/ipfs/QmbvgDGNmKRoTiB16g1qn82pTupQdPznZPwVo9zvrCPEJv
4. 测试IPFS节点(上传/下载文件)
测试IPFS节点比较简单
上传文件
【运行命令】
# 登陆到ipfs_host container
docker exec -it ipfs_host /bin/sh
# 上传文件
# 注:测试的时候不建议上传特别大的文件,尤其如果你是连了全球网络的话,也不要上传私密文件.
# 下面的所有命令行都是跑在ipfs_host container里面的
# 创建hello world测试文件
echo "hello world" > hello.txt
ipfs add hello.txt
【查看结果】方法1: 查看上传进度
上传文件的add命令会打印出上传的进度,如果看到100.00%就是上传完毕了。
/ # ipfs add /data/ipfs/version
added QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o hello.txt
12 B / 12 B [===================================================================================================================================] 100.00%
【查看结果】方法2: ipfs cat命令查看文件内容
docker exec ipfs_host ipfs cat /ipfs/QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o
一切正常的话应该能看到hello.txt的文件内容:
/ # ipfs cat QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o
hello world
【查看结果】方法3: 浏览器查看
前面启动ipfs节点的时候把ipfs_host容器的8080端口映射到了物理机,可以通过该端口直接在浏览器中查看刚刚上传的文件内容,直接在浏览器中敲地址http://localhost:8080/ipfs/------IPFS_URL------就可以查看文件了。
例如,刚刚上传的文件hash是QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o,直接在浏览器地址窗口输入
http://localhost:8080/ipfs/QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o
就可以看到文件内容了
【查看结果】方法4: curl命令访问8080端口
新开一个terminal窗口,运行下面这个命令:
curl http://localhost:8080/ipfs/QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o
打印出来hello world就对了~_~
hello world