本文会介绍如何接入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
搜索一番,发现了两个包helia和js-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
导入已有密钥会报错。
查看已有密钥:
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
。
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
更新域名的dnslink值:
普通域名
eth域名
第一次和外国人在线沟通,时差原因搞了两天才把filebase
导入报错的问题解决。 😂😂😂
另外吐槽一下filebase
服务,sdk已经有相关实现了,文档都还没更新。