前言

今天花了大约 8 小时,从零开始搭建了这个博客。记录一下完整过程,包括技术选型、踩过的坑和解决方案。希望能帮到想搭建自己博客的朋友。

技术栈介绍

Hugo - 静态网站生成器

Hugo 是用 Go 语言编写的静态网站生成器,号称"世界上最快的静态网站生成器"。

优点:

  • ⚡ 极速构建(每秒生成数千页面)
  • 🎨 主题丰富(官方主题库 300+)
  • 📝 支持 Markdown
  • 🔧 单二进制文件,单文件部署

缺点:

  • 主题版本和 Hugo 版本可能不兼容
  • 需要一定学习成本

GitHub - 代码托管

GitHub 用于托管博客源码,配合 Git 版本控制。

作用:

  • 代码版本管理
  • 文章 Markdown 文件存储
  • 与 Vercel 集成实现自动部署

Vercel - 静态网站托管

Vercel 是前端部署平台,对静态网站支持极好。

优点:

  • 🚀 自动部署(Git 推送即部署)
  • 🌍 全球 CDN 加速
  • 🆓 免费版足够个人博客使用
  • 🔒 自动 HTTPS

注意点:

  • Deployment Protection 默认可能开启(需要关闭才能公开访问)
  • 需要正确配置 Hugo 版本环境变量

Cloudflare - DNS + CDN

Cloudflare 提供 DNS 解析和 CDN 加速服务。

作用:

  • 域名 DNS 管理
  • SSL/TLS 证书(自动)
  • DDoS 防护
  • 全球 CDN 加速

搭建过程实录

第一步:购买域名

选择了 d5n.xyz,寓意 Duran(5个字母)+ N。

踩坑提醒:

  • 3字母 .com 域名基本都是溢价域名($1000+)
  • .xyz 首年便宜($1-3),但注意续费价格
  • Cloudflare 可以直接注册域名,成本价无溢价

第二步:初始化 Hugo 站点

hugo new site duranblog
cd duranblog
git init
git submodule add --depth=1 https://github.com/adityatelange/hugo-PaperMod.git themes/PaperMod

配置 hugo.toml:

baseURL = 'https://d5n.xyz'
languageCode = 'zh-CN'
title = 'D5N'
theme = 'PaperMod'

第三步:创建 GitHub 仓库

  • 仓库名:duranblog
  • 类型:Public(Vercel 免费版对 Public 仓库无限制)
  • 添加 README 初始化

第四步:推送代码到 GitHub

问题 1:Git 认证失败

错误信息:

fatal: could not read Username for 'https://github.com'

解决方案: 使用 Personal Access Token 认证:

git remote set-url origin https://openduran:[email protected]/openduran/duranblog.git

第五步:Vercel 部署

问题 2:部署后显示 HTML 源码

现象:访问网站时浏览器显示原始 HTML 代码,而不是渲染后的网页。

排查过程:

  1. 检查 GitHub 仓库,发现提交了 public/ 目录
  2. Vercel 有自动构建功能,不需要提交构建后的文件
  3. 删除 public/ 目录,添加 .gitignore

解决方案:

rm -rf public/
echo "public/" >> .gitignore
git add . && git commit -m "Remove public dir" && git push

问题 3:Hugo 版本不兼容

错误信息:

WARN  Module "PaperMod" is not compatible with this Hugo version: Min 0.146.0
ERROR render of "/404" failed

原因: Vercel 默认 Hugo 版本太旧,PaperMod 主题需要 0.146.0+

解决方案: 在 Vercel 项目设置中添加环境变量:

  • Name: HUGO_VERSION
  • Value: 0.146.5

问题 4:访问需要登录(401 错误)

现象:访问网站提示 “Vercel Authentication”

解决方案:

  1. 进入 Vercel 项目 Settings → General
  2. 找到 “Deployment Protection”
  3. 改为 “Disabled”
  4. 保存后重新部署

第六步:配置 Cloudflare DNS

问题 5:SSL 握手失败(525 错误)

错误信息:

525: SSL handshake failed

原因: Cloudflare SSL 模式和 Vercel 不兼容

解决方案:

  1. 进入 Cloudflare → SSL/TLS → Overview
  2. 将模式从 “Flexible” 改为 “Full” 或 “Full (strict)”

问题 6:根域名无法访问

现象:www.d5n.xyz 可以访问,但 d5n.xyz 不行

原因: 缺少根域名的 DNS 记录

解决方案: 在 Cloudflare DNS 添加:

  • Type: CNAME
  • Name: @ (或 www)
  • Target: cname.vercel-dns.com
  • Proxy: 橙色 ☁️ (Proxied)

完整部署流程图

本地开发
    ↓
Hugo 构建测试
    ↓
Git push 到 GitHub
    ↓
Vercel 自动检测 → 自动部署
    ↓
Cloudflare DNS 解析
    ↓
用户访问 d5n.xyz

关键配置总结

Hugo 版本控制

一定要在 Vercel 环境变量中指定 Hugo 版本:

HUGO_VERSION=0.146.5

Vercel 构建设置

  • Build Command: hugo --gc --minify
  • Output Directory: public
  • Install Command: (留空或 yarn install)

Cloudflare SSL 设置

  • 模式: Full 或 Full (strict)
  • 不要选: Flexible(会导致 525 错误)

最终成果

经验教训

  1. 不要提交 public/ 目录 - 让 Vercel 自己构建
  2. 指定 Hugo 版本 - 避免主题兼容性问题
  3. 关闭 Deployment Protection - 否则需要登录才能访问
  4. SSL 模式选 Full - Flexible 会导致握手失败
  5. DNS 记录要完整 - 根域名和 www 子域名都要配置

下一步优化

  • 添加 Google Analytics 统计
  • 配置评论系统(Giscus/Utterances)
  • 添加 RSS 订阅
  • 优化 SEO(sitemap, robots.txt)
  • 配置图片 CDN

总结: 从零搭建一个博客其实并不复杂,主要是踩坑和排错。一旦跑通自动化部署流程,后续发布文章就是 git push 一下的事情。希望这篇记录对你有帮助!