blockchain - 概念,安装ipfs setup ipfs on linux server

访问量: 780

refer to: 
https://docs.ipfs.tech/how-to/

https://docs.ipfs.tech/install/server-infrastructure/#create-a-local-cluster

什么是IPFS?

ipfs: 是一个类似于 百度网盘一样的东西, 大家都可以上传文件。 全世界有好多个节点(例如100W个)。 东西存放在哪里,并不清楚,只要知道我们可以随时使用就可以了

https://cloudflare-ipfs.com/ipfs/

上面的网址,是一个专门查看IPFS资料的入口。

使用方式:
https://cloudflare-ipfs.com/ipfs/bafybeigsn4u4nv4uyskxhewakk5m2j2lluzhsbsayp76zh7nbqznrxwm7e/

入口 + ipfs_cid 方式,就可以查看了。例如:

安装 ipfs cluster

1. cd /opt/app

wget https://dist.ipfs.tech/ipfs-cluster-ctl/v1.0.2/ipfs-cluster-ctl_v1.0.2_linux-amd64.tar.gz

2. tar zxvf ipfs-cluster-ctl_v1.0.2_linux-amd64.tar.gz

ipfs-cluster-ctl/LICENSE
ipfs-cluster-ctl/LICENSE-APACHE
ipfs-cluster-ctl/LICENSE-MIT
ipfs-cluster-ctl/README.md
ipfs-cluster-ctl/ipfs-cluster-ctl

3. cd /opt/app/ipfs-cluster-ctl

wget https://raw.githubusercontent.com/ipfs/ipfs-cluster/v1.0.2/docker-compose.yml

建议跳过上面的wget方式,直接使用这个现成的yml:

version: '3.4'


services:

  ipfs0:
    container_name: ipfs0
    image: ipfs/go-ipfs:latest
    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:
      - ./compose/ipfs0:/data/ipfs

  cluster0:
    container_name: cluster0
    image: ipfs/ipfs-cluster:latest
    depends_on:
      - ipfs0
    environment:
      CLUSTER_PEERNAME: cluster0
      CLUSTER_SECRET: ${CLUSTER_SECRET} # From shell variable if set
      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:
          # Open API port (allows ipfs-cluster-ctl usage on host)
          - "127.0.0.1:9094:9094"
          # The cluster swarm port would need  to be exposed if this container
          # was to connect to cluster peers on other hosts.
          # But this is just a testing cluster.
          # - "9095:9095" # Cluster IPFS Proxy endpoint
          # - "9096:9096" # Cluster swarm endpoint
    volumes:
      - ./compose/cluster0:/data/ipfs-cluster

4. sudo docker-compose up

首次运行会报错,或者直接 docker-compose的output会退出(此时docker ps 还是能看到进程还在的)

不要紧。

sudo docker-compose down 之后,再 up 一下,就可以看到了:

cluster0    | 2022-09-03T09:58:53.726Z  INFO    crdt    go-ds-crdt@v0.3.6/set.go:122    Tombstones have bloomed: 0 tombs. Took: 1.206637ms
.....
ipfs2       | Swarm announcing /ip4/127.0.0.1/tcp/4001
ipfs2       | Swarm announcing /ip4/127.0.0.1/udp/4001/quic
ipfs2       | Swarm announcing /ip4/172.21.0.3/tcp/4001
ipfs2       | Swarm announcing /ip4/172.21.0.3/udp/4001/quic
ipfs2       | API server listening on /ip4/0.0.0.0/tcp/5001
ipfs2       | WebUI: http://0.0.0.0:5001/webui
ipfs2       | Gateway (readonly) server listening on /ip4/0.0.0.0/tcp/8080
ipfs2       | Daemon is ready

5. 测试一下:

./ipfs-cluster-ctl peers ls

