基于docker compose配置ipfs私有化网络


IPFS(InterPlanetary File System)是一个点对点的分布式文件系统。它的设计目标是创建一个更加开放、自由且高效的互联网。IPFS的核心思想是取代传统的基于位置的文件寻址(如HTTP)为基于内容的寻址。简而言之,IPFS允许你根据文件的内容而不是位置来定位它。

虽然IPFS在初始设置中通常直接连接到公共网络,但其灵活性允许用户根据特定需求进行个性化配置,以便支持私有网络的部署。这意味着用户可以通过调整设置,将IPFS节点集成到内部网络环境中,确保数据的私密性和访问受限于特定的受信任网络。这种配置的灵活性使得IPFS能够适应各种使用场景,从而更好地满足用户对于数据安全和隐私控制的需求。

生成swarm key文件

swarm key 在 IPFS Swarm 中扮演着重要的角色。Swarm 是 IPFS 网络中节点之间进行通信的组件,负责数据的传输和节点之间的协调。swarm.key 文件包含了用于加密和验证 Swarm 中通信的密钥,起到保障通信安全性的作用。

具体来说,swarm.key 的作用有以下几个方面:

  1. 身份验证: swarm.key 中的密钥用于验证节点之间的通信,确保通信是安全可信的。只有具有正确密钥的节点才能在 Swarm 中交换信息,防止未经授权的访问和潜在的安全风险。

  2. 加密通信: swarm.key 中包含的密钥用于加密在 Swarm 中传输的数据。这有助于防止中间人攻击和数据窃听,提高通信的机密性。

  3. 网络隔离: 使用 swarm.key 有助于隔离不同的 IPFS 网络。每个网络都可以拥有独特的 swarm.key,确保在不同网络之间的节点通信受到正确的密钥控制,从而实现网络隔离。

  4. 防止连接到不受信任的节点: swarm.key 可以确保节点只连接到具有相同密钥的其他受信任节点,防止节点误连接到不受信任或恶意节点,提高网络的安全性。

在私有化部署或需要网络隔离的情况下,可以定制生成 swarm.key,确保网络的安全性和合规性。

安装ipfs-swarm-key-gen,在任何有golang环境的机器上执行:

go install github.com/Kubuxu/go-ipfs-swarm-key-gen/ipfs-swarm-key-gen

生成swarm.key文件,在当前目录下执行

ipfs-swarm-key-gen > ./ipfs-init/swarm.key

swarm.key的内容大致如下:

/key/swarm/psk/1.0.0/
/base16/
2ef3be03d616aba1b6bccb4177c6c03168fcbcd17ab6e547d3dcbedf616fda54

基于docker配置

使用docker配置ipfs,本示例中需要配置几个文件:

  1. 环境变量.env: docker-compose环境变量文件
  2. docker-compose.yml: docker compose 配置文件
  3. 初始化脚本./ipfs-init/init.sh: ipfs容器初始化脚本
  4. 可视化界面webui.car: ipfs界面文件

环境变量

LIBP2P_FORCE_PNET=1
IPFS_SWARM_KEY="/key/swarm/psk/1.0.0/\n/base16/\n2ef3be03d616aba1b6bccb4177c6c03168fcbcd17ab6e547d3dcbedf616fda54"
IPFS_BOOTSTRAP=/ip4/192.168.1.152/tcp/4001/p2p/12D3KooWLGcT1EreBaB2UBDiwZRhhVAgrcR1YFtfDjzWKrx4RmYw
API_ALLOW_ORIGIN='["http://localhost:3000","http://127.0.0.1:5001","https://webui.ipfs.io"]'
API_ALLOW_METHOD='["PUT","POST"]'

KUBO_VERSION=latest
KUBO_SWARM_PORT=4002
KUBO_RPC_PORT=127.0.0.1:5002
KUBO_GATEWAY_PORT=9181
KUBO_INIT_SHELL=./ipfs-init/init.sh

CLUSTER_VERSION=latest
CLUSTER_SECRET=''
CLUSTER_PORT=9094

将swarm.key的内容复制并粘贴至.env文件中的IPFS_SWARM_KEY变量中。回车换行符用"\n"替换。

使用 LIBP2P_FORCE_PNET=1 的环境变量设置 ipfs 运行在私有网络模式中。

init.sh

