WEB3DEV

Cover image for Cluster IPFS Multinós no Docker
Panegali
Panegali

Posted on • Atualizado em

Cluster IPFS Multinós no Docker

Contextualização

Em minha postagem anterior, discuti sobre a implantação do cluster IPFS com o Docker em um único host (implementei contêineres do Docker do cluster IPFS em um único host). Neste post, discutirei sobre a implantação do cluster IPFS em ambiente de vários hosts com o Docker. As implantações relacionadas a este post estão disponíveis no gitlab. Por favor, clone o repositório e continue o post.

Arquitetura do cluster

Eu estou implantando um Cluster IPFS de três nós. Ele contém três nós IPFS junto com três nós Cluster IPFS. A figura a seguir descreve a arquitetura desse cluster IPFS.

1

Pares de Inicialização

Os pares IPFS são configurados com a bootstrap list (lista de pares), com a qual o daemon IPFS aprende sobre outros pares na rede. O IPFS vem com uma lista padrão de pares confiáveis, mas podemos modificar a lista para atender às nossas necessidades. Um uso popular para uma lista de inicialização personalizada é criar uma rede IPFS pessoal. MAS, ao contrário do daemon IPFS, que por padrão se conecta à rede pública IPFS e pode descobrir outros pares nela, conectando-se primeiro a uma lista bem conhecida de inicializadores disponíveis, um par de um cluster IPFS é executado em uma rede privada e não possui nenhum par público para inicializar. Assim, ao iniciar os pares do cluster IPFS pela primeira vez, é importante fornecer informações para que eles possam descobrir os outros pares e ingressar no cluster. Eu posso modificar a lista de inicialização do daemon IPFS com o comando ipfs bootstrap add. Os pares de inicialização do cluster IPFS podem ser especificados ao iniciar o cluster com --bootstrap <peer-multiaddress1,peer-multiaddress2>. Nesta configuração de cluster, estou usando peer0 como o par de inicialização do IPFS e do cluster IPFS.

Segredo do Cluster

Existe uma string de 32 bytes codificada em hexadecimais (conhecida como secret) que atua como protetora da rede libp2p. Isso fornece criptografia adicional para todas as comunicações entre pares (libp2p) usando uma chave pré-compartilhada. O compartilhamento do mesmo segredo do cluster permite que os pares entendam que fazem parte de um IPFS- Cluster. O segredo do cluster impossibilita a comunicação com o ponto de extremidade de agrupamento de um par e, portanto, impossibilita o envio de comandos RPC para esse par, sem conhecer o segredo com antecedência.

O segredo é um requisito de segurança para clusters baseados em Raft que não impõe nenhuma política de autorização RPC. Os clusters baseados em CRDT podem ser executados com um segredo vazio, desde que trusted_peers esteja configurado corretamente: apenas os pares contidos em trusted_peers podem modificar o agrupamento de afixados e executar ações. No entanto, é recomendável definir o secret em todos os casos, pois fornece isolamento de rede: clusters executados sem um segredo podem descobrir e se conectar à rede IPFS principal, o que geralmente é inútil para os pares do cluster (e para a rede IPFS).

O segredo do cluster pode ser definido com CLUSTER_SECRET, uma variável de ambiente. Eu gerei a chave secreta com o seguinte comando e configurei cada par como uma variável de ambiente.

# gerar segredo do cluster
export CLUSTER_SECRET=$(od -vN 32 -An -tx1 /dev/urandom | tr -d ' \n')
echo $CLUSTER_SECRET

# este é o segredo do cluster gerado
e23e876e6742615eca9aefdc05943fa0d1bbc18f7d0a4f27e22ff8931fc56624
Enter fullscreen mode Exit fullscreen mode

Implantar Par0

À seguir temos a implantação docker-compose.yml do peer0. Ele contém os contêineres de implantações IPFS (ipfs0) e cluster IPFS (cluster0). Este par é implantado em uma instância AWS com endereço IP público.

version: '3.4'