12D3KooWJVr1aKmU63ZFyEr2NBbWDjfRfPLmXH6hYsEhd56qM1Gf | cluster0 | Sees 2 other peers
  > Addresses:
    - /ip4/127.0.0.1/tcp/9096/p2p/12D3KooWJVr1aKmU63ZFyEr2NBbWDjfRfPLmXH6hYsEhd56qM1Gf
    - /ip4/172.21.0.7/tcp/9096/p2p/12D3KooWJVr1aKmU63ZFyEr2NBbWDjfRfPLmXH6hYsEhd56qM1Gf
  > IPFS: 12D3KooWNYBzSDtPeQrdNMGdiYfzdCwCy15F8PVNNZ7P19VZgPgB
    - /ip4/127.0.0.1/tcp/4001/p2p/12D3KooWNYBzSDtPeQrdNMGdiYfzdCwCy15F8PVNNZ7P19VZgPgB
    - /ip4/127.0.0.1/udp/4001/quic/p2p/12D3KooWNYBzSDtPeQrdNMGdiYfzdCwCy15F8PVNNZ7P19VZgPgB
    - /ip4/145.40.96.233/tcp/4001/p2p/12D3KooWEGeZ19Q79NdzS6CJBoCwFZwujqi5hoK8BtRcLa48fJdu/p2p-circuit/p2p/12D3KooWNYBzSDtPeQrdNMGdiYfzdCwCy15F8PVNNZ7P19VZgPgB
    - /ip4/145.40.96.233/tcp/4002/ws/p2p/12D3KooWEGeZ19Q79NdzS6CJBoCwFZwujqi5hoK8BtRcLa48fJdu/p2p-circuit/p2p/12D3KooWNYBzSDtPeQrdNMGdiYfzdCwCy15F8PVNNZ7P19VZgPgB
    - /ip4/172.21.0.4/tcp/4001/p2p/12D3KooWNYBzSDtPeQrdNMGdiYfzdCwCy15F8PVNNZ7P19VZgPgB
    - /ip4/172.21.0.4/udp/4001/quic/p2p/12D3KooWNYBzSDtPeQrdNMGdiYfzdCwCy15F8PVNNZ7P19VZgPgB
    - /ip4/34.230.76.95/tcp/4001/p2p/12D3KooWGSTktoeDZ1u59v9aynwgUpipskYjXhW89jZTvTbL7NUy/p2p-circuit/p2p/12D3KooWNYBzSDtPeQrdNMGdiYfzdCwCy15F8PVNNZ7P19VZgPgB
    - /ip4/34.230.76.95/udp/4001/quic/p2p/12D3KooWGSTktoeDZ1u59v9aynwgUpipskYjXhW89jZTvTbL7NUy/p2p-circuit/p2p/12D3KooWNYBzSDtPeQrdNMGdiYfzdCwCy15F8PVNNZ7P19VZgPgB
    - /ip6/2604:1380:4601:bf00::3/tcp/4001/p2p/12D3KooWEGeZ19Q79NdzS6CJBoCwFZwujqi5hoK8BtRcLa48fJdu/p2p-circuit/p2p/12D3KooWNYBzSDtPeQrdNMGdiYfzdCwCy15F8PVNNZ7P19VZgPgB
    - /ip6/2604:1380:4601:bf00::3/tcp/4002/ws/p2p/12D3KooWEGeZ19Q79NdzS6CJBoCwFZwujqi5hoK8BtRcLa48fJdu/p2p-circuit/p2p/12D3KooWNYBzSDtPeQrdNMGdiYfzdCwCy15F8PVNNZ7P19VZgPgB
    - /ip6/64:ff9b::22e6:4c5f/tcp/4001/p2p/12D3KooWGSTktoeDZ1u59v9aynwgUpipskYjXhW89jZTvTbL7NUy/p2p-circuit/p2p/12D3KooWNYBzSDtPeQrdNMGdiYfzdCwCy15F8PVNNZ7P19VZgPgB
    - /ip6/64:ff9b::22e6:4c5f/udp/4001/quic/p2p/12D3KooWGSTktoeDZ1u59v9aynwgUpipskYjXhW89jZTvTbL7NUy/p2p-circuit/p2p/12D3KooWNYBzSDtPeQrdNMGdiYfzdCwCy15F8PVNNZ7P19VZgPgB

添加一个文件:

wget https://files.sweetysoft.com/image_after_2022_06_30/4390/cake.JPG

./ipfs-cluster-ctl add cake.JPG

added QmSkFCXoTamt9fJDxdiRU8EEsvBrT3zw8FFL5zvok2VyyB cake.JPG

./ipfs-cluster-ctl status

QmSkFCXoTamt9fJDxdiRU8EEsvBrT3zw8FFL5zvok2VyyB:
    > cluster1             : PINNED | 2022-09-03T10:07:35Z | Attempts: 0 | Priority: false
    > cluster2             : PINNED | 2022-09-03T10:07:35Z | Attempts: 0 | Priority: false
    > cluster0             : PINNED | 2022-09-03T10:07:35Z | Attempts: 0 | Priority: false

看一下docker ps :

