目录
IPFS (InterPlanetary File System) 是一个面向全球的、点对点的分布式版本文件系统。它用基于内容的地址替代基于域名的地址,也就是用户寻找的不是某个地址而是储存在某个地方的内容,不需要验证发送者的身份,而只需要验证内容的哈希,通过这样可以让网页的速度更快、更安全、更健壮、更持久。IPFS表示,IPFS未来将替代HTTP(以及其他的许多东西)。
准备至少两台服务器,这里使用了三台:
节点 | IP |
---|---|
管理节点 | 10.1.1.170 |
peer1 | 10.1.1.171 |
peer2 | 10.1.1.172 |
IPFS 官方提供的安装方式有安装包方式,ipfs-update 方式,源码编译安装方式,具体可以查看 https://docs.ipfs.io/guides/guides/install/ 。
这里使用ipfs-update 方式安装。以下操作若未作说明,则在所有节点执行。
1.安装golang
使用二进制包安装,下载最新的安装包:
wget https://golang.google.cn/dl/go1.16.2.linux-amd64.tar.gz
解压缩:
sudo tar xzf go1.16.2.linux-amd64.tar.gz
配置环境变量:
sudo vim /etc/profile
由于golang的包管理被墙,除了go的运行位置外还需添加包管理的代理:
export GOPATH=/data/go
export PATH=$GOPATH/bin:$PATH
export GOPROXY=https://goproxy.io
export GO111MODULE=on
使环境变量生效:
source /etc/profile
验证安装:
ubuntu@ipfs1_170:/data$ go version
go version go1.16.2 linux/amd64
2.安装 ipfs-update
由于DNS污染问题,需先配置hosts文件:
sudo vim /etc/hosts
添加:
209.94.78.78 ipfs.io
209.94.90.1 ipfs.io
保存退出后,安装ipfs-update:
go get -u github.com/ipfs/ipfs-update
通过ipfs-update versions可以列出所有可以使用和可以下载的ipfs版本.我们这里直接安装最新的版本,安装最新版本:
ipfs-update install latest
3.初始化
首先确定本地仓库的目录,默认是在~/.ipfs下,如果要修改,在/etc/profile里添加:
export IPFS_PATH=/data/ipfs
使环境变量生效:
source /etc/profile
进入/data/ipfs文件夹:
ipfs init
4.创建共享密钥
swarm.key密钥允许我们创建一个私有网络,并告诉网络节点只和拥有相同秘钥的节点通信,在一个节点上执行下面命令:
go get -u github.com/Kubuxu/go-ipfs-swarm-key-gen/ipfs-swarm-key-gen
ipfs-swarm-key-gen > /data/ipfs/swarm.key
通过scp或者上传的方式将生成的swarm.key拷贝到每一台节点的/data/ipfs/目录下。
5.移除默认的 bootstrap 节点
为了不连接全球的 IPFS 网络,需要将默认的 bootstrap 的节点信息删除:
ipfs bootstrap rm --all
6.创建私有网络节点
在每台节点中添加管理节点的 bootstrap:
ipfs bootstrap add /ip4/10.1.1.170/tcp/4001/ipfs/12D3KooWKuZxqY2gZJHKtU7zmtgp9SkAUFX82HgPMWPo4u3af3by
12D3KooWKuZxqY2gZJHKtU7zmtgp9SkAUFX82HgPMWPo4u3af3by为ipfs init时生成的节点 ID,也可以通过ipfs id查看当前节点的 ID。我们还需要设置环境变量/etc/profile来强制我们的网络进入私有模式:
export LIBP2P_FORCE_PNET=1
使环境变量生效:
source /etc/profile
7.修改默认配置
默认ipfs的api只能本机访问,根据实际情况修改成本地或远程访问,首先配置编辑器的环境变量,选择一个你熟悉的编辑其,这里使用vim,在/etc/profile中添加:
export EDITOR=/usr/bin/vim
使环境变量生效:
source /etc/profile
进入配置编辑:
ipfs config edit
找到Addresses,修改API键对应的值,这里修改成本机ip,即10.1.1.170:
"Addresses": {
"API": "/ip4/10.1.1.170/tcp/5001",
"Announce": [],
"Gateway": "/ip4/10.1.1.170/tcp/8080",
"NoAnnounce": [],
"Swarm": [
"/ip4/0.0.0.0/tcp/4001",
"/ip6/::/tcp/4001",
"/ip4/0.0.0.0/udp/4001/quic",
"/ip6/::/udp/4001/quic"
]
},
保存退出。
8.运行ipfs
ipfs daemon
验证节点信息:
ubuntu@ipfs1_170:/data$ ipfs swarm peers
/ip4/10.1.1.171/tcp/4001/p2p/12D3KooWENuSL1yXp5ZQAw93BPKBFa7931rpXzh766ByGHrsWLMu
/ip4/10.1.1.172/tcp/4001/p2p/12D3KooWLJ4EXrqRmpZyfAXMUyHR1ctXFUneBQsM29VX1X7Msbde
9.添加文件至节点并验证
在peer2添加文件
echo "hello from ipfs" > hello.txt
ubuntu@ipfs2_172:~$ ipfs add hello.txt
added QmdWtwDuS5nnXGDUtFj28B5xUyzmxgsry3N9jkRP7jvnxn hello.txt
16 B / 16 B [============================================================================================================================================] 100.00%
在peer1查看该文件
ubuntu@ipfs2_171:~$ ipfs cat QmdWtwDuS5nnXGDUtFj28B5xUyzmxgsry3N9jkRP7jvnxn
hello from ipfs
10.API说明文档
中文社区文档:https://ipfs.netlify.app/docs/api.html
官方文档(英文):https://docs.ipfs.io/reference/http/api/#getting-started
中文的版本相对滞后,仅供参考。
11.遗留问题
这里仅安装了命令行的程序,没有安装webui,在安装webui时我遇到了跨域访问的问题,按照github上的配置并没有解决问题,后续再跟进研究。webui源码地址:https://github.com/ipfs-shipyard/ipfs-webui