services:

  # cluster peer0
  # use peer0 como o peer de inicialização

  ipfs0:
    container_name: ipfs0
    image: ipfs/go-ipfs:release
    ports:
      - "4001:4001" # ipfs swarm 
      - "5001:5001" # ipfs api 
      - "8081:8080" # ipfs gateway 
    volumes:
      - /private/var/services/librum/ipfs/ipfs0:/data/ipfs

  cluster0:
    container_name: cluster0
    image: ipfs/ipfs-cluster:latest
    depends_on:
      - ipfs0
    environment:
      CLUSTER_PEERNAME: cluster0
      CLUSTER_SECRET: ${CLUSTER_SECRET} 
      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
      - "9095:9095" # proxy api
      - "9096:9096" # cluster swarm, other peers connect via this port
    volumes:
      - /private/var/services/librum/ipfs/cluster0:/data/ipfs-cluster
Enter fullscreen mode Exit fullscreen mode

Depois de implantar o contêiner, conectei-me em ipfs0 e obtive o endereço IPFS desse par. Esse endereço é usado como endereço de inicialização IPFS em outros pares. Então eu me conectei ao cluster0 container e peguei o endereço do cluster desse par. Esse endereço é usado como o endereço de inicialização do cluster IPFS para outros pares (peer1 e peer2). Eu configurei este endereço no arquivo .env de outros pares (peer1 e peer2) como uma variável de ambiente CLUSTER_PEER0.

# implantar ipfs0 e cluster0
docker-compose -f peer0-deployment.yml up -d ipfs0
docker-compose -f peer0-deployment.yml up -d cluster0

# executando containers
docker ps | grep ipfs
c72adf8a2a1e   ipfs/ipfs-cluster:latest       "/sbin/tini -- /usr/…"   20 seconds ago       Up 18 seconds                 0.0.0.0:9094-9096->9094-9096/tcp, :::9094-9096->9094-9096/tcp                                                                                               ipfs0                                                                                                                                                                                                              
2e3f72345414   ipfs/go-ipfs:release           "/sbin/tini -- /usr/…"   About a minute ago   Up About a minute (healthy)   0.0.0.0:4001->4001/tcp, :::4001->4001/tcp, 4001/udp, 0.0.0.0:5001->5001/tcp, :::5001->5001/tcp, 8081/tcp, 0.0.0.0:8081->8080/tcp, :::8081->8080/tcp         cluster0                                                        

# conectar ipfs0
docker exec -it ipfs0 /bin/sh

# obter o ID do par
ipfs id
{
    "ID": "12D3KooWQ8Uvw8QrfF9coNdKPezRMQNY9pJ8Kdg3jjdCqEQ1pF8P",
    "PublicKey": "CAESINSnt5wVK8Sx3fVByTUZGOmVfnOeWJd3qr31gaAilmyc",
    "Addresses": [
        "/ip4/127.0.0.1/tcp/4001/p2p/12D3KooWQ8Uvw8QrfF9coNdKPezRMQNY9pJ8Kdg3jjdCqEQ1pF8P",
        "/ip4/127.0.0.1/udp/4001/quic/p2p/12D3KooWQ8Uvw8QrfF9coNdKPezRMQNY9pJ8Kdg3jjdCqEQ1pF8P",
        "/ip4/172.21.0.2/tcp/4001/p2p/12D3KooWQ8Uvw8QrfF9coNdKPezRMQNY9pJ8Kdg3jjdCqEQ1pF8P",
        "/ip4/172.21.0.2/udp/4001/quic/p2p/12D3KooWQ8Uvw8QrfF9coNdKPezRMQNY9pJ8Kdg3jjdCqEQ1pF8P",
        "/ip4/20.127.75.93/tcp/4001/p2p/12D3KooWQ8Uvw8QrfF9coNdKPezRMQNY9pJ8Kdg3jjdCqEQ1pF8P",
        "/ip4/20.127.75.93/udp/4001/quic/p2p/12D3KooWQ8Uvw8QrfF9coNdKPezRMQNY9pJ8Kdg3jjdCqEQ1pF8P"
    ],
    "AgentVersion": "go-ipfs/0.12.2/0e8b121/docker",
    "ProtocolVersion": "ipfs/0.1.0",
    "Protocols": [
        "/ipfs/bitswap",
        "/ipfs/bitswap/1.0.0",
        "/ipfs/bitswap/1.1.0",
        "/ipfs/bitswap/1.2.0",
        "/ipfs/id/1.0.0",
        "/ipfs/id/push/1.0.0",
        "/ipfs/kad/1.0.0",
        "/ipfs/lan/kad/1.0.0",
        "/ipfs/ping/1.0.0",
        "/libp2p/autonat/1.0.0",
        "/libp2p/circuit/relay/0.1.0",
        "/libp2p/circuit/relay/0.2.0/hop",
        "/libp2p/circuit/relay/0.2.0/stop",
        "/p2p/id/delta/1.0.0",
        "/x/"
    ]
}