CONTAINER ID   IMAGE                           COMMAND                  CREATED          STATUS                             PORTS                                         NAMES
38348ac7940c   ipfs/ipfs-cluster:latest        "/sbin/tini -- /usr/…"   11 minutes ago   Up 13 seconds                      127.0.0.1:9094->9094/tcp, 9095-9096/tcp       cluster0
899ceac01694   ipfs/ipfs-cluster:latest        "/sbin/tini -- /usr/…"   11 minutes ago   Up 14 seconds                      9094-9096/tcp                                 cluster2
9f7ceb813258   ipfs/ipfs-cluster:latest        "/sbin/tini -- /usr/…"   11 minutes ago   Up 13 seconds                      9094-9096/tcp                                 cluster1
5ea79f07e8f2   ipfs/go-ipfs:latest             "/sbin/tini -- /usr/…"   11 minutes ago   Up 14 seconds (health: starting)   4001/tcp, 5001/tcp, 8080-8081/tcp, 4001/udp   ipfs0
5c53d3ccbb18   ipfs/go-ipfs:latest             "/sbin/tini -- /usr/…"   11 minutes ago   Up 14 seconds (health: starting)   4001/tcp, 5001/tcp, 8080-8081/tcp, 4001/udp   ipfs1
d5d49cca892f   ipfs/go-ipfs:latest             "/sbin/tini -- /usr/…"   11 minutes ago   Up 15 seconds (health: starting)   4001/tcp, 5001/tcp, 8080-8081/tcp, 4001/udp   ipfs2

根据 docker log, 我们可以知道,有 ipfs cluster 运行在了docker 的 5001端口,该docker app映射到了 host 的9094, 9095, 9096端口。

所以我们访问:curl localhost:9094/webui
{"code":404,"message":"not found"}

就说明它一定是运行好了。

安装ipfs cli

wget https://dist.ipfs.tech/kubo/v0.15.0/kubo_v0.15.0_linux-amd64.tar.gz

tar zxvf kubo_v0.15.0_linux-amd64.tar.gz kubo/

cd kubo/
sudo bash install.sh

ipfs gateway

gateway会自动的跑起来。跑在本地的8080端口

ipfs init

generating ED25519 keypair...done
peer identity: 12D3KooWAGyrZSCiGpVqPEH5tBAt8opu7rXhJWnkYMsxbzUo1xTc
initializing IPFS node at /home/ubuntu/.ipfs

ipfs add cat.jpg

added QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR cat.jpg
 116.96 KiB / 116.96 KiB [=========================================================================================================================================================] 100.00%

然后就可以在浏览器中查看了:

ipfs 文件的类型:

如何根据CID查看IPFS的文件夹结构:

curl -s "https://ipfsgate.test-ddns.com/api/v0/ls?arg=bafybeigsn4u4nv4uyskxhewakk5m2j2lluzhsbsayp76zh7nbqznrxwm7e"
或者:
curl -s "https://ipfsgate.test-ddns.com/api/v0/ls?arg=QmbKu58pyq3WRgWNDv9Zat39QzB7jpzgZ2iSzaXjwas4MB"

得到结果:

{
    "Objects":[
        {
            "Hash":"bafybeigsn4u4nv4uyskxhewakk5m2j2lluzhsbsayp76zh7nbqznrxwm7e",
            "Links":[
                {
                    "Name":"categories",
                    "Hash":"QmWs7KxQFETtzxvVqgPdBD3XodKZ8bCbwfveSJ1wpiChDp",
                    "Size":0,
                    "Type":1,   //  这个 Type 就是对应了下面的 文件夹
                    "Target":""
                },
                {
                    "Name":"css",
                    "Hash":"QmNTP17BS7AEHn4TuiyKYtKq1StCMxxXRSt4gpiTdyuHRB",
                    "Size":0,
                    "Type":1,
                    "Target":""
                },
                {
                    "Name":"feed.xml",
                    "Hash":"QmZtRErKnWkENDUUx6raBHteNfwm4NMyBpYGkzbpx2f92C",
                    "Size":26633,
                    "Type":2,
                    "Target":""
                },
                {
                    "Name":"general",
                    "Hash":"QmanyNmB6wGyiJzqSgFqtA7baHqkWyR7FWKy4oh8K6usD7",
                    "Size":0,
                    "Type":1,
                    "Target":""
                },
                {
                    "Name":"images",
                    "Hash":"QmUukvFKSdC867HJpgdiNiS9nWEvnJ2RAsjHKGJGzU6wYp",
                    "Size":0,
                    "Type":1,
                    "Target":""
                },
                {
                    "Name":"index.html",
                    "Hash":"QmQvB7Y3LkjWLdKEfT8ojLeKhLpfwV4NPNDrGGvnzMjedE",
                    "Size":23258,
                    "Type":2,
                    "Target":""
                },
                {
                    "Name":"scripts",
                    "Hash":"QmRyoGE1B1NvhqKX6Vjs7dH7skDd85hgoKoSDFYMhVSn4D",
                    "Size":0,
                    "Type":1,
                    "Target":""
                }
            ]
        }
    ]
}

Type 的含义: 
    enum DataType {
        Raw = 0;
        Directory = 1;
        File = 2;
        Metadata = 3;
        Symlink = 4;
        HAMTShard = 5;
    }

订阅/RSS Feed

Subscribe