初始化脚本init.sh中填充以下内容,初始化脚本删除了预设的bootstrap节点,并添加了本地的bootstrap节点。本地的bootstrap节点也没有特殊要求,就是一个正常的ipfs节点,当然也是开了私有网络模式。

如果不需要webui可以去掉ipfs dag import /data/ipfs-init/webui.car这一行。

#!/bin/sh
set -ex
# ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin ${API_ALLOW_ORIGIN}
# ipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods ${API_ALLOW_METHOD}

ipfs bootstrap rm all
ipfs bootstrap add ${IPFS_BOOTSTRAP}
ipfs dag import /data/ipfs-init/webui.car

docker-compose.yml

docker-compose配置文件,docker-compose.yml文件中填充以下内容:

version: '3.4'

services:
  ipfs0:
    container_name: ipfs0
    image: ipfs/kubo:${KUBO_VERSION}
    restart: always
    ports:
      - "${KUBO_SWARM_PORT}:4001" 
      - "${KUBO_RPC_PORT}:5001" 
      - "${KUBO_GATEWAY_PORT}:8080"
    volumes:
      - ./compose/ipfs0:/data/ipfs
      - ${KUBO_INIT_SHELL}:/container-init.d/init.sh
      - ./ipfs-init:/data/ipfs-init
    environment: 
      # - IPFS_SWARM_KEY_FILE=/root/.ipfs/swarm.key
      - "IPFS_SWARM_KEY=${IPFS_SWARM_KEY}"
      - "LIBP2P_FORCE_PNET=${LIBP2P_FORCE_PNET}"
      - "IPFS_BOOTSTRAP=${IPFS_BOOTSTRAP}"
      - "API_ALLOW_ORIGIN=${API_ALLOW_ORIGIN}"
      - "API_ALLOW_METHOD=${API_ALLOW_METHOD}"
  cluster0:
    container_name: cluster0
    image: ipfs/ipfs-cluster:${CLUSTER_VERSION}
    restart: always
    depends_on:
      - ipfs0
    environment:
      CLUSTER_PEERNAME: cluster0
      CLUSTER_SECRET: ${CLUSTER_SECRET} 
      CLUSTER_IPFSHTTP_NODEMULTIADDRESS: /dns4/ipfs0/tcp/5001
      CLUSTER_CRDT_TRUSTEDPEERS: '*' 
      CLUSTER_RESTAPI_HTTPLISTENMULTIADDRESS: /ip4/0.0.0.0/tcp/9094 
      CLUSTER_MONITORPINGINTERVAL: 2s 
    ports:
          - "${CLUSTER_PORT}:9094"
    volumes:
      - ./compose/cluster0:/data/ipfs-cluster

获取webui.car并导入私有网络。

在公共网络中,ipfs节点的webui可以自动下载并打开。但是搭建私有节点时,直接访问http://127.0.0.1:5001/webui将无法正常打开。需要手动将前端文件导出使用。

【注意】 在这个示例里,把webui.car文件放置在ipfs-init目录中即可。

首先,开启一个临时的公网节点。在公网节点上下载webui的数据:

ipfs dag export bafybeiamycmd52xvg6k3nzr6z3n33de6a2teyhquhj4kspdtnvetnkrfim > webui.car

然后,将上面上面保存下来的文件导入私有网络节点中:

ipfs dag import webui.car

基于ipfs分布式的特性,这个webui.car文件只需要在一个节点中导入,其他所有连接到网络的节点都可以打开使用。

前面命令中的bafybeiamycmd52xvg6k3nzr6z3n33de6a2teyhquhj4kspdtnvetnkrfim是webui对应的id。
可以在kubo的源码中查看webui.go

或者用curl访问:

curl http://127.0.0.1:5001/webui/

会看到:

<a href="/ipfs/bafybeiamycmd52xvg6k3nzr6z3n33de6a2teyhquhj4kspdtnvetnkrfim">Found</a>.

通过上述配置的完成,我们成功地实施了 IPFS 的私有化部署,现在已经可以开始充分利用该系统。这意味着我们的 IPFS 节点已经按照特定需求进行了定制,适应了我们内部网络的安全性和隐私要求。现在,可以放心地开始使用 IPFS,享受其分布式文件系统和去中心化数据存储的优势,同时保持对数据的控制和安全性。

Archives