# conectar ao cluster0
docker exec -it cluster0 /bin/sh

# obter o ID do par
# ipfs-cluster-ctl id
12D3KooWRdUMLYM3M1hwXrCPfjnoFnx9PfdTCuGa2h5VKoABZ2uC | cluster0 | Sees 0 other peers
  > Addresses:
    - /ip4/127.0.0.1/tcp/9096/p2p/12D3KooWRdUMLYM3M1hwXrCPfjnoFnx9PfdTCuGa2h5VKoABZ2uC
    - /ip4/172.21.0.3/tcp/9096/p2p/12D3KooWRdUMLYM3M1hwXrCPfjnoFnx9PfdTCuGa2h5VKoABZ2uC
  > IPFS: 12D3KooWQ8Uvw8QrfF9coNdKPezRMQNY9pJ8Kdg3jjdCqEQ1pF8P
    - /ip4/127.0.0.1/tcp/4001/p2p/12D3KooWQ8Uvw8QrfF9coNdKPezRMQNY9pJ8Kdg3jjdCqEQ1pF8P
    - /ip4/127.0.0.1/udp/4001/quic/p2p/12D3KooWQ8Uvw8QrfF9coNdKPezRMQNY9pJ8Kdg3jjdCqEQ1pF8P
    - /ip4/172.21.0.2/tcp/4001/p2p/12D3KooWQ8Uvw8QrfF9coNdKPezRMQNY9pJ8Kdg3jjdCqEQ1pF8P
    - /ip4/172.21.0.2/udp/4001/quic/p2p/12D3KooWQ8Uvw8QrfF9coNdKPezRMQNY9pJ8Kdg3jjdCqEQ1pF8P
    - /ip4/20.127.75.93/tcp/4001/p2p/12D3KooWQ8Uvw8QrfF9coNdKPezRMQNY9pJ8Kdg3jjdCqEQ1pF8P
    - /ip4/20.127.75.93/udp/4001/quic/p2p/12D3KooWQ8Uvw8QrfF9coNdKPezRMQNY9pJ8Kdg3jjdCqEQ1pF8P
/ #
Enter fullscreen mode Exit fullscreen mode

Implantar Par1

À seguir temos a implantação docker-compose.yml do peer1. Ele contém os contêineres de implantações IPFS (ipfs1) e cluster IPFS (cluster1). Este par é implantado em uma instância AWS.

version: '3.4'

services:

  # cluster peer1
  # use peer0 como o peer de inicialização

  ipfs1:
    container_name: ipfs1
    image: ipfs/go-ipfs:release
    volumes:
      - /private/var/services/librum/ipfs/ipfs1:/data/ipfs

  cluster1:
    container_name: cluster1
    image: ipfs/ipfs-cluster:latest
    depends_on:
      - ipfs1
    environment:
      CLUSTER_PEERNAME: cluster1
      CLUSTER_SECRET: ${CLUSTER_SECRET}
      CLUSTER_IPFSHTTP_NODEMULTIADDRESS: /dns4/ipfs1/tcp/5001
      CLUSTER_CRDT_TRUSTEDPEERS: '*'
      CLUSTER_MONITORPINGINTERVAL: 2s # Speed up peer discovery
    volumes:
      - /private/var/services/librum/ipfs/cluster1:/data/ipfs-cluster
    command:
      - "daemon --bootstrap ${CLUSTER_PEER0}" # add multiple peers with comma seperated
Enter fullscreen mode Exit fullscreen mode

Antes de implantar o peer1, adicionei o endereço CLUSTER_PEER0 ao arquivo .env. Este endereço passou para o comando de cluster IPFS daemon --bootstrap.

CLUSTER_SECRET=e23e876e6742615eca9aefdc05943fa0d1bbc18f7d0a4f27e22ff8931fc56624

