将博客部署到星际文件系统(IPFS) - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
liudon
V2EX    程序员

将博客部署到星际文件系统(IPFS)

  •  1
     
  •   liudon 2023-02-23 20:48:52 +08:00 4254 次点击
    这是一个创建于 959 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    照惯例,先上演示.访问我的 IPFS 博客

    欢迎各位 pin 我的博客, ipfs pin add /ipns/liudon.xyz

    curl 'https://liudon.xyz' -I HTTP/2 200 date: Tue, 21 Feb 2023 23:59:18 GMT content-type: text/html vary: Accept-Encoding access-control-allow-methods: GET access-control-allow-methods: GET, POST, OPTIONS last-modified: Tue, 21 Feb 2023 23:59:18 GMT x-ipfs-gateway-host: ipfs-bank1-sv15 x-ipfs-path: /ipns/liudon.xyz/ x-ipfs-roots: Qmd4pnpUj8CaLKoVMJNHJyrqwWVa4wvz1qKxZsU9vKgErL x-ipfs-pop: ipfs-bank1-sv15 timing-allow-origin: * access-control-allow-origin: * access-control-allow-headers: X-Requested-With, Range, Content-Range, X-Chunked-Output, X-Stream-Output access-control-expose-headers: Content-Range, X-Chunked-Output, X-Stream-Output x-ipfs-lb-pop: gateway-bank1-sv15 x-proxy-cache: MISS cf-cache-status: DYNAMIC report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=FLcvWgtngoLuGZkl9jYsviSoOlSoE2Y0rKxI3bgNaKRxhNOrIm6nozqVzndav3%2B9QrvvcJ5GNmC11JBlN8tiigbF9CWPW33TbnLKyfdeblOcEhmZINTcC%2BJ6xhKs"}],"group":"cf-nel","max_age":604800} nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800} server: cloudflare cf-ray: 79d36f598970531f-LAX alt-svc: h3=":443"; ma=86400, h3-29=":443"; ma=86400 

    准备工作:

    1. Cloudflare 帐号
    2. 一台 VPS 主机,我用到腾讯云 lighthouse 主机 2 核 2G
    3. 一个域名

    方案介绍:

    实现方案

    1. 在 VPS 主机上安装启动 IPFS 服务,通过端口 5001 在内网提供 API 服务.
    2. 在 GitHub 上通过 ssh 建立端口转发,本地端口 5001 转发到 VPS 主机 5001.
    3. 在 GitHub 上利用 ipfs-http-client 上传文进到 5001 端口.
    4. 绑定域名到 IPNS 地址,通过域名访问 IPFS 文件.

    1. 部署 IPFS 服务

    • 安装 kubo,详见官方文档

      wget https://dist.ipfs.tech/kubo/v0.18.1/kubo_v0.18.1_linux-amd64.tar.gz tar -xvzf kubo_v0.18.1_linux-amd64.tar.gz > x kubo/install.sh > x kubo/ipfs > x kubo/LICENSE > x kubo/LICENSE-APACHE > x kubo/LICENSE-MIT > x kubo/README.md cd kubo sudo bash install.sh > Moved ./ipfs to /usr/local/bin ipfs --version > ipfs version 0.18.1 
    • 初始化 IPFS

      ipfs init --profile=server 
    • 添加到开机启动

      [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=root [Install] WantedBy=multi-user.target 

      将上述代码保存到/usr/lib/systemd/system/ipfs.service文件.

      启动进程.

      systemctl start ipfs.service 
    • 开放端口

      IPFS 默认通过 4001 端口跟 DHT 网络通信,需要放开 4001 端口访问.

    2. GitHub Actions 配置

    博客我使用的Hugo,原有的工作流方案见将博客部署到 Cloudflare Pages

    完整的工作流配置见[main.yml](完整配置可参考main.yml)。

    • 添加如下变量到 Actions secrets

      SSHKEY VPS 主机 ssh 登陆私钥 SSHHOST ssh 用户 @VPS 机器 IP,类似 [email protected] 
    • 更新 yaml 配置文件,添加如下任务.

       - name: Connect to ssh in BG timeout-minutes: 2 run: | echo "${{ secrets.SSHKEY }}" > ../privkey chmod 600 ../privkey ssh -o StrictHostKeyChecking=no ${{ secrets.SSHHOST }} -i ../privkey -L 5001:localhost:5001 -fTN - name: ipfs upload uses: aquiladev/ipfs-action@master id: deploy timeout-minutes: 2 with: path: ./public service: ipfs verbose: true host: localhost port: 5001 protocol: http key: self # 要配置 key,这样才会生成 IPNS 地址 

      测试执行 action,日志里会有类似如下输出.

      Upload to IPFS finished successfully { cid: 'QmST2Zqv8qffFTVuqfRX57uzqxsoQtTYinmHpyLh7padAD', ipfs: 'QmST2Zqv8qffFTVuqfRX57uzqxsoQtTYinmHpyLh7padAD', ipns: '12D3KooWKvJ9Y4D5X4R3ajuc7tVtQWXZMG4iiMCFtay8frM66o4c' } 

      每次执行,ipfs 地址不同,ipns 地址不变. 记住这里到 ipns 地址,下面会用到.

    3. 域名配置

    Cloudflare上添加解析:

    • 添加 DNS TXT 记录,名称为_dnslink,值为dnslink=/ipns/上一步日志里到 ipns 值.
    • 添加 DNS CNNANE 记录,名称为你的域名,值为gateway.ipfs.io.

    DNS 解析

    从年前开始想怎么做成自动化,到今天终于跑通搞定了.

    VPS 主机运行情况

    两天跑了 14G 流量,每月的流量资源包基本够用了.

    原文地址: https://liudon.com/posts/deploy-blog-to-ipfs/

    第 1 条附言    2023-02-24 12:37:12 +08:00
    经 @Livid 大佬提醒,存在公共网关访问时相对路径问题。

    我使用的 Hugo ,配置文件里如下配置即可。

    ```
    relativeURLs: true
    ```
    23 条回复    2024-05-23 11:09:18 +08:00
    Pil0tXia
        1
    Pil0tXia  
       2023-02-23 22:35:05 +08:00   2
    不知道你们有没有注意到 V2EX 底部多了一个“博客”的入口,@Livid 已经给自己搭了个能用传统域名访问的 ipfs 博客。不过并没有能够打动我从 OSS+CDN 的静态博客方案迁移的优点,或许尝试一下新技术会很有意思。
    kouhe3
        2
    kouhe3  
       2023-02-23 23:00:42 +08:00
    wow. great! next tech blog! haha.
    airyland
        3
    airyland  
       2023-02-24 00:27:36 +08:00
    用站长的 Planet 可以省掉不少步骤。
    adrianzhang
        4
    adrianzhang  
       2023-02-24 08:39:07 +08:00
    存 ipfs 要钱吗?
    liudon
        5
    liudon  
    OP
       2023-02-24 09:58:02 +08:00
    @Pil0tXia 我现在主站还是部署到 Cloudflare Pages 上的,在 IPFS 上搞了一个镜像站,尝试下新技术。
    liudon
        6
    liudon  
    OP
       2023-02-24 10:00:05 +08:00
    @airyland 有尝试过 Planet ,每次需要手动添加目录发布。
    我这里配置好后,后续只需要提交到 Github 仓库,就会自动部署到 IPFS 了。
    liudon
        7
    liudon  
    OP
       2023-02-24 10:00:40 +08:00
    @adrianzhang 不要钱
    s1mplezzc
        8
    s1mplezzc  
       2023-02-24 14:15:15 +08:00
    好难啊,大佬
    liudon
        9
    liudon  
    OP
       2023-02-24 14:23:26 +08:00
    @s1mplezzc 按步骤操作下就行,我已经我趟过坑了
    Livid
        10
    Livid  
    MOD
    PRO
       2024-04-27 14:43:59 +08:00
    Cloudflare 应该是改规则了,现在访问不了了。
    liudon
        11
    liudon  
    OP
       2024-04-28 12:22:15 +08:00
    @Livid 好像是需要订阅了,Free 档也是按量付费了

    https://developers.cloudflare.com/web3/ipfs-gateway/
    Livid
        12
    Livid  
    MOD
    PRO
       2024-04-28 14:07:01 +08:00
    @liudon 现在有个新的 ENS gateway

    https://liudon.eth.sucks/
    liudon
        13
    liudon  
    OP
       2024-04-28 17:51:53 +08:00
    @Livid 这个是不是不支持 dnslink ?我试了直接 cname 改到这个也还是访问不了
    Livid
        14
    Livid  
    MOD
    PRO
       2024-04-28 18:03:18 +08:00 via iPhone
    @liudon 不是通用型的 gateway ,主要是服务已经绑定到 ENS 上的 IPFS 资源。

    如果要支持 DNSLink 需要服务器上接受特定的 host header 。
    liudon
        15
    liudon  
    OP
       2024-05-22 00:35:52 +08:00   1
    @Livid kubo 客户端自带 gateway 网关,支持 dnslink 解析,搞了个 ngxin 反代,现在可以正常访问了
    liudon
        16
    liudon  
    OP
       2024-05-22 21:30:01 +08:00   1
    w568w
        17
    w568w  
       2024-05-23 01:17:49 +08:00
    对 IPFS 一窍不通,比较好奇这种去中心化技术是如何保证网站存活的呢?种子对做种者来说有直接利用价值所以才有人心甘情愿做种,但会持续有人无偿、自愿地贡献电费和储存资源来维护你我的博客吗?
    Livid
        18
    Livid  
    MOD
    PRO
       2024-05-23 01:19:53 +08:00
    @w568w 至少你可以自己为自己的内容做种。用自己的电脑就可以,不需要买服务器。
    edak
        19
    edak  
       2024-05-23 02:43:55 +08:00
    伟大的技术
    Aksura
        20
    Aksura  
       2024-05-23 07:37:09 +08:00
    @w568w 所以才有 Filecoin 之类的方案,至少可以通过付费来维持网站的存活。
    cherryas
        21
    cherryas  
       2024-05-23 08:56:51 +08:00   1
    每天随机抽取一些幸运文件删除(
    ccbikai
        22
    ccbikai  
    PRO
       2024-05-23 09:04:14 +08:00 via iPhone
    欢迎各位 pin 我的主页,ipfs pin add /ipns/mt.ci
    liudon
        23
    liudon  
    OP
       2024-05-23 11:09:18 +08:00
    @ccbikai 已 pin
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5801 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 39ms UTC 06:17 PVG 14:17 LAX 23:17 JFK 02:17
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86