本文会介绍如何接入filebase的Names(IPNS)服务,使你的IPFS站点持久在线。

背景

周末更新博客时,发现workflow的上传IPFS任务执行失败了。

Run aquiladev/ipfs-action@master
Error: RequestInit: duplex option is required when sending a body.
node:internal/deps/undici/undici:12502
      Error.captureStackTrace(err, this);
            ^

TypeError: RequestInit: duplex option is required when sending a body.
    at node:internal/deps/undici/undici:12502:13
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)

Node.js v20.13.1

查了一下,应该是Github更新了NodeJS版本导致的。

The following actions use a deprecated Node.js version and will be forced to run on node20: actions/checkout@v2, peaceiris/actions-hugo@v2, peaceiris/actions-gh-pages@v3, aquiladev/ipfs-action@master. For more info: https://github.blog/changelog/2024-03-07-github-actions-all-actions-will-run-on-node20-instead-of-node16-by-default/

研究了一下,问题在于js-ipfs包的fetch方法没有传duplex参数导致。

Github文档,官方已经不再更新了。

DEPRECATED: js-IPFS has been superseded by Helia

搜索一番,发现了两个包heliajs-kubo-rpc-client

helia调用方法有变化js-kubo-rpc-client和原来的js-ipfs使用一致。

捣鼓了一番,没调通,不懂前端的锅,只能放弃,顺便给作者提了个issue,还是作者来适配吧。

隔天看的时候,在Pull requests里发现已经有升级后的提交了。

哈哈,原来filebase官方早就升级适配了,filebase/ipfs-action,顺带发现居然还支持了IPNS更新,太完美了!!!

折腾记录

关于IPNS的作用,可以参考zu1k大佬的IPFS 新手指北

关于IPFS的部署,可以参考我的将博客部署到星际文件系统(IPFS)

生成密钥

因为我在云主机上部署了ipfs服务,已经有在更新IPNS

这里引入filebase后,相当于多个节点来更新,需要保证IPNS地址上一致的。

所以需要将云主机的密钥导出后,导入到filebase

之前使用的是ipfs默认密钥,这个是无法导出的,所以只能重新生成一个密钥, ipfs-action为密钥名字,改成你自己的:

ipfs key gen ipfs-action

> k51qzi5uqu5dh5kbbff1ucw3ksphpy3vxx4en4dbtfh90pvw4mzd8nfm5r5fnl

注意:filebase还不支持type/size参数,这里必须使用默认方式创建,否则在filebase导入已有密钥会报错。

chat

查看已有密钥:

ipfs key list -l
> k51qzi5uqu5djx9olgjcibdiurrr09w75v6rdfx0cvwye295k787sssssf0d9d self        
> k51qzi5uqu5dktnw0vc8j9ci42e8gk741ici7ofpv40mo4f6e1ossssnc7uwg ipfs-action

导出密钥:

ipfs key export ipfs-action

执行后,当前目录下会生成一个ipfs-action.key文件,内容为二进制。

filebase导入key要求为base64编码,将其转为base64编码:

cat ipfs-action.key | base64
> 5oiR5piv5rWL6K+V

记住这里的base64内容,下面会用到。

创建NAME

进入filebase控制台,点击Create Name

input

Label: 备注,可以随便填
CID: 填入IPFS的cid地址
Name Network: 固定选IPNS
Enabled:固定选Yes
Import Existing Private Key (Optional):填入第一步的base64内容

确定提交。

修改workflow
- name: IPFS upload to filebase
uses: filebase/ipfs-action@master
with:
    path: ./public
    service: filebase
    pinName: ipfs-action
    filebaseBucket: ${{ secrets.FILEBASE_BUCKET }}
    filebaseKey: ${{ secrets.FILEBASE_KEY }}
    filebaseSecret: ${{ secrets.FILEBASE_SECRET }}
    key: ipfs-action

新增key参数,值为第二步Label填入的内容。

提交后,执行workflow,在执行结果里找到IPNS地址。

Run filebase/ipfs-action@master
Parsing options...
Parsed Options: {"path":"/home/runner/work/***.github.io/***.github.io/public","service":"filebase","host":"ipfs.io","port":"5001","protocol":"https","headers":{},"key":"ipfs-action","pinName":"ipfs-action","pinataKey":"","pinataSecret":"","pinataPinName":"","filebaseBucket":"***","filebaseKey":"***","filebaseSecret":"***","infuraProjectId":"","infuraProjectSecret":"","timeout":"60000","verbose":false,"pattern":"public/**/*"}
Adding files...
Starting filebase client
Started filebase client
Storing files...
Stored files...
CID: bafybeihagzsdupyrecky7bnstzckgf5flxbrdz542jmfaep4xtbj6aa2ea
Updating name...
Updated name...
Done
Upload to IPFS finished successfully {
  cid: 'bafybeihagzsdupyrecky7bnstzckgf5flxbrdz542jmfaep4xtbj6aa2ea',
  ipfs: 'bafybeihagzsdupyrecky7bnstzckgf5flxbrdz542jmfaep4xtbj6aa2ea',
  ipns: 'k51qzi5uqu5dktnw0vc8j9ci42e8gk741ici7ofpv40mo4f6e1ovj1isnc7uwg'
}

更新域名的dnslink值:

普通域名

dns

eth域名

eth

第一次和外国人在线沟通,时差原因搞了两天才把filebase导入报错的问题解决。 😂😂😂

另外吐槽一下filebase服务,sdk已经有相关实现了,文档都还没更新。