# 20.127.75.93 é o endereço IP público de peer0
CLUSTER_PEER0="/ip4/20.127.75.93/tcp/9096/p2p/12D3KooWRdUMLYM3M1hwXrCPfjnoFnx9PfdTCuGa2h5VKoABZ2uC"
Enter fullscreen mode Exit fullscreen mode

Depois de implantar o contêiner ipfs1, conectei-me ao contêiner e adicionei o endereço ipfs0 dos pares à lista de inicialização com o comando ipfs bootstrap add. Então este ipfs1 pode encontrar os outros pares na rede através do par de inicialização ipfs0.

# implantar contêiner ipfs1
docker-compose -f peer1-deployment.yml up -d ipfs1

# conectar ao contêiner ipfs1 
docker exec -it ipfs1 /bin/sh

# adicionar ipfs0 na lista de inicialização /ip4/20.127.75.93/tcp/4001/p2p/12D3KooWQ8Uvw8QrfF9coNdKPezRMQNY9pJ8Kdg3jjdCqEQ1pF8P

# listar pares de inicialização
# o último é o par de inicialização recém-adicionado
ipfs bootstrap list
/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN
/dnsaddr/bootstrap.libp2p.io/p2p/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa
/dnsaddr/bootstrap.libp2p.io/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb
/dnsaddr/bootstrap.libp2p.io/p2p/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt
/ip4/104.131.131.82/tcp/4001/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ
/ip4/104.131.131.82/udp/4001/quic/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ
/ip4/20.127.75.93/tcp/4001/p2p/12D3KooWQ8Uvw8QrfF9coNdKPezRMQNY9pJ8Kdg3jjdCqEQ1pF8P

# executar cluster1
docker-compose -f peer1-deployment.yml up -d cluster1

# conectar ao contêiner cluster1
docker exec -it cluster1 /bin/sh

# verifique os pares do cluster ipfs
# dois pares devem estar lá
ipfs-cluster-ctl peers ls
12D3KooWD2gfEg4sjK7zVaj9SeK8pcssnxczjg9Lt7ZkkkhcmwpZ | cluster1 | Sees 1 other peers
  > Addresses:
    - /ip4/127.0.0.1/tcp/9096/p2p/12D3KooWD2gfEg4sjK7zVaj9SeK8pcssnxczjg9Lt7ZkkkhcmwpZ
    - /ip4/172.22.0.3/tcp/9096/p2p/12D3KooWD2gfEg4sjK7zVaj9SeK8pcssnxczjg9Lt7ZkkkhcmwpZ
  > IPFS: 12D3KooWQqQPMLLsXzGtxd1wCZBRdZjxW7wzyXgJamnqipwAvrcG
    - /ip4/127.0.0.1/tcp/4001/p2p/12D3KooWQqQPMLLsXzGtxd1wCZBRdZjxW7wzyXgJamnqipwAvrcG
    - /ip4/127.0.0.1/udp/4001/quic/p2p/12D3KooWQqQPMLLsXzGtxd1wCZBRdZjxW7wzyXgJamnqipwAvrcG
    - /ip4/172.22.0.2/tcp/4001/p2p/12D3KooWQqQPMLLsXzGtxd1wCZBRdZjxW7wzyXgJamnqipwAvrcG
    - /ip4/172.22.0.2/udp/4001/quic/p2p/12D3KooWQqQPMLLsXzGtxd1wCZBRdZjxW7wzyXgJamnqipwAvrcG
    - /ip4/20.228.145.221/tcp/4001/p2p/12D3KooWQqQPMLLsXzGtxd1wCZBRdZjxW7wzyXgJamnqipwAvrcG
    - /ip4/20.228.145.221/udp/4001/quic/p2p/12D3KooWQqQPMLLsXzGtxd1wCZBRdZjxW7wzyXgJamnqipwAvrcG
