zola-将博客从hexo迁移到zola并部署至Cloudflare Pages

最近将原博客部署到了Cloudflare Pages上,并且静态站点生成器也从Hexo换成了Zola,这里做一下迁移记录。

迁移的起因

原有博客是部署在Amazon Lightsail的机器上的,这台机器平时只运行了个Nginx,一直续费实属浪费钱。博客这种能Serverless化的小东西,还是无需自己手动管理环境比较省精力。

托管静态Web应用的框架或平台已经很多,Github PagesNetlifyCloudflare Pages都非常成熟,鉴于博客目前套用的是Cloudflare的免费CDN套餐,干脆就拜托赛博菩萨好事做到底吧,于是选用了Cloudflare Pages。

至于Hexo,它上次更新距今已过了大半年,且我不太喜欢nodejs环境的臃肿,现在Rust社区也有了新的静态站点生成工具-Zola,性能强且足够轻量,功能简洁够用,就决定迁移到Zola。

很久以前部署Hexo博客的文章在这里

从Hexo迁移到Zola

这个迁移大致需要做以下几件事:

  1. 修改博客的Markdown文件内容格式
  2. 修改主题
  3. 修改配置文件
  4. SEO

更改Markdown格式

Zola与Hexo的Markdown文件内容格式主要区别在Front matter上,这是Zola的Front Matter格式文档

将博客目录从服务器上打包下载到本地后,如果一篇一篇手动调整文章格式,太过重复且耗费时间。于是让AI写了个Python脚本,用来转换整个目录里的源Markdown文件的Front matter头,并重命名生成副本。

Deepseek给出的代码如下:

import os
import re
import yaml
from datetime import datetime

def convert_front_matter(md_content):
    # 原有转换逻辑保持不变
    yaml_match = re.search(r'^---\n(.*?)\n---\n', md_content, re.DOTALL)
    if not yaml_match:
        return md_content

    yaml_str = yaml_match.group(1)
    data = yaml.safe_load(yaml_str)
    
    if 'date' in data:
        date_str = data['date']
        if '/' in date_str:
            dt = datetime.strptime(date_str.split()[0], '%Y/%m/%d')
            data['date'] = dt.strftime('%Y-%m-%d') + ' ' + date_str.split()[1]

    toml_lines = ['+++']
    for key, value in data.items():
        if isinstance(value, list):
            quoted = [f'"{item}"' for item in value]
            toml_lines.append(f'{key} = [{", ".join(quoted)}]')
        else:
            if isinstance(value, str) and not value.startswith(('"', "'")):
                toml_lines.append(f'{key} = "{value}"')
            else:
                toml_lines.append(f'{key} = {value}')
    toml_lines.append('+++')
    
    return md_content.replace(
        yaml_match.group(0),
        '\n'.join(toml_lines) + '\n\n',
        1
    )

def process_markdown_files(input_dir):
    # 遍历目录中的所有.md文件
    for filename in os.listdir(input_dir):
        if filename.endswith('.md'):
            input_path = os.path.join(input_dir, filename)
            
            # 读取原始文件内容
            with open(input_path, 'r', encoding='utf-8') as f:
                content = f.read()
            
            # 转换front matter
            new_content = convert_front_matter(content)
            
            # 生成新文件名
            new_filename = f'zola-{filename}'
            output_path = os.path.join(input_dir, new_filename)
            
            # 写入新文件
            with open(output_path, 'w', encoding='utf-8') as f:
                f.write(new_content)
            print(f'已转换: {filename} -> {new_filename}')

if __name__ == '__main__':
    # 配置参数(按需修改)
    MARKDOWN_DIR = './markdown_files'  # 你的Markdown文件所在目录
    
    # 执行转换
    process_markdown_files(MARKDOWN_DIR)
    print("\n全部转换完成!新文件已添加 zola- 前缀")

这个代码可以一次性运行成功,不由得感叹2025年的大模型相比半年前确实进步不少。

修改主题

Zola的主题目前还是有点少,在Github上找到一个比较成熟的主题-tabi,直接使用它的脚手架项目-tabi-start,在本地用Git初始化了这个项目,将调整过的Markdown文件全都放入content/blog目录中,本地运行zola server命令,访问http://127.0.0.1:1111,确认可以正常运行。

如果以后需要更新主题,使用git submodule update --remote themes/tabi命令即可。

修改配置

参考Zola的配置文件文档Tabi的配置文件文档修改即可,文档非常详细,我主要调整了base_url、搜索以及favicon相关的内容。

SEO

没人看,写着给自己看,这次直接放弃SEO。

部署到Cloudflare Pages

这一步主要参考自Zola的部署文档,和Cloudflare Pages的开发人员文档

关联远程Git仓库

需要启用一个远程仓库,使得Cloudflare Pages能够由地方拉取代码,鉴于目前Github的私有仓库也已经免费,就直接将博客代码关联到了Github上。

通过代码仓库将网站部署到Cloudflare Pages

  1. 登录到Cloudflare Dashboard
  2. 在帐户主页中,选择 Workers & Pages > Create > Pages > Connect to Git
  3. 选择GitHub存储库,并在设置构建和部署部分中配置以下信息:
Configuration optionValue
Production branchMaster
Build commandzola build
Build directorypublic
  1. 在环境变量的配置框中添加ZOLA_VERSION这个键,设置一个比较新的zola版本号作为它的值,因为默认的zola版本较低,可能会编译不通过。

  2. 点击Deploy部署即可。

可能会出现zola not found的报错,这是因为截止2025/03/01,Pages默认的v2编译环境还没有包含zola,在设置里将其切换至v1环境即可,详情参考Troubleshooting

重新设置域名解析和CDN

Pages部署成功后,Cloudflare会生成一个xxx.pages.dev的域名,在Cloudflare里将主域名解析到这个三级域名,启用CDN,等待DNS解析生效即可。

后续更新维护

发布新文章时,只需要git push推送到远程仓库,Cloudflare Pages服务会触发拉取代码仓库的动作,使用最新的代码部署页面。