# IPFS搭建私有网络与使用

By [sixdays](https://paragraph.com/@sixdays) · 2022-02-08

---

在联盟链的场景下，IPFS作为去中心化存储的首选方案，本文将介绍如何使用go-ipfs搭建一个私有网络并进行简单使用。

一、我的环境
======

由于资源限制，我这里使用docker来搭建一个两个节点的IPFS私有网络。如果有条件可以直接在多台机器或者多个虚拟机上安装。

二、开始搭建
======

1、生成swarm.key
-------------

swarm.key是一个共享密钥，只有拥有相同密钥的节点才能互相通信，组成一个私钥网络。 swarm.key可以使用[https://github.com/Kubuxu/go-ipfs-swarm-key-gen](https://github.com/Kubuxu/go-ipfs-swarm-key-gen)工具生成，工具的安装命令是：

    go get -u github.com/Kubuxu/go-ipfs-swarm-key-gen/ipfs-swarm-key-gen
    

安装完成后，生成swarm.key，命令是：

    ipfs-swarm-key-gen > /Users/sixdays/tmp/ipfs/swarm.key
    

其中

*   `/Users/sixdays/tmp/ipfs/`目录是我ipfs目录。
    
*   `/Users/sixdays/tmp/ipfs/node1`是我ipfs 节点1目录。
    
*   `/Users/sixdays/tmp/ipfs/node2`是我ipfs 节点2目录。
    

2、启动节点
------

### 2.2.1 运行节点1和节点2

    // 运行节点1
    docker run -d --name ipfs_node_1 -e IPFS_SWARM_KEY_FILE=/Users/sixdays/tmp/ipfs/swarm.key -v /Users/sixdays/tmp/ipfs/node1/staging:/export -v /Users/sixdays/tmp/ipfs/node1/data:/data/ipfs -p 4001:4001 -p 4001:4001/udp -p 127.0.0.1:8080:8080 -p 127.0.0.1:5001:5001 ipfs/go-ipfs:latest
    
    // 运行节点2
    docker run -d --name ipfs_node_2  -e IPFS_SWARM_KEY_FILE=/Users/sixdays/tmp/ipfs/swarm.key -v /Users/sixdays/tmp/ipfs/node2/staging:/export -v /Users/sixdays/tmp/ipfs/node2/data:/data/ipfs -p 4002:4001 -p 4002:4001/udp -p 127.0.0.1:8081:8080 -p 127.0.0.1:5002:5001 ipfs/go-ipfs:latest
    

### 2.2.2 清除所有缺省启动节点bootstrap

    docker exec ipfs_node_1 ipfs bootstrap rm all
    docker exec ipfs_node_2 ipfs bootstrap rm all
    

### 2.2.3 查看节点id

    docker exec ipfs_node_1 ipfs id
    docker exec ipfs_node_2 ipfs id
    

这里，我节点1的Id是:`12D3KooWEVo8FqH8YUT1noXvca5hgSRWBRcDQomEcFY2zXwA7dbw` 节点1的address是： `/ip4/172.17.0.3/tcp/4001/p2p/12D3KooWEVo8FqH8YUT1noXvca5hgSRWBRcDQomEcFY2zXwA7dbw`

节点2的Id是`12D3KooWRcx6gpbsbvb6YiNsDpJgnmNHFCgCiUmVF42o4zn2W5Pj` 节点2的address是`/ip4/172.17.0.4/tcp/4001/p2p/12D3KooWRcx6gpbsbvb6YiNsDpJgnmNHFCgCiUmVF42o4zn2W5Pj`

节点的address我用的是docker给分配的ip地址。

### 2.2.4 添加节点id

在节点1中添加节点2地址

    docker exec ipfs_node_1 ipfs bootstrap add  /ip4/172.17.0.4/tcp/4001/p2p/12D3KooWRcx6gpbsbvb6YiNsDpJgnmNHFCgCiUmVF42o4zn2W5Pj
    

在节点2中添加节点1地址

    docker exec ipfs_node_1 ipfs bootstrap add  /ip4/172.17.0.3/tcp/4001/p2p/12D3KooWEVo8FqH8YUT1noXvca5hgSRWBRcDQomEcFY2zXwA7dbw
    

至此，我们2个节点的IPFS私有网络已搭建完成。

三、用一下
=====

使用命令

    docker exec ipfs_node_1 ipfs -h
    

可以看到IPFS的基础命令。

3.1 添加文件 add
------------

    $ docker exec ipfs_node_1 ipfs add /data/ipfs/swarm.key                                                                                                                  
    added QmRitSEMhFJtNhLYtwGRJvhDrTTT4gQLjuLepZjo9C8a2X swarm.key
    

其中:

*   /data/ipfs/swarm.key为ipfs\_node\_1容器的目录。
    
*   QmRitSEMhFJtNhLYtwGRJvhDrTTT4gQLjuLepZjo9C8a2X 为文件hash
    

3.2 查看文件 cat
------------

    $ docker exec ipfs_node_2 ipfs cat QmRitSEMhFJtNhLYtwGRJvhDrTTT4gQLjuLepZjo9C8a2X 
    /key/swarm/psk/1.0.0/
    /base16/
    5b9941085678c502b44cc98e2614dd648cb801115dcb6acee8e83d9bf8cf454c
    

可以看到我们可以在node2中查看到node1上传的文件内容。

3.3 下载文件 get
------------

    $ docker exec ipfs_node_2 ipfs get QmRitSEMhFJtNhLYtwGRJvhDrTTT4gQLjuLepZjo9C8a2X -o /data/ipfs/test.key
    Saving file(s) to /data/ipfs/test.key
     95 B / 95 B  100.00% 0s
    

其中 -o表示输出目录，docker容器中的/data/ipfs对应我们主机目录为/Users/sixdays/tmp/ipfs/node2/data

3.4 查看文件列表 ls
-------------

    $ docker exec ipfs_node_2 ipfs pin ls
    QmQ5vhrL7uv6tuoN9KeVBwd4PwfQkXdVVmDLUZuTNxqgvm indirect
    QmU5k7ter3RdjZXu3sHghsga1UQtrztnQxmTL22nPnsu3g indirect
    QmYCvbfNbCwFR45HiNP45rwJgvatpiW38D961L5qAhUM5Y indirect
    QmejvEPop4D7YUadeGqYWmZxHhLc4JBUCzJJHWMzdcMe2y indirect
    QmPZ9gcCEpqKTo6aq61g2nXGUhM4iCL3ewB6LDXZCtioEB indirect
    QmQGiYLVAdSHJQKYFRTJZMG4BXBHqKperaZtyKGmCRLmsF indirect
    QmQPeNsJPyVWPFDVHb77w8G42Fvo15z4bG2X8D2GhfbSXc recursive
    QmQy6xmJhrcC5QLboAcGFcAE1tC8CrwDVkrHdEYJkLscrQ indirect
    QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn recursive
    

其中 recursive表示文件夹，indirect表示文件

四、参考
====

*   go-ipfs： [https://github.com/ipfs/go-ipfs](https://github.com/ipfs/go-ipfs)
    
*   ipfs-swarm-key-gen：[https://github.com/Kubuxu/go-ipfs-swarm-key-gen](https://github.com/Kubuxu/go-ipfs-swarm-key-gen)
    
*   ipfs文档：[https://www.jianshu.com/p/e38d5f733c81](https://www.jianshu.com/p/e38d5f733c81)

---

*Originally published on [sixdays](https://paragraph.com/@sixdays/ipfs)*