12D3KooWRdUMLYM3M1hwXrCPfjnoFnx9PfdTCuGa2h5VKoABZ2uC | cluster0 | Sees 1 other peers
  > Addresses:
    - /ip4/127.0.0.1/tcp/9096/p2p/12D3KooWRdUMLYM3M1hwXrCPfjnoFnx9PfdTCuGa2h5VKoABZ2uC
    - /ip4/172.21.0.3/tcp/9096/p2p/12D3KooWRdUMLYM3M1hwXrCPfjnoFnx9PfdTCuGa2h5VKoABZ2uC
    - /ip4/20.127.75.93/tcp/9096/p2p/12D3KooWRdUMLYM3M1hwXrCPfjnoFnx9PfdTCuGa2h5VKoABZ2uC
  > IPFS: 12D3KooWQ8Uvw8QrfF9coNdKPezRMQNY9pJ8Kdg3jjdCqEQ1pF8P
    - /ip4/127.0.0.1/tcp/4001/p2p/12D3KooWQ8Uvw8QrfF9coNdKPezRMQNY9pJ8Kdg3jjdCqEQ1pF8P
    - /ip4/127.0.0.1/udp/4001/quic/p2p/12D3KooWQ8Uvw8QrfF9coNdKPezRMQNY9pJ8Kdg3jjdCqEQ1pF8P
    - /ip4/172.21.0.2/tcp/4001/p2p/12D3KooWQ8Uvw8QrfF9coNdKPezRMQNY9pJ8Kdg3jjdCqEQ1pF8P
    - /ip4/172.21.0.2/udp/4001/quic/p2p/12D3KooWQ8Uvw8QrfF9coNdKPezRMQNY9pJ8Kdg3jjdCqEQ1pF8P
    - /ip4/20.127.75.93/tcp/4001/p2p/12D3KooWQ8Uvw8QrfF9coNdKPezRMQNY9pJ8Kdg3jjdCqEQ1pF8P
    - /ip4/20.127.75.93/udp/4001/quic/p2p/12D3KooWQ8Uvw8QrfF9coNdKPezRMQNY9pJ8Kdg3jjdCqEQ1pF8P
Enter fullscreen mode Exit fullscreen mode

Implantar Par2

A seguir está a implantação docker-compose.yml do peer2. Ele contém os contêineres de implantações IPFS (ipfs2) e cluster IPFS (cluster2). Este par é implantado na máquina local.

version: '3.4'

services:

  # cluster peer2
  # use peer0 como o par de inicialização

  ipfs2:
    container_name: ipfs2
    image: ipfs/go-ipfs:release
    volumes:
      - /private/var/services/librum/ipfs/ipfs2:/data/ipfs

  cluster2:
    container_name: cluster2
    image: ipfs/ipfs-cluster:latest
    depends_on:
      - ipfs2
    environment:
      CLUSTER_PEERNAME: cluster2
      CLUSTER_SECRET: ${CLUSTER_SECRET}
      CLUSTER_IPFSHTTP_NODEMULTIADDRESS: /dns4/ipfs2/tcp/5001
      CLUSTER_CRDT_TRUSTEDPEERS: '*'
      CLUSTER_MONITORPINGINTERVAL: 2s # Speed up peer discovery
    volumes:
      - /private/var/services/librum/ipfs/cluster2:/data/ipfs-cluster
    command:
      - "daemon --bootstrap ${CLUSTER_PEER0}" # add multiple peers with comma seperated
Enter fullscreen mode Exit fullscreen mode

Semelhante ao peer1, antes de implantar o peer2, adicionei o endereço CLUSTER_PEER0 ao arquivo .env. Este endereço passou para o comando de cluster IPFS daemon --bootstrap.

CLUSTER_SECRET=e23e876e6742615eca9aefdc05943fa0d1bbc18f7d0a4f27e22ff8931fc56624

# 20.127.75.93 é o endereço IP público de peer0
CLUSTER_PEER0="/ip4/20.127.75.93/tcp/9096/p2p/12D3KooWRdUMLYM3M1hwXrCPfjnoFnx9PfdTCuGa2h5VKoABZ2uC"
Enter fullscreen mode Exit fullscreen mode

Depois de implantar o contêiner ipfs2, conectei-me ao contêiner e adicionei o endereço ipfs0 dos pares à lista de inicialização com o comando ipfs bootstrap add. Então este par ipfs2 pode encontrar os outros pares na rede através do par de inicialização ipfs0.

# executar o contêiner ipfs2
docker-compose -f peer2-deployment.yml up -d ipfs1

# conectar ao contêiner ipfs2
docker exec -it ipfs2 /bin/sh

# adicionar ipfs0 na lista de inicialização
ipfs bootstrap add /ip4/20.127.75.93/tcp/4001/p2p/12D3KooWQ8Uvw8QrfF9coNdKPezRMQNY9pJ8Kdg3jjdCqEQ1pF8P

