V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kiduu
V2EX  ›  IPFS

搭建一个国内高可用的 IPFS 网关节点,打造去中心化无限存储节点(理论)

  •  
  •   kiduu · 2022-10-07 15:44:02 +08:00 · 6189 次点击
    这是一个创建于 815 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前言

    首先介绍一下 IPFS (InterPlanetary File System)中文称为星际文件系统,是一个旨在实现文件的分布式存储、共享和持久化的网络传输协议。

    IPFS 是 WEB 3.0 时代的基石之一,作为一个有着悠久历史的开源分布式存储系统,有着最为广泛的 web 3.0 的应用。我们可以通过 IPFS 的客户端或者 IPFS 网关来访问存在于该系统上的文件。也可以通过主动的分享自己的文件将文件分发至全世界。当你使用 IPFS 时你可以通过客户端利用 P2P 网络进行文件传输,如果有人不知道 IPFS 或者没有条件的情况下也可以采用传统的 HTTP 服务通过其他人公开提供的网关来获取你想要的内容。而这种模式就是我们今天要说的 IPFS gateway (网关)。

    目前 IPFS 的网关大多数都是国外节点,国内用户使用极其困难。你可以通过公关网关查询网页查看当前可用的公开网关。

    IPFS 公开网关查询: https://ipfs.github.io/public-gateway-checker/

    你可以在其中挑选一个适合自己的网关进行使用。不过就我个人而言大部分网关的国内连接质量都令人捉急。所以今天我给大家带来如何在境内搭建一个自己的网关。

    IPFS 官网:ipfs.tech|ipfs.io

    简介

    先简单说一下 IPFS 网关的工作原理,IPFS 本身是一个 P2P 的文件传输系统,网关则是其提供的通俗易用的一个功能,可以让人通过 http 访问 IPFS 系统上的内容。当我们使用网关访问一个 IPFS 上的数据时,服务器后台之中的 IPFS 节点服务首先会在本地搜索是否有该数据,如果没有就去给连接的其他 IPFS 节点发送该数据的 CID 数据,其他节点有的话就会先拉取到本地节点然后再通过网关来提供给用户。你可以将 IPFS 网关看成是 BT 客户端的提供的 Web 服务器。

    简单了解 IPFS 网关的功能之后我们来自建一个试试看

    搭建 IPFS 网关

    IPFS 节点部署

    你可以部署多个节点,每个节点数据可以不同也可以相同,看你需要什么效果。我这里用腾讯云的境内轻量服务器做演示。如果是面对境外服务其实可以直接用上面提到的公开的网关。境内因为带宽价格昂贵所以几乎不存在公开的网关。

    服务器配置

    由于 IPFS 存储时会把数据切分成 1MB 或者更小的数据块,每个数据块都会分配一个 CID (content identifier)。读写这些数据的时候还需要对数据进行处理所以服务器 CPU 不能太弱鸡,最起码也得是 2C 起步,内存不得低于 2GB 。我这里作为演示的机器为 2C4G 。至于硬盘大小的话就得看你自己需要存储的数据了。一般服务的话可以大致估算一下一个月内的常用数据有多少,比方说我是存图片,每个月大概 10GB 的新图还有 5 个 GB 的热门访问图片,那么我硬盘大小只要超过( 10+5 )/0.7=21.4GB 就差不多够用了。其他数据你可以继续放硬盘也可以定期存储到 filecoin 链上,只需要一点 FIL 作为交易的 gas 费即可(目前有很多免费提供存储提供商)。至于本地存储的数据如果超过我们给的限定就会删除掉部分冷门数据以腾出空间。

    我准备的是 2C4G6M 的腾讯云轻量。

    镜像选择的是宝塔。

    购买完成之后我们需要开放一些 IPFS 需要用到的端口 8080 端口(默认网关端口) 4001 (节点通信端口) 5001 ( API 节点)

    进入服务器控制台选择防火墙-添加规则

    UDP 这几个端口可开可不开。如果经常连接其他节点和其他节点互通数据建议 UDP 协议也打开。

    如果有大量数据存储需求可以买额外的云硬盘然后通过控制台挂载到服务器上后面 IPFS 初始化的时候要注意一下先设置环境变量。不然 IPFS 初始化之后会默认配置在系统盘。读写数据全放系统盘很容易占满。

    IPFS 初始化

    官方教程地址: https://docs.ipfs.tech/install/command-line/#official-distributions

    1 、下载安装服务

    1.1 、下载压缩包(选择合适的下载源)

    wget https://dist.ipfs.tech/kubo/v0.15.0/kubo_v0.15.0_linux-amd64.tar.gz (官网)
    wget https://github.com/ipfs/kubo/releases/download/v0.15.0/kubo_v0.15.0_linux-amd64.tar.gz ( GitHub )
    wget https://ghproxy.com/https://github.com/ipfs/kubo/releases/download/v0.15.0/kubo_v0.15.0_linux-amd64.tar.gz ( GitHub 下载加速服务适合国内)
    

    1.2 、解压

    tar -xvzf kubo_v0.15.0_linux-amd64.tar.gz
    

    1.3 、进入kubo文件夹并如下安装脚本

    cd kubo
    bash install.sh
    

    1.4 、测试 IPFS 是否正确安装

    ipfs --version
    

    这样就是安装完成了。

    2 、初始化配置

    2.1 、设置环境变量并初始化

    如果你直接初始化的话 IPFS 会直接在当前用户文件夹下生成一个./ipfs隐藏文件夹。

    如果你想初始化在其他指定硬盘 /文件夹就需要先设置环境变量再初始化

    假设我们要设置的目录为/root/ipfs

    先创建文件夹

    mkdir /root/ipfs
    

    设置环境变量并初始化

    export IPFS_PATH=/root/ipfs
    ipfs init
    

    这样就是初始化配置成功了。

    3 、快速开始

    3.1 、查看说明

    ipfs cat /ipfs/QmQPeNsJPyVWPFDVHb77w8G42Fvo15z4bG2X8D2GhfbSXc/readme
    

    3.2 基础功能

    3.2.1 添加文件 /文件夹

    ipfs add filename (添加文件至 ipfs 节点)
    ipfs add -r dir (添加文件夹至 ipfs 节点)
    

    我一共添加了三个文件分别是 1.png 1.mp4 1.txt 图片、视频、文档都有,返回的 Qm 开头的就是文件的 CID ,我们后面用网关访问就需要用到 CID 了。

    如图所示添加相同文件 CID 的不变,文件夹内每个文件都有单独的 CID ,文件夹本身也有个 CID 并保持了原有的结构。

    root@VM-8-14-debian:~/testdata# ipfs add -r data
    added QmZ8dHcccdqNBNgEHKnSMCVjAAhLc293tmhDZZcptfF5eD data/1.mp4
    added Qmf7MKAKynNNt12EZyBNFWhvDn39y2P8pZ9tAaEtDRVZ1f data/1.png
    added QmYWAifyw2V5dEq7c5GgdSPffeKoYXQZggnYzw5RbXpig4 data/1.txt
    added Qme6r14w9pyGrjMU9UUzkNAuSmCY3d1svZtvNRfyyhNHFL data
    

    3.2.2 读取数据

    命令行下只能读取文本数据,我们以上面的 1.txt 为例

    ipfs cat QmYWAifyw2V5dEq7c5GgdSPffeKoYXQZggnYzw5RbXpig4
    

    3.2.3 长期保存某数据

    根据 IPFS 的设置如果超过设置容量的阈值就会自动删除部分冷门数据,所以如果想长期保存某些数据还需要进行额外操作。

    ipfs pin add CID ( pin 文件至本地存储)
    ipfs pin ls [CID] (列出所有文件 /有 CID 参数时列出该文件状态)
    

    3.2.4 、删除数据

    ipfs pin rm CID
    

    这个没啥好说的。

    更多其他的命令可以自行探索

    IPFS 网关部署

    启动 IPFS

    建议先安装 screen ,在 screen session 里执行,这个命令不能直接后台运行,这也算是比较蛋疼的一点。

    # 安装 screen
    apt install screen -y (ubuntu/debian)
    yum install screen -y (centos)
    # 用 screen 新建一个 session
    screen -R ipfs
    # 开启 ipfs
    ipfs daemon
    

    然后 Ctrl +A ,Ctrl +D 挂起 screen 即可

    这样就是成功启动了。但是目前还不能直接通过 IP 访问,我们可以进行反代或者直接修改配置文件,由于服务器安全性问题,这里我建议直接反向代理,不要修改配置。

    公网访问网关

    1 、反向代理

    反向代理也没啥好说的,解析域名到服务器 IP ,然后先申请 SSL 证书然后再开启反向代理,把网关地址 127.0.0.1:8080 反向代理即可。

    然后直接访问域名 /ipfs/CID 即可

    如我想访问上面添加的 data 文件夹,它的 CID 为:Qme6r14w9pyGrjMU9UUzkNAuSmCY3d1svZtvNRfyyhNHFL 。假设我的域名是 ipfs.2demo.top 则访问 https://ipfs.2demo.top/ipfs/Qme6r14w9pyGrjMU9UUzkNAuSmCY3d1svZtvNRfyyhNHFL

    这样你就成功搭建了一个境内可用的 IPFS 网关了。

    2 、修改配置

    如果你只开放网关的话只要修改配置里的 Address.Gateway ,如果你要用图形界面( webui )还需要修改 Address.API 和 API.HTTPHeaders

    一个修改为 0.0.0.0 ,一个修改为服务器内网 IP (没有内网 IP 就用公网 IP )就行

    要用 webui 可以先进入 IP:5001/webui 会自动弹出来一个修改配置的命令,复制粘贴然后重启 ipfs 即可

    复制 2 之中的命令到服务器运行一下然后重启 ipfs 之后就会显示已连接 IPFS 了

    你可以查看 ipfs 节点状态,文件,节点连接情况等。不过还是不建议公开 webui ,没有鉴权很容易导致别人乱存东西。

    安装到服务

    创建文件 /etc/systemd/system/ipfs.service 写入

    [Unit]
    Description=IPFS Daemon
    After=syslog.target network.target remote-fs.target nss-lookup.target
    [Service]
    Type=simple
    ExecStart=/usr/local/bin/ipfs daemon --enable-namesys-pubsub
    User=milton
    [Install]
    WantedBy=multi-user.target
    

    然后通过 systemctl 添加

    systemctl daemon-reload
    systemctl enable ipfs
    systemctl start ipfs
    systemctl status ipfs
    

    修改存储空间限制

    可以通过修改 Datastore.StorageMax 来限制 ipfs 占用的硬盘空间大小,默认是 10GB

    无限存储

    无限存储有点夸张了,但是有这个思路就行,我自己的话已经存了 2 个 TB 的数据到 filecoin 的存储提供商了,对于新手可以去 GitHub:lotus,研究一下怎么用这个,只想存数据可以直接看这个:store-data,每个月能领 30GB 的 datacap ,特别大的数据存储直接去申请就行,一般审核都不会太严。这里不对这方面多做叙述,只能把思路告诉大家。不然怕蝗虫过境。

    结语

    ipfs 作为一个分布式存储可以说是自一开始就很有话题性,我们可以轻松的通过一个节点连接到全球,获取全球的数据,或者分发数据。需要注意的是如果你的数据被其他节点保存之后,你再删除自己节点内的数据也是无效的,其他人仍然能够通过其他节点访问该数据。反之,如果一份数据所存在的节点全都下线了或者删除了该数据那么也无法访问到该数据了。

    尽管国内很多宣传 ipfs 服务的都说存上去就是去中心化了就永久保存了。这都是屁话,重要数据建议多备份,私密数据可以先加密再上传。我之所以用 IPFS 是因为我可以白嫖 filecoin 那些存储,只要我定期存一次数据就能直接不受限于我的服务器硬盘了。相对而言如果访问量高的话会导致带宽占用过多,从其他节点获取数据会让 CPU 保持一个较高的负载。但是我用的轻量服务器,提供的服务也偏向于冷存储,上传带宽远小于下载带宽,本身也不是为了高并发去的,所以无所谓。要想体验好还是建议选个大点的硬盘,能够尽量存储更多的热门数据,部分低访问的数据存在其他节点即可。

    第 1 条附言  ·  2022-10-08 16:58:08 +08:00
    建立一个去中心化存储节点,体验 WEB3 时代福利
    15 条回复    2024-03-11 23:09:59 +08:00
    bhy
        1
    bhy  
       2022-10-07 17:38:19 +08:00   ❤️ 1
    存 2TB 多少钱?
    kiduu
        2
    kiduu  
    OP
       2022-10-08 00:45:28 +08:00
    @bhy 我没花钱,之前薅了几个 1TB 的 web3.storage 账号,不过现在收费了。有 180 天以上的 github 可以去 filecoin-plus 直接申请 32GB (每 30 天都可以再次申请叠加)的 datacap 然后用 lotus 加一点点 FIL 币做 gas 费,定期将数据上传到那些矿工那(注意要选 0 费用的)。要更多的 datacap 可以直接去向那些大矿工申请(几百 G-几百 T )。总的来说想要白嫖还是可以的。web3 虽然对我来说没啥卵用,但是仔细研究还是有不少薅羊毛的机会的。
    Maxwe11
        3
    Maxwe11  
       2022-10-09 16:11:04 +08:00
    感谢,已收藏,准备在自己服务器上试试看
    flypanda
        4
    flypanda  
       2022-10-25 14:08:20 +08:00
    真好啊...
    话说刚才看了一下 公共 IPFS 网关,发现 dweb.link 这个网关没被墙
    kiduu
        5
    kiduu  
    OP
       2022-10-25 18:55:24 +08:00
    @flypanda 额,这个还不如直接墙了算了。开代理都慢的要死
    flypanda
        6
    flypanda  
       2022-10-25 21:15:55 +08:00
    @kiduu 确实。俺也是贼慢。话说你在自搭建节点的时候,HTTPS 的域名 备案啥的有做吗?有没有封端口的情况发生
    kiduu
        7
    kiduu  
    OP
       2022-10-26 08:23:49 +08:00
    @flypanda 我主力是海外独服,然后国内有个备案的轻量从海外机那里拉数据。https 肯定开了的,就和正常网站一样,就是要注意盗链问题
    Joker123456789
        8
    Joker123456789  
       2022-10-28 16:47:30 +08:00
    最好写个客户端 做加解密, 不然你存里面的数据 全都是公开的
    kiduu
        9
    kiduu  
    OP
       2022-10-29 06:30:33 +08:00
    @Joker123456789 有这个功能的,只不过放里面的都是公开数据,无所谓,也可以当一种防盗链思路吧。
    vbe
        10
    vbe  
       2022-11-04 12:35:11 +08:00
    ipfs 不实用
    kiduu
        11
    kiduu  
    OP
       2022-11-05 10:59:20 +08:00
    @vbe 和对象存储相比确实不怎么实用,但是只要你有路子白嫖存储空间,那是真的香
    fc021
        12
    fc021  
       2023-03-18 20:48:54 +08:00
    大佬 filecoin-plus 申请的存储 怎么将 ipfs 文件存上去啊
    kiduu
        13
    kiduu  
    OP
       2023-03-18 23:14:51 +08:00
    @fc021 直接网页里把文件的 CID ,申请 pin 就行。等存储商拉取并存储成功就行
    cirenbucunzai
        14
    cirenbucunzai  
       2023-04-08 12:04:47 +08:00
    其实内网搞一个自用也是可以的,需要用的时候反代出去
    edgeedge
        15
    edgeedge  
       294 天前
    国内使用这些 filecoin 服务(存取数据)不知道速度怎么?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1177 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 18:14 · PVG 02:14 · LAX 10:14 · JFK 13:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.