环境: 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/

标签: none

添加新评论