# listar pares de inicialização
# o último é o peer de inicialização recém-adicionado
# lista de inicialização ipfs
/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN
/dnsaddr/bootstrap.libp2p.io/p2p/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa
/dnsaddr/bootstrap.libp2p.io/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb
/dnsaddr/bootstrap.libp2p.io/p2p/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt
/ip4/104.131.131.82/tcp/4001/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ
/ip4/104.131.131.82/udp/4001/quic/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ
/ip4/20.127.75.93/tcp/4001/p2p/12D3KooWQ8Uvw8QrfF9coNdKPezRMQNY9pJ8Kdg3jjdCqEQ1pF8P

# executar cluster2
docker-compose -f peer1-deployment.yml up -d cluster2

# conectar ao contêiner cluster2 
docker exec -it cluster2 /bin/sh

# verifique os pares do cluster ipfs
# três pares devem estar lá
ipfs-cluster-ctl peers ls
12D3KooWQcaPhm7DvD2jSXFyaBoMR3WHUA9udTZwwyt34ousR6Rm | cluster2 | Sees 2 other peers
  > Addresses:
    - /ip4/127.0.0.1/tcp/9096/p2p/12D3KooWQcaPhm7DvD2jSXFyaBoMR3WHUA9udTZwwyt34ousR6Rm
    - /ip4/172.18.0.3/tcp/9096/p2p/12D3KooWQcaPhm7DvD2jSXFyaBoMR3WHUA9udTZwwyt34ousR6Rm
  > IPFS: 12D3KooWStxtfQW45SCE1MtaF6cQQyRb8QHpgJ5aQoTMBY4Zu1ur
    - /ip4/127.0.0.1/tcp/4001/p2p/12D3KooWStxtfQW45SCE1MtaF6cQQyRb8QHpgJ5aQoTMBY4Zu1ur
    - /ip4/127.0.0.1/udp/4001/quic/p2p/12D3KooWStxtfQW45SCE1MtaF6cQQyRb8QHpgJ5aQoTMBY4Zu1ur
    - /ip4/172.18.0.2/tcp/4001/p2p/12D3KooWStxtfQW45SCE1MtaF6cQQyRb8QHpgJ5aQoTMBY4Zu1ur
    - /ip4/172.18.0.2/udp/4001/quic/p2p/12D3KooWStxtfQW45SCE1MtaF6cQQyRb8QHpgJ5aQoTMBY4Zu1ur
    - /ip4/70.104.177.55/tcp/33046/p2p/12D3KooWStxtfQW45SCE1MtaF6cQQyRb8QHpgJ5aQoTMBY4Zu1ur
    - /ip4/70.104.177.55/udp/46850/quic/p2p/12D3KooWStxtfQW45SCE1MtaF6cQQyRb8QHpgJ5aQoTMBY4Zu1ur
12D3KooWRdUMLYM3M1hwXrCPfjnoFnx9PfdTCuGa2h5VKoABZ2uC | cluster0 | Sees 2 other peers
  > Addresses:
    - /ip4/127.0.0.1/tcp/9096/p2p/12D3KooWRdUMLYM3M1hwXrCPfjnoFnx9PfdTCuGa2h5VKoABZ2uC
    - /ip4/172.21.0.3/tcp/9096/p2p/12D3KooWRdUMLYM3M1hwXrCPfjnoFnx9PfdTCuGa2h5VKoABZ2uC
    - /ip4/20.127.75.93/tcp/9096/p2p/12D3KooWRdUMLYM3M1hwXrCPfjnoFnx9PfdTCuGa2h5VKoABZ2uC
  > IPFS: 12D3KooWQ8Uvw8QrfF9coNdKPezRMQNY9pJ8Kdg3jjdCqEQ1pF8P
    - /ip4/127.0.0.1/tcp/4001/p2p/12D3KooWQ8Uvw8QrfF9coNdKPezRMQNY9pJ8Kdg3jjdCqEQ1pF8P
    - /ip4/127.0.0.1/udp/4001/quic/p2p/12D3KooWQ8Uvw8QrfF9coNdKPezRMQNY9pJ8Kdg3jjdCqEQ1pF8P
    - /ip4/172.21.0.2/tcp/4001/p2p/12D3KooWQ8Uvw8QrfF9coNdKPezRMQNY9pJ8Kdg3jjdCqEQ1pF8P
    - /ip4/172.21.0.2/udp/4001/quic/p2p/12D3KooWQ8Uvw8QrfF9coNdKPezRMQNY9pJ8Kdg3jjdCqEQ1pF8P
    - /ip4/20.127.75.93/tcp/4001/p2p/12D3KooWQ8Uvw8QrfF9coNdKPezRMQNY9pJ8Kdg3jjdCqEQ1pF8P
    - /ip4/20.127.75.93/udp/4001/quic/p2p/12D3KooWQ8Uvw8QrfF9coNdKPezRMQNY9pJ8Kdg3jjdCqEQ1pF8P
