记录HUGO博客迁移到七牛云对象储存服务的过程

缘起

  • “潘天拍的博客”是学习docker搭建wordpress系统的无心之举。在阿里云上的wordpress运行2个月之后,老潘手残把mysql的容器弄没了,2个月积累的文章也丢了。为了坚持写作锻炼和输出分享,向偶像阮一峰老师学习,老潘还是决心把博客继续维持下去。与此同时吸取教训,要做好文章的保存备份工作。因此转向使用Hugo搭建博客网站。选择Hugo的原因是他是静态网站系统,写好的文章是一个一个独立的文档,便于保存在自己的文件系统中,以及对Golang技术栈有好感。
  • 要保持个人网站长久运行,必须考虑性价比。使用阿里云来运行简单的静态网页博客肯定是极大的浪费。经过调查我把目光投向了对象储存服务。简单学习了下对象储存服务,其实就是第三方储存一些无需复杂逻辑处理,只需要读取和保存的图像、文档、数据文件,达到提高服务速度,降低储存成本的目的。对象储存服务因为提供相对简单的储存服务,因此价格很便宜,甚至一定额度的服务都是免费的,极具经济性。七牛云的对象储存支持绑定域名和默认index.html为访问域名的首页,这样就可以达到在对象储存服务上搭建一个静态页面网站的目的。于是老潘申请了七牛云的对象储存服务,绑定了域名,经过简单上传文件测试,验证了确实可以实现运行hugo生成的博客。

实现效果

  • 经过简单实验可行性以后,我计划达到以下效果。
  • 使用LOGSEQ撰写博客文章。这样博文自然保存在本地,同时我用坚果云同步到网盘。
  • 撰写python脚本完成使用命令行将博文从Logseq文件夹转移到hugo对应的文件夹,然后完成网站发布文件生成,并自动上传到七牛云对象储存服务器。

条件准备

  • 要实现自动处理Logseq撰写博文并一键上传七牛云,要有以下前提。

博文撰写

  • 博文撰写必须添加hugo文章的meta信息。例如本文的meta信息如下,添加到文章最开头,正式发布是不可见的。特别一提的是,为使得脚本能够识别指定文章上传,要加入特定信息。
1  - +++
2  - date="2022-05-07"
3  - title="记录HUGO博客迁移到七牛云对象储存服务的过程"
4  - author="潘天拍"
5  - short_name="20220507_hugo" #添加信息,使用脚本时输入此参数,让程序上传logseq中的指定文章
6  - tags=["技术经验","建站运营"]
7  - thumbnail="images/post_index_thumbnail/20220507_hugo.jpg"
8  - +++

Python脚本开发

  • 脚本要实现以下功能模块
    • 找到指定short_name的文章并转移到hugo的content文件夹,本博客的项目文件夹由如下两个文件夹组成。因此脚本和hugo项目的相对位置是固定的。

      • hugo_store:放置hugo执行环境
      • scripts:放置Python代码
    • 转移过程中同步对logseq产生的文章做一点小处理,删除每行前多余的bullet标记

    • 执行hugo构建脚本,构建发布文件夹

    • 直接删除当前七牛云上的所有博客文件

    • 上传当前最新hugo的发布文件到七牛云

七牛云服务器

  • 打开默认首页设置,完成已备案域名的绑定
  • 学习相关python SDK的用法
  • 获得脚本链接七牛云的秘钥

执行测试

  • 脚本完成指定logseq文件的转移到hugo
1  python main.py -p 20220507_hugo
  • 脚本完成hugo构建和更新七牛云
1  python main.py -all
  • 以下展示main.py的代码
 1  from asyncio import subprocess
 2  from content_mp import *
 3  from qiniu_op import *
 4  import argparse
 5  
 6  parser = argparse.ArgumentParser(description='参数读取')
 7  parser.add_argument('-p',type=str,help='输入目标文章的short_name或者完整标题')
 8  parser.add_argument('-all',action='store_false',help='生成网站最新内容,并上传七牛')
 9  parser.add_argument('-m',type=str,help='最小更新模式,只上传有更新的目标文章')
10  args = parser.parse_args()
11  
12  if args.p is not None:
13      new_md,md_name = modify_md_style(args.p)
14      if new_md:
15          copy_modified_md_to_hugo(new_md,md_name)
16  if args.all is False:
17      from subprocess import run
18      import time
19      blog_dir = '../hugo_store'
20      os.chdir(blog_dir)
21      run('hugo')
22      time.sleep(3) 
23      bactch_delete()
24      public_dir = '%s/public/' % blog_dir
25      batch_upload(public_dir)
26  if args.m is not None:
27      new_md,md_name = modify_md_style(args.m)
28      if new_md:
29          copy_modified_md_to_hugo(new_md,md_name)
30          from subprocess import run
31          blog_dir = '../hugo_store'
32          os.chdir(blog_dir)
33          run('hugo')
34          upload_modified_to_qiniu(md_name)

当前效果

博文撰写

  • 我的Logseq已经在手机,linux笔记,win10的台式机安装,并且已经实现通过坚果云进行文件同步。这样我可以在任何时候用Markdown撰写博文,同时可以自由切换设备。手机的同步实现稍微麻烦点,参见我的博文

内容发布

  • 在台式机或者笔记本上完成文章发布。当前更新一次网站全部页面,整体应该不超过20秒。当前网站文章不多,这个速度我很满意。如果更新一篇文章内容,则只更新指定的网页,则速度更快。

网站访问速度和费用

  • 部署在七牛云的hugo静态网站访问还是非常快的,都是秒开状态。国内的访问速度,比使用git page方案免费部署,肯定会快很多。七牛云有10G的免费储存,就个人博客而言估计永远用不完。后期可能会在流量和请求费用上产生一些费用,但目前都是在免费额度内。按照现在访问度我估计至少1年多我这个博客都用不着在服务器上付钱😇。

后期计划

  • 目前只实现了文本的自动处理,图片的自动处理等待后续再开发。
  • Logseq生成文章的格式处理还有些问题,换行和无序列表貌似实现还不完美。
  • 希望实现文章内自动tag连接,也就是自动给markdown中符合网站tag的内容加上超链。
  • 实现增加博文的最小更新,目前更新博文是把服务器上得所有文件删除了,再上传所有文件。这肯定不是最优方式,后面要研究下哪些文件可以不用动的,实现最小更新,节省时间和服务器资源。