前言 本文记录了使用 Hugo 静态站点生成器搭配 PaperMod 主题,在云服务器上搭建一个技术博客的全过程。包括:环境配置、部署上线、后台管理、美化、搜索、评论等功能,并附上所有踩过的坑和解决方案。
适用人群:有一台云服务器(本文以 Ubuntu/Debian 为例)、一个公网 IP 或域名,想快速搭建可在线编辑的技术博客。
最终效果:一个基于 IP 即可访问的静态博客,可通过浏览器后台在线编辑文章,刷新页面即可生效。
一、服务器基础环境
更新系统并安装必要软件
udo apt update && sudo apt upgrade -y
sudo apt install git nginx certbot python3-certbot-nginx -y
安装 Hugo(推荐 snap)
sudo snap install hugo
若不用 snap,可去 GitHub Release 下载最新 deb 包安装。但请确保版本 ≥ 0.146.0,否则 PaperMod 最新版会报错。
检查版本: hugo version
二、创建 Hugo 站点
创建工作目录 sudo mkdir -p /var/www/techblog
sudo chown -R
USER:USER /var/www/techblog
cd /var/www/techblog
初始化 Hugo 站点 hugo new site . –force 此时会生成 hugo.toml 及标准目录结构。
安装 PaperMod 主题 git init
git submodule add https://github.com/adityatelange/hugo-PaperMod.git themes/PaperMod
cd themes/PaperMod
git checkout v8.0 # 使用与 Hugo 0.146.0 兼容的稳定版本
cd ../..
三、配置文件 hugo.toml 将以下内容写入 hugo.toml(注意替换占位符):
baseURL = “http://你的公网IP/”
languageCode = “zh-cn”
defaultContentLanguage = “zh-cn”
title = “你的博客标题”
enableEmoji = true
theme = “PaperMod”
[pagination]
pagerSize = 10
[markup]
[markup.highlight]
style = “monokai”
lineNos = true
anchorLineNos = false
codeFences = true
guessSyntax = true
tabWidth = 4
[markup.goldmark]
[markup.goldmark.renderer]
unsafe = true
[markup.goldmark.extensions]
strikethrough = true
taskList = true
[[menu.main]]
name = “文章”
url = “/posts/”
weight = 1
[[menu.main]]
name = “标签”
url = “/tags/”
weight = 2
[[menu.main]]
name = “分类”
url = “/categories/”
weight = 3
[[menu.main]]
name = “关于”
url = “/about/”
weight = 4
[outputs]
home = [“HTML”, “RSS”, “JSON”]
[params]
description = “我的技术思考与记录”
author = “你的名字”
dateFormat = “2006-01-02”
readingTime = true
ShowSearch = true
ShowCodeCopyButtons = true
ShowBreadCrumbs = true
env = “production”
首页个人介绍(如果不想要头像模式,可以注释掉 profileMode 三行)
profileMode = true
avatar = “images/avatar.jpg”
bio = “全栈开发 / 技术博客作者”
评论(Utterances)
[params.utterances]
repo = “你的GitHub用户名/评论仓库名”
issueTerm = “pathname”
theme = “github-light”
label = “评论”
社交链接
[[params.social]]
name = “GitHub”
url = “https://github.com/你的用户名”
icon = “github”
[[params.social]]
name = “邮箱”
url = “mailto:you@example.com”
icon = “email”
数学公式
[params.math]
enable = true
engine = “katex”
关键注意点:
所有数值、字符串都要使用英文半角引号 “"。
[outputs] 必须独立成块,且包含 JSON。
[params.math] 要用单括号,不能用双括号。
切勿在 [params] 外再写 author = …,TOML 不允许重复键。
四、创建第一篇文章并生成静态页面
创建文章目录
mkdir -p content/posts
新建文章
hugo new posts/hello-world.md 编辑 content/posts/hello-world.md,将 draft: true 改为 false,并写入一些内容。
生成静态网站
hugo
生成的网站文件在 public/ 目录。
五、配置 Nginx
创建站点配置文件
sudo nano /etc/nginx/sites-available/techblog 内容:
server {
listen 80;
server_name _;
root /var/www/techblog/public;
index index.html index.htm;
location / {
try_files
uriuri/ =404;
}
access_log /var/log/nginx/techblog_access.log;
error_log /var/log/nginx/techblog_error.log;
}
启用站点
sudo rm /etc/nginx/sites-enabled/default # 删除默认欢迎页
sudo ln -s /etc/nginx/sites-available/techblog /etc/nginx/sites-enabled/techblog
sudo nginx -t
sudo systemctl reload nginx
云服务器防火墙放行 80 端口 登录云控制台,在安全组中添加入方向规则:允许 TCP 80 端口,授权对象 0.0.0.0/0。
如果使用 ufw:
sudo ufw allow 80/tcp
访问 http://你的公网IP 即可看到博客首页。
六、搭建浏览器管理后台(FileBrowser)
安装 FileBrowser
curl -fsSL https://raw.githubusercontent.com/filebrowser/get/master/get.sh | bash
初始化数据库并创建管理员
sudo mkdir -p /etc/filebrowser
filebrowser -d /etc/filebrowser/filebrowser.db config init
filebrowser -d /etc/filebrowser/filebrowser.db users add 用户名 密码 –perm.admin
启动服务(监听所有 IP)
filebrowser -a 0.0.0.0 -p 8080 -r /var/www/techblog/content -d /etc/filebrowser/filebrowser.db
放行 8080 端口
sudo ufw allow 8080/tcp 云控制台同样需添加 8080 入方向规则。
设为系统服务(防重启丢失)
创建 /etc/systemd/system/filebrowser.service:
[Unit]
Description=File Browser
After=network.target
[Service]
ExecStart=/usr/local/bin/filebrowser -a 0.0.0.0 -p 8080 -r /var/www/techblog/content -d /etc/filebrowser/filebrowser.db
Restart=on-failure
[Install]
WantedBy=multi-user.target
然后执行:
sudo systemctl daemon-reload
sudo systemctl enable filebrowser
sudo systemctl start filebrowser
访问 http://你的IP:8080 即可进入文件管理器,可以直接编辑 Markdown 文件。
自动构建(每次改完文章后执行 hugo) 在服务器上,改完文章后需手动生成:
cd /var/www/techblog && hugo
你也可以将 FileBrowser 的根目录设为整个站点,编辑后执行脚本,或使用 Git 钩子实现自动化。
七、美化与自定义
修改配色和字体 创建自定义 CSS 文件:
mkdir -p /var/www/techblog/assets/css/extended
nano /var/www/techblog/assets/css/extended/custom.css
示例内容(覆盖 PaperMod 默认的黄色链接):
:root {
–main-color: #2c3e50;
–primary: #3498db;
–secondary: #e67e22;
–entry: #ffffff;
–theme: #f8f9fa;
–code-bg: #f5f6fa;
}
.entry-header h1 a,
.post-title a {
color: #2c3e50 !important;
}
修改文章字体颜色 在 custom.css 中追加:
.post-content p, .post-content li {
color: #333333;
}
配置首页固定欢迎语 在 hugo.toml 的 [params] 下添加:
[params.homeInfoParams]
Title = “👋 欢迎来到我的博客”
Content = “这里记录了我的学习与思考。”
添加导航菜单外部链接
[[menu.main]]
name = “友链”
url = “https://aaacoo.xyz/"
weight = 6
修改网站底部版权 在 hugo.toml 的 [params] 中添加:
footer = “© 2026 你的名字 · 由 Hugo & PaperMod 驱动”
八、搜索功能调试
如果配置正确但搜索图标不出现,请检查:
hugo.toml 中 ShowSearch = true 且 [outputs] 包含 JSON。
执行 hugo 后,确认 public/index.json 文件存在。
在浏览器中清空缓存并硬性重新加载(Ctrl+F5 或开发者工具停用缓存)。
如果页面源码里没有 search-toggle,可强制注入:
mkdir -p /var/www/techblog/layouts/partials
nano /var/www/techblog/layouts/partials/extend_head.html
写入搜索框 HTML(详见对话历史),再次生成。
九、评论系统
在 GitHub 新建一个公开仓库(如 blog-comments),安装 Utterances App 并授权该仓库。 配置文件中 [params.utterances] 部分填写真实仓库名,生成后文章底部即出现评论区。
十、常见错误与解决
can’t evaluate field enabled in type bool 检查 [params.math] 是否误写成了 [[params.math]],或者是否在某处写了 math = true 覆盖了表格。使用单括号,并确保没有重复的布尔键。
TOML 重复键错误 删除文件顶部多余的 author、title 等,让它们只存在于 [params] 下。用 grep -n “keyword” hugo.toml 查找重复。
hugo new 报错找不到目录 手动创建 content/posts 目录:mkdir -p content/posts。
FileBrowser 重启后密码失效 启动时必须用 -d 指定固定的数据库文件,并注册为系统服务。
网站无法访问(连接超时) 检查云安全组是否放行 80 端口,服务器防火墙是否拦截。
结语 至此,一个具备在线编辑能力、美观且功能齐全的技术博客就搭建完成了。后续你只需要通过 FileBrowser 后台写作,然后在终端执行 hugo 即可更新站点。如果将来绑定域名并启用 HTTPS,只需修改 baseURL 并用 Certbot 配置 Nginx 即可。
希望这篇教程对你有所帮助,欢迎在评论区交流!