12D3KooWD2gfEg4sjK7zVaj9SeK8pcssnxczjg9Lt7ZkkkhcmwpZ | ERROR: failed to dial 12D3KooWD2gfEg4sjK7zVaj9SeK8pcssnxczjg9Lt7ZkkkhcmwpZ:
  * [/ip4/172.22.0.3/tcp/9096] dial tcp4 0.0.0.0:9096->172.22.0.3:9096: i/o timeout
Enter fullscreen mode Exit fullscreen mode

Testar o cluster

Finalmente, conectei-me ao cluster IPFS e fixei alguns CIDs no cluster. A seguir está a maneira de fazer a fixação do CID e recuperar os status da fixação.

# conectar ao contêiner cluster2
docker exec -it cluster2 /bin/sh

# adicionar conteúdo ao ipfs
ipfs-cluster-ctl add data/ipfs-cluster/peerstore
added QmbFMke1KXqnYyBBWxB74N4c5SBnJMVAiMNRcGu6x1AwQH peerstore

# setar CID no cluster
ipfs-cluster-ctl pin add QmbFMke1KXqnYyBBWxB74N4c5SBnJMVAiMNRcGu6x1AwQH
QmbFMke1KXqnYyBBWxB74N4c5SBnJMVAiMNRcGu6x1AwQH:
    > cluster1             : CLUSTER_ERROR: context deadline exceeded | 2022-05-25T07:01:26.295752814Z | Attempts: 0 | Priority: false
    > cluster2             : PINNED | 2022-05-25T07:01:25Z | Attempts: 0 | Priority: false
    > cluster0             : PINNED | 2022-05-25T07:01:25Z | Attempts: 0 | Priority: false

# lista de pins
ipfs-cluster-ctl pin ls
QmbFMke1KXqnYyBBWxB74N4c5SBnJMVAiMNRcGu6x1AwQH |  | PIN | Repl. Factor: -1 | Allocations: [everywhere] | Recursive | Metadata: no | Exp: ∞ | Added: 2022-05-25 07:01:25

# estado do pin
ipfs-cluster-ctl status QmbFMke1KXqnYyBBWxB74N4c5SBnJMVAiMNRcGu6x1AwQH
QmbFMke1KXqnYyBBWxB74N4c5SBnJMVAiMNRcGu6x1AwQH:
    > cluster1             : CLUSTER_ERROR: context deadline exceeded | 2022-05-25T07:02:34.847996491Z | Attempts: 0 | Priority: false
    > cluster2             : PINNED | 2022-05-25T07:01:25Z | Attempts: 0 | Priority: false
    > cluster0             : PINNED | 2022-05-25T07:01:25Z | Attempts: 0 | Priority: false
Enter fullscreen mode Exit fullscreen mode

Referência

  1. https://rossbulat.medium.com/using-ipfs-cluster-service-for-global-ipfs-data-persistence-69a260a0711c
  2. https://medium.com/rahasak/ipfs-cluster-with-docker-db2ec20a6cc1
  3. https://labs.eleks.com/2019/03/ipfs-network-data-replication.html
  4. https://www.geekdecoder.com/setting-up-a-private-ipfs-network-with-ipfs-and-ipfs-cluster/
  5. https://developpaper.com/construction-of-ipfs-private-network-cluster/
  6. https://medium.com/towardsblockchain/setting-up-your-first-distributed-private-storage-network-on-ipfs-part-1-a6ff15222b90

Este artigo foi escrito por λ.eranga e traduzido por Marcelo Panegali. Você pode encontrar o original em inglês aqui.

Top comments (0)