IPFS私有网络搭建
环境: Ubuntu 20.04.3 LTS
服务器开启 IPFS 和 IPFS-Cluster默认的端口
IPFS 默认端口:
4001 – 与其他节点通信的端口
5001 – API server
8080 – Gateway server
IPFS-CLUSTER 默认端口:
9094 – HTTP API endpoint
9095 – IPFS proxy endpoint
9096 – Cluster swarm 集群监控节点通信端口
1. 安装 docker
sudo apt install docker.io
查看是否安装成功使用 sudo docker --version
命令
$ sudo docker -v
docker version 20.10.7, build 20.10.7-0ubuntu1~20.04.3
2. 安装 docker-compose
参考:
在 Linux 系统上使用 Docker Compose V2: https://9yu.cc/index.php/archives/83/
3. 设置 ipfs-cluster 集群密钥
类似于 ipfs 的共享秘钥,我们在管理节点生成一个随机密钥
od -vN 32 -An -tx1 /dev/urandom | tr -d ' \n'
将生成的随机字符串添加到 docker-compose.yml
中 ipfs-cluster0 的 CLUSTER_SECRET 环境变量,例如:14cfd062c83596bd5113ec0479f4e29d485430b6b444c994a0feef8b2c1a41cf
4. 使用 docker-compose.yml
文件启动集群
手动生成秘钥 CLUSTER_SECRET,32 位十六进制编码的随机字符串
export CLUSTER_SECRET=$(od -vN 32 -An -tx1 /dev/urandom | tr -d ' \n') | echo $CLUSTER_SECRET
使用命令 vim docker-compose.yml
创建配置文件, 并把以下内容复制粘贴到 yml文件保存:
services:
ipfs0:
container_name: ipfs0
image: ipfs/go-ipfs:latest # 指定容器退出后的重启策略为始终重启
restart: always
ports:
- "4001:4001" # ipfs swarm - expose if needed/wanted
- "5001:5001" # ipfs api - expose if needed/wanted
- "8080:8080" # ipfs gateway - expose if needed/wanted
volumes:
- /root/.ipfs/ipfs:/data/ipfs
ipfs-cluster0:
container_name: ipfs-cluster0
image: ipfs/ipfs-cluster:latest
restart: always
depends_on:
- ipfs0
environment:
CLUSTER_PEERNAME: cluster0
CLUSTER_SECRET: "14cfd062c83596bd5113ec0479f4e29d485430b6b444c994a0feef8b2c1a41cf" # 集群密钥
CLUSTER_IPFSHTTP_NODEMULTIADDRESS: /dns4/ipfs0/tcp/5001
CLUSTER_CRDT_TRUSTEDPEERS: '*' # Trust all peers in Cluster
CLUSTER_RESTAPI_HTTPLISTENMULTIADDRESS: /ip4/0.0.0.0/tcp/9094 # Expose API
CLUSTER_MONITORPINGINTERVAL: 2s # Speed up peer discovery
ports:
- "9094:9094" # HTTP API endpoint
- "9095:9095" # IPFS proxy endpoint
- "9096:9096" # Cluster swarm 集群节点通信端口
volumes:
- /root/.ipfs/ipfs-cluster:/data/ipfs-cluster
保存成功后使用命令启动容器:
docker compose up -d
5. 创建 ipfs 共享密钥
swarm.key
密钥允许我们创建一个私有网络, 并告诉网络节点只与具有相同密钥的节点通信. 在一个节点上执行以下命令:
go get -u github.com/Kubuxu/go-ipfs-swarm-key-gen/ipfs-swarm-key-gen
ipfs-swarm-key-gen > ~/.ipfs/ipfs/swarm.key
将生成的 swarm.key
复制到各个节点的 ~/.ipfs/ipfs/swarm.key
6. 进入容器
输入 sudo docker container ls
查看容器列表, 然后替换 CONTAINER ID
进入容器
docker exec -it <container_id> sh
7. 删除默认 bootstrap 节点 (ipfs 容器)
为了不连接 IPFS 的全球网络, 需要将默认的 bootstrap 的节点信息删除, 在 ipfs容器中执行命令
ipfs bootstrap rm --all
8. ipfs 私网节点配置 (ipfs 容器)
设置容器环境变量 LIBP2P FORCE PNET
来强制网络进入私有模式:
export LIBP2P_FORCE_PNET=1
在每个节点添加第一个节点的 bootstrap, 在容器里使用 ipfs id
命令查看当前节点的 id:
ipfs bootstrap add /ip4/192.168.1.5/tcp/4001/ipfs/12D3KooWEmwzRTtAFZMqudorSHHc5UGq3SWqcctodFqNTq7NZbS1
9. ipfs-cluster 添加节点 (ipfs-cluster 容器)
使用 ipfs-cluster-ctl id
命令查看当前集群 id
把 id 添加到 /root/.ipfs/ipfs-cluster/service.json
文件中 peer_addresses
选项的括号里, 例:
"peer_addresses": [
"/ip4/192.168.1.5/tcp/9096/p2p/12D3KooWJH1yVjC7rQ7tjL9Wfg4ErCTyKPSAFfuJ2nvhgUS9Lg73"
]
10. 测试集群数据复制
在其中一个节点添加文件:
ipfs-cluster-ctl add test_file.txt
通过添加的文件 CID
来查看文件状态, 可以看到文件以及在所有节点中PINNED
ipfs-cluster-ctl status CID
[1] ipfs官方文档: https://docs.ipfs.io
[2] IPFS Cluster集群官方文档: https://cluster.ipfs.io/documentation
[3] IPFS私有网络集群搭建:https://segmentfault.com/a/1190000021539562
[4] Setting Up A Private IPFS Network With IPFS And IPFS-Cluster: https://www.geekdecoder.com/setting-up-a-private-ipfs-network-with-ipfs-and-ipfs-cluster/