w.cx
w.cx is Rocco’s blog.

通过定时任务脚本让Hugo在每次更新后自动同步到IPFS服务器并发布到IPNS网络!

Posted on Jun 9, 2024

简介

其实网站自建设以来都是我手动复制文件添加到IPFS并手动再发布一次IPNS的,也一直想实现这么一套自动化系统,但是中文网络里面我也有并没有现成的教程,所以一直搁置,不过现在终于有时间给这套脚本写出来了。

因为涉及Hugo、Linux、Git、Cron、IPFS CLI等各种操作,虽然本教程在很多地方偷懒使用宝塔代为执行,但是本教程仅是简略复现我的操作步骤,每个步骤的教程并不一定能在其他环境下直接照搬执行,可能晦涩难懂,仅供参考,望纯小白见谅~

环境与实现方式

以下是本次配置的环境

  • 安装了IPFS的宝塔服务器,检测并发布最新代码到IPFS、IPNS (此处宝塔是为了方便设置,不喜欢宝塔完全没必要)
  • 负责编写Hugo的个人电脑 每次编写完Hugo并在本地测试完毕后通过Git提交到代码仓库,通过宝塔服务器上的定时任务脚本每隔一小时监测仓库是否有变化,如有则同步文件到IPFS网络并发布IPNS,以及清除之前的IPFS PIN缓存。

配置服务器

  1. 安装宝塔
  2. 服务器下载最新的适合服务器的IPFS-Kubo: https://github.com/ipfs/kubo/releases/ 解压并执行install.sh安装
  3. 执行
1
ipfs init
  1. 导入或生成ipns密钥,我这里是导入我之前生成的IPNS私钥
1
ipfs key import <name> <key.file>
  1. 宝塔->软件商店->免费应用,安装 进程守护管理器

  2. 添加守护进程 启动命令:ipfs daemon 进程目录: /root/.ipfs/ image-1

  3. 检查ipfs是否运行成功

配置Cron脚本

  1. 在Hugo项目根目录创建 syncipfscron.sh 改为其他名称也可以 放入其他目录也行,因为该文件也没有过多隐私信息且我的仓库是私有,为了方便部署就直接放入仓库根目录了。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/bin/bash

# 定义public文件夹路径和IPNS名称
HUGO_DIR="/home/GitHub/w.cx"
PUBLIC_DIR="$HUGO_DIR/public"
IPNS_NAME="w.cx"
LAST_CID_FILE="/home/GitHub/w.cx/last_cid.txt"

# 注意这是一个定时任务,适用于服务器只用于同步IPFS文件,不在服务器上编辑Hugo只在自己电脑上通过git提交代码,才需要此步骤拉取最新的代码到服务器再由服务器上传到IPFS网络,如果你在服务器上编辑Hugo请您自行根据Git规则同步内容库并删除以下代码,否则会造成进度丢失!!!
# 拉取最新代码库
cd $HUGO_DIR

#恢复代码库,如果你同步public并重新编译了则需要这一句
#git reset --hard

if git pull | grep -q 'Already up to date'; then
  echo "No changes detected."
  exit 0
#如果你不信任git同步过来的通过你自己电脑上Hugo编译的public文件夹那么在这里删除掉他并用服务器的Hugo重新编译。
#else
	#rm -rf "$PUBLIC_DIR"/*
	#hugo --source $HUGO_DIR
fi

# 获取当前public文件夹的CID
CURRENT_CID=$(ipfs add -r -Q $PUBLIC_DIR)

# 如果last_cid.txt不存在,创建它并写入当前CID
if [ ! -f $LAST_CID_FILE ]; then
  echo $CURRENT_CID > $LAST_CID_FILE
  ipfs name publish --key=$IPNS_NAME $CURRENT_CID
  exit 0
fi

# 读取上一个CID
LAST_CID=$(cat $LAST_CID_FILE)

# 检查是否有变动
if [ "$CURRENT_CID" != "$LAST_CID" ]; then
  # 取消pin上一个CID
  ipfs pin rm $LAST_CID
  ipfs repo gc
  
  # pin新的public文件夹
  ipfs pin add $CURRENT_CID
  
  # 更新IPNS
  ipfs name publish --key=$IPNS_NAME $CURRENT_CID
  
  # 更新last_cid.txt
  echo $CURRENT_CID > $LAST_CID_FILE
fi
  1. 在安装了IPFS服务器上拉取Hugo储存库
  2. 配置宝塔计划任务
1
sudo -u root /home/GitHub/w.cx/syncipfscron.sh

image-1

  1. 手动执行一次并排查错误。
  2. 向.gitignore加入last_cid.txt要求不同步last_cid.txt 不然会影响脚本判断

总结

因为使用Hugo等编译静态博客在简中网络中实属少见,即使用Hugo等编译器又研究将博客部署到IPFS的更是少之又少。 所以本篇教程无法从Hugo的配置教程、以及IPFS的配置教程写起,当然您若是搜索到这篇教程肯定是您配置到了这一步,望能给有兴趣的您一个参考。