我也是个新手,安装部署过程也踩了很多坑,还是觉得有必要写下来给各位一些借鉴,不需要过程的朋友可以直接看文末是否遇到跟我类似的问题。
环境:服务器系统centos7
安装docker-ce:
1、安装库:
yum install -y yum-utils device-mapper-persistent-data lvm2 -y
2、添yum软件源:
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3、更新yum源:
sudo yum makecache fast
4、安装docker-ce:
yum -y install docker-ce
5、启动docker后台服务:
systemctl start docker
在服务器(宿主主机)安装ipfs:
1、在https://dist.ipfs.io/#go-ipfs 下载Linux 64位版本。
2、将go-ipfs的linux 64位安装包上传到服务器root的家目录。
3、进入家目录解压:
cd ~ tar xvfz go-ipfs_v0.4.22_linux-amd64.tar.gz
4、进入解压后的go-ipfs目录:
cd go-ipfs
5、把./ipfs移动到 /usr/local/bin,使任何路径下均可执行ipfs命令执行:
./install.sh
6、初始化账户:
ipfs init
7、从引导节点列表中移除所有节点:
ipfs bootstrap rm --all
可以查看与当前节点有连接的其他节点:
ipfs swarm peers
8、关闭守护进程,按Ctrl+c
7、将swarm.key上传到 服务器~/go-ipfs/ 目录下。
8、swarm.key将拷贝到IPFS节点的安装目录:
cp ~/go-ipfs/swarm.key ~/.ipfs/
9、启动守护进程:
ipfs daemon
10、查看当前节点地址身份信息:
ipfs id
我这里是/ip4/172.31.9.91/tcp/4001/ipfs/QmR31iBhBzcUqy2TPSn7EKPfvzFyjcn2C5Chk2hpk4yNnB
后续添加节点建立连接会用到这个地址信息。
swarm.key生成过程:
1、因为不想在本地装go语言环境,我在docker里面pull了一个golang镜像,怎么方便怎么来吧。
2、在github上下载,主要是需要它的main.go文件:https://github.com/Kubuxu/go-ipfs-swarm-key-gen
3、将main.go 从宿主主机拷贝到docker golang, 执行: go build main.go 生成main (这里注意main.go的路径,我是在它所在的目录下执行的,所以没有加上路径信息)
4、然后:main > swarm.key
将swarm.key从docker拷到宿主主机就行,拷贝命令可以百度细节。
PS:用在线编译直接得到输出,手动构建swarm.key,但是踩坑了。最后会介绍。
在docker中部署节点:
计划部署4个,分别是peer1、peer2、peer3、peer4,部署过程以peer1为例,其他节点执行相同操作,只需将peer1的部分改为peer2,3,4即可。
1、在宿主主机创建ipfs节点peer1的data、export目录:
mkdir -p ~/ipfs/peer1/data ~/ipfs/peer1/export
2、然后swarm.key分别将拷贝到每个IPFS节点的安装目录:
cp ~/go-ipfs/swarm.key ~/ipfs/peer1/data/
3、在docker中新建一个容器(下次新建需修改红色部分):
docker run -d –name ipfs_peer1 -v ~/ipfs/peer1/export:/export -v ~/ipfs/peer1/data:/data/ipfs -p 4011:4001 -p 127.0.0.1:9080:8080 -p 127.0.0.1:5011:5001 ipfs/go-ipfs:latest
注意: 1、这里如果没有镜像,会pull镜像,等pull完就可以。
2、端口参数:4001是P2P,8080是网关,5001是HTTP
如果不止本地访问还可以将127.0.0.1改为0.0.0.0
-p 4011:4001 前面是docker的,后面对应宿主主机的,
新建下一个容器的时候注意修改docker的端口,不然会报错端口冲突、端口占用,例如修改为:
-p 4021:4001 -p 127.0.0.1:9085:8080 -p 127.0.0.1:5021:5001
Ps:使用此命令不需要再额外开启守护进程和初始化,自动就做了。
节点初始化命令:ipfs init
4、进入容器:
docker exec -it ipfs_peer1 sh
Ps:ipfs_peer1 是容器名,前面新建容器的–name参数指定的。
也有使用docker exec -it 容器id或容器名 /bin/bash 进入容器。
5、从引导节点列表中移除所有节点:
ipfs bootstrap rm –all
可以查看与当前节点有连接的其他节点:
ipfs swarm peers
6、添加节点,这里我做的过程中它自动跟宿主主机节点建立了连接,不过为了防止没有连接,将手动添加命令附上。有两种方式均可,第二种有反馈。
第一种:ipfs bootstrap add /ip4/172.31.9.91/tcp/4001/ipfs/QmR31iBhBzcUqy2TPSn7EKPfvzFyjcn2C5Chk2hpk4yNnB 第二种:ipfs swarm connect /ip4/172.31.9.91/tcp/4001/ipfs/QmR31iBhBzcUqy2TPSn7EKPfvzFyjcn2C5Chk2hpk4yNnB
PS:这里的IP一定要注意,当时与其他节点建立连接这里踩了很多坑。为了跟外网的其他节点建立连接,肯定不能用我局域网内的ip,我就在浏览器查IP看我的对外IP,然后将IP部分修改发给朋友。这样做错了,因为局域网内多台电脑都用的这个IP,所以朋友添加我不成功。
7、退出容器:
exit
8、查看容器ID:
docker ps –a
会显示所有容器的信息。
9、停止容器:
docker stop 4efbd2594ee8 # 修改为自己的容器ID
Ps:下一次需启动容器后才能进入容器:docker start 4efbd2594ee8
问题及总结:
1、使用过程中如果启动容器报错,可尝试重启docker:systemctl restart docker
2、其实不用swarm.key也可以做,但前提是各个节点都要移除跟外部节点的连接,一旦有一个节点跟外网连接,其它节点都会慢慢连上。
3、关于ipfs添加节点建立连接不成功,多半是IP问题,也就是提供的节点地址信息不对。前面有提过。而且有些内网添加外网节点没问题,但是外网添加内网的节点就会不成功。
4、新建容器,容器和宿主主机的端口映射要注意,不然会出现端口冲突端口占用的错误。
5、关于swarm.key报错 ,
(pkg/mod/github.com/ipfs/go-ipfs@v0.4.22/core/node/libp2p/pnet.go:19) returned a non-nil error: failed to configure private network: malformed private network key: psk header error: multicodec did not match
ERROR cmd/ipfs: error from node construction: could not build arguments for function "github.com/ipfs/go-ipfs/core/node".
主要是懒,当时懒的装golang环境,所以直接使用在线编译器将main.go的输出拷贝出来,粘贴在txt文本里然后改名称后缀为swarm.key。后来启动ipfs守护进程就一直报错不能建立私网。打开文件,肉眼看到swarm.key的内容格式与前面使用的方法产生的一样,但是用前面介绍方法产生的key是不会报错的。可能还是有编码之类的微小区别吧。建议还是按照网上教程老老实实生成key.
我最后比较了两种方式产生的key,发现在线编译的方式文件大了2字节。
swarm.key 内容格式如下:
内容有误请联系我修改,我还有很多东西没说清,有人清楚的话,欢迎补充。
原文链接:https://blog.csdn.net/qq_26720653/article/details/103529010
原创文章,作者:优速盾-小U,如若转载,请注明出处:https://www.cdnb.net/bbs/archives/8129