2024年似乎是所谓“XX元年”。过年的时候,有点时间升级了一下服务器,然后博客服务器就不能启动了。联系了一下服务商(unmanaged service),回答说硬盘坏了。我在服务器上挂着两个硬盘,采用了raid-1冗余方案,但在紧急备份数据的时候,另一个硬盘似乎也是坏了。我用smartctl测试了一下,这个硬盘大约是一个已经很旧的二手硬盘,即使不坏,也是朝不保夕。

花了一天时间来恢复数据,但托管在服务器上的几个网站还是都挂掉了,包括人民群众喜闻乐见的"flywow.net"和“jpraus.com”。我自己的数据备份在dropbox上,但10多年的积年老站,数据量太大,所以我的dropbox无法容纳其他几个博客的备份。我不记得自己很严肃地提醒他们备份,从前有过网站崩盘的时候,但因为硬盘还在,所以总是可以原地复活。但这一次是不行的。

我在另一台服务器上暂时恢复了我的博客。但仔细想了一下,从前采用的廉价legacy服务器虽然便宜,但实在是太过于冒险激进。随着我的数据越来越多,这样下去恐怕是不行。所以我就取消了那一台服务器的订单,决定不再使用。而手上的这一台服务器固然略微稳定一点,但只是一个4核的i3,8G内存,而我也再懒得去优化我的php,wordpress之类。随意测试了一下,速度实在是无法忍受。

所以我就又用了一天时间,下定决心将网站迁移到hugo上来。


Hugo是一个静态网站生成器,用go语言写成,可以将一个基于markdown的网站编译为一个纯粹的静态网站,不再使用php动态语言,也没有mysql数据库在后台消耗大量资源,而且安全性要好不少,可以将几乎所有端口全部封闭,留下http和https即可。

在运行速度上,Huho的静态调用,比wordpress会快不少,完全可以在我这个低配版的服务器上运行。据说内存消耗也要低很多,大约从1G内存降低到64M左右。

唯一的问题是没有很好的转换工具。大约坚持wordpress的人不喜欢静态网站的概念,而喜欢静态网站的人也少有欲望迁移网站,只是重新建一个而已。但我的数据量太大,无法扔掉,只能硬着头皮转换了。


这也是今年来chatGPT出现之后,我愿意尝试的工作了。如果没有gpt加持,这事是无法做下去的。

我用chatGPT提供的方案导出了wordpress,又监督GPT写了若干个bash和python脚本来调整头文件,图片链接等,最复杂的一个脚本要求访问wordpress的数据库,将图片数据读出来,并清理这些年堆积起来的5万张图片。

最后的成果很不错,我把5万张图片删除了95%,只剩下不到2000张图片,大部分都是博客文章的封面配图。hugo的编译发布时间也从一开始的10分钟一趟缩短为15秒。

我最雄心勃勃的计划是写一个开源python项目,帮助有需要的人将wordpress转为hugo,但这段时间有别的事情需要完成,暂时就放在这里吧。


除了图片资源以外,所有网站内容都保存在github上了,今后不再担心服务器出问题,而现有的图片可以暂且放在几个vps上,一时还不至于将硬盘占满。

现在的网站也可以直接上cloudflare了,无许使用动态语言。大概这算是这15年来网站开发的回归吧,从静态到动态,再次回到了静态。

下面的两个地址eddyemma的博客或者blog.eddyemma.com目前指向同一个地址。但我已经预备了一台新的vps,今后应该可以分布在不同的地方。


下面的代码片段,就是扫描所有无用图片的脚本。我只负责需求说明,代码运行,chatGPT负责写代码——现代程序员的日常:

cat scanunused.sh
#!/bin/bash

# Define directories
HUGO_ROOT=$(pwd) # Ensure we're getting the absolute path of the current directory
STATIC_DIR="${HUGO_ROOT}/static"
CONTENT_DIR="${HUGO_ROOT}/content"
LAYOUTS_DIR="${HUGO_ROOT}/layouts"

# Temporary file to hold the list of unused files
UNUSED_FILES="${HUGO_ROOT}/unused_files.txt"

# Clear the unused files list
> "$UNUSED_FILES"

# Find all files in the static directory and check each one for usage
find "$STATIC_DIR" -type f | while read file; do
    # Convert the full static file path to a relative path from HUGO_ROOT for searching
    file_relative_path=$(echo "$file" | sed "s|^${STATIC_DIR}/||")
    # Search in content and layouts directories
    if ! grep -qr "$file_relative_path" "$CONTENT_DIR" "$LAYOUTS_DIR" 2> /dev/null; then
        echo "$file_relative_path" >> "$UNUSED_FILES"
    fi
done

# Report results
echo "The following static files appear to be unused:"
cat "$UNUSED_FILES"
echo "Review the listed files and manually verify they are safe to delete."