这篇文章教完全不懂代码的人,从零搭出一个和本站一样的博客。全程尽量用鼠标点,需要复制粘贴的地方我会单独标出来,你只需要”复制 → 粘贴 → 回车”。

本站就是按这篇文章搭出来的,可以对照本站效果(https://blog.noyu.moe )。下面的路线一推荐让 AI 帮你搭建,你全程只需要在网页上点确认。


路线一:让 AI 帮你搭建(推荐小白,最省事)

这条路不需要安装任何软件、不需要敲命令,全程跟 AI 编程助手对话,AI 负责干活,你负责在网页上点”确认 / 授权”。

第 1 步:注册 GitHub

  1. 打开 https://github.com ,点右上角 Sign up
  2. 填邮箱 → 设密码 → 起个用户名(以后你的备用站网址会带这个名字)→ 点 Continue
  3. 按提示完成验证(有时要输入图片里的单词),然后去邮箱点验证链接
  4. 注册完成

第 2 步:向 AI 说清需求,让它开工

  1. 打开一个 AI 编程助手(例如 Codex)
  2. 对它说:

帮我搭一个 Hexo + Stellar 博客,参考 https://blog.noyu.moe 这个博客的样子,部署到 Cloudflare Pages(免费,不用 Vercel),域名用我的 blog.example.com
要求:

  1. 源码仓库设为私有(别人看不到源码)
  2. 评论用 giscus,单独建一个公开的评论仓库(源码私有也能正常评论)
  3. 图片用 Cloudflare R2 存储,并配好图片域名 img.example.com
  1. AI 需要你登录 GitHub、Cloudflare 时,跟着网页提示点”授权 / 确认”就行
  2. AI 会帮你完成:创建私有源码仓库、创建公开评论仓库并配好 giscus、创建 R2 存储桶并配好图片域名、写好配置、推送到 GitHub、在 Cloudflare Pages 部署
  3. 想改成自己的:直接说”把标题改成 XXX、头像换成我给你的图片、页脚改成 XXX”,它改完自动上线

下面的第 3~7 步是”想自己动手”时的对照步骤;用 AI 的话这些它都会帮你完成,你可以跳过。

第 3 步(手工对照):让 Cloudflare Pages 帮你把博客放到网上(免费)

  1. 打开 https://dash.cloudflare.com 登录(没有就先注册,域名托管到 Cloudflare 见第 5 步)
  2. 左侧 Workers 和 PagesPages → 点 创建连接到 Git(Connect to Git)
  3. 第一次会跳去授权 GitHub:允许 Cloudflare Pages 访问你的仓库(源码仓库是私有的也没关系
  4. 在仓库列表里选你刚创建的 my-blog开始设置(Begin setup)
  5. 构建配置照填:生产分支 main、构建命令 pnpm run build、构建输出目录 public
  6. Node 版本不用设置(Cloudflare 默认 Node 22)
  7. 保存并部署(Save and Deploy),等一两分钟,会给你一个 xxx.pages.dev 预览网址,点开就能看到博客

完整版部署、域名绑定和缓存加速见文末的”部署方案三:Cloudflare Pages”。

第 4 步(手工对照):改成你自己的名字和头像(可选但建议)

以下都在 GitHub 网页上完成:

  1. 打开你的仓库(https://github.com/你的用户名/my-blog)
  2. 点进 _config.yml 文件 → 点右上角铅笔图标(编辑)
  3. 找到这几行,改成你的:
1
2
3
title: 我的博客
subtitle: 记录生活
author:
  1. 点绿色的 Commit changes(提交更改)→ 再点一次确认
  2. 改头像:点进 source/images/ 文件夹 → 点 avatar.jpg → 点右上角垃圾桶删除 → 回到文件夹 → 点 Add file → Upload files → 把你自己做的头像(文件名就叫 avatar.jpg)拖进去 → Commit changes

每次提交后,部署平台(Cloudflare Pages 或 Vercel)会自动重新部署,等一两分钟刷新网页就能看到变化。

第 5 步(手工对照):绑定你自己的域名(可选)

如果你有自己的域名(比如 blog.example.com):

  1. 打开 https://dash.cloudflare.com ,注册登录,点 Add a site(添加站点),输入你的域名,选 Free(免费) 套餐,按提示把域名的 NS 记录改成 Cloudflare 给的(要去你的域名注册商网站改)
  2. 在 Cloudflare Pages 项目里:自定义域(Custom domains)→ 设置自定义域,输入 blog.example.com继续
  3. 提示需要激活 DNS 时点 激活(Activate)(Cloudflare 会自动加好橙色云记录)
  4. 等几分钟证书签发完成,你的域名就能访问博客了

如果用 Vercel(可选方案一),域名绑定方式不同,见方案一第 4~5 点。

第 6 步(手工对照):写第一篇文章

  1. 打开你的仓库 → 点进 source/_posts/ 文件夹
  2. Add file → Create new file(创建新文件)
  3. 文件名填 hello.md
  4. 把下面内容复制粘贴进去:
1
2
3
4
5
6
7
8
9
10
---
title: "你好,世界"
date: 2026-08-31 12:00:00
categories:
- [技术]
tags:
- Hexo
---

这是我的第一篇文章。
  1. 点绿色 Commit changes
  2. 等一两分钟,刷新你的博客,文章就出现了

以后写文章都这么操作:在 source/_posts/ 里新建文件 → 粘贴上面的格式 → 改标题和内容 → 提交。

第 7 步(手工对照):发动态(可选)

用 AI 的话直接说”帮我发一条动态:……”即可。

  1. 仓库里点进 source/cross/index.md
  2. 点铅笔编辑,在 {% timeline %}{% endtimeline %} 之间加一行日期注释和内容:
1
2
3
4
5
6
{% timeline %}

<!-- node 2026-08-31 -->
今天发的动态。

{% endtimeline %}
  1. Commit changes

第 8 步(进阶,推荐):像本站一样:私有源码 + 公开评论 + R2 图片

这一节告诉 AI 帮你做,你只需要跟着点”确认 / 授权”;每一步下面都写了原理,方便你知道在配什么。

为什么这样配

  • 源码仓库私有:别人看不到你的配置和文章源码,防止被一键复制,也不影响自动部署。
  • 单独公开的评论仓库:评论系统 giscus 要求仓库公开;源码私有后,评论如果还放在源码仓库里,访客就发不了、也看不到评论。所以单独建一个公开仓库专门放评论。
  • 图片放 Cloudflare R2:图片不占 GitHub 仓库、不拖慢构建,加载也快;R2 每月免费 10GB 存储,个人博客完全够用。

8.1 把源码仓库设为私有

  1. 打开你的仓库 → Settings(设置) → 左侧 General → 拉到最下面的 Danger Zone(危险区域)Change repository visibility(更改仓库可见性) → 选 Private(私有) → 输入仓库名确认
  2. 私有后部署平台依然会自动部署(之前已经授权过,不受影响)
  3. 注意:私有仓库的 Actions 每月有 2000 分钟免费额度(每月 1 号刷新)。如果某个月在 Actions 里下载打包文件失败,说明额度用完了,让 AI 帮你打包一份 public.zip 兜底即可。

8.2 单独建一个公开的评论仓库(giscus)

  1. GitHub 右上角 + → New repository → 仓库名填 giscus(或任意名字)→ 可见性选 Public(公开)Create repository
  2. 打开新仓库 → Settings → General → 找到 Discussions → 勾选 Enable discussions(启用讨论)Save
  3. 回到 AI 对话说:”评论仓库用我刚建的 XXX,帮我把 giscus 配好”
  4. 最后去 https://github.com/settings/installations → 找到 giscus 应用 → Configure → 仓库访问选 All repositories(所有仓库)(或勾选你新建的评论仓库)→ Save
  5. 完成:文章底部评论正常使用,评论都存在公开评论仓库里;源码仓库私有不影响评论。

8.3 图片存到 Cloudflare R2

  1. 打开 https://dash.cloudflare.com ,把域名托管到 Cloudflare(Add a site,按提示把域名的 NS 记录改成 Cloudflare 给的,和绑定博客域名是同一个操作)
  2. 左侧点 R2Create bucket(创建存储桶) → 名字随意(比如 blog-images)→ Create bucket
  3. 进入桶 → Upload objects(上传对象) → 把图片拖进去,上传完成
  4. 给桶绑定一个图片域名:桶 → Settings → Custom Domains(自定义域名)Connect domain → 输入 img.example.com → 继续(Cloudflare 会自动加好 DNS 记录,等几分钟生效)
  5. 文章里引用图片:
1
![图片说明](https://img.example.com/图片文件名.jpg)
  1. 开防盗链,防止别人偷你的图片刷流量:桶 → Settings → Hotlink protection(热链保护) → 打开,允许来源填你的博客域名 → Save。个人博客开这个就够;流量很大的话再考虑加 WAF 规则。
  2. 以后需要图片时,直接把图片发给 AI,说”传到 R2 并给我链接”,它会帮你上传并把链接写进文章。

路线二:在自己电脑上完整搭建(进阶)

适合想彻底搞懂、想在本地写文章预览的人。需要安装三个软件,安装过程全是”下一步下一步”,之后命令都是复制粘贴。

第 1 步:安装 Git

  1. 打开 https://git-scm.com/download/win ,下载 Windows 版
  2. 双击安装包,一路点 Next(下一步),最后点 Install
  3. 完成

第 2 步:安装 Node.js

  1. 打开 https://nodejs.org ,下载 LTS 版本
  2. 双击安装,一路 Next,完成

第 3 步:打开命令行

按键盘 Win + R,输入 powershell,回车。

第 4 步:复制粘贴以下命令(一行一行来)

安装 hexo 和 pnpm:

1
npm install -g hexo-cli pnpm

创建博客项目(名字可以自己换,比如 my-blog):

1
hexo init my-blog

进入项目:

1
cd my-blog

安装依赖和 Stellar 主题:

1
2
pnpm install
pnpm add hexo-theme-stellar

第 5 步:启用主题(记事本编辑)

  1. 用记事本打开项目里的 _config.yml
  2. 找到 theme: landscape,改成 theme: stellar
  3. 保存

第 6 步:本地预览

回到命令行:

1
pnpm run server

浏览器打开 http://localhost:4000 就能看到博客。

第 7 步:推送上线

先把代码推到 GitHub(第 2 步的仓库可以直接用):

1
2
3
4
5
git init -b main
git add -A
git commit -m "first commit"
git remote add origin https://github.com/你的用户名/my-blog.git
git push -u origin main

然后按”路线一”第 3~5 步在 Cloudflare Pages 部署即可(完整步骤见”部署方案三”)。


部署方案一:GitHub + Vercel + Cloudflare(可选方案)

本站现已改用”部署方案三:Cloudflare Pages”。Vercel 方案仍然完全可用,想用 Vercel 的按下面操作:

  1. 打开 https://vercel.com ,点 Sign UpContinue with GitHub 授权登录
  2. Add New Project(添加新项目),在列表里找到你的 my-blog 仓库 → Import(导入)Deploy(部署)
  3. 仓库里有现成的构建配置,Vercel 会自动识别,等一两分钟出现绿色 Congratulations 即成功,得到 my-blog-xxx.vercel.app 预览网址
  4. 绑定域名:Vercel 项目 Settings(设置)→ Domains(域名)→ Add,输入 blog.example.com,复制它给的 CNAME 值
  5. 回 Cloudflare DNS → Add record:类型 CNAME、名称 blog、目标粘贴 Vercel 给的值(cname.vercel-dns.com)、保持橙色云
  6. 以后每发一篇文章,推送到 GitHub 就自动上线

部署方案二:自己的服务器 + 1Panel

想完全自己掌控、境内访问更稳定时,可以部署到自己的 Debian 12 服务器。全程只需要复制一条命令,其余全是鼠标。

第 1 步:安装 1Panel

用服务器商提供的网页终端登录,复制粘贴这一条,回车:

1
curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && sudo bash quick_start.sh

按提示按几次回车(选默认),完成后记下面板地址、用户名、密码

第 2 步:下载博客打包文件(不用自己构建)

  1. 打开你的仓库 → 点 Actions 标签
  2. 左侧选 Build Blog Package
  3. 点开最新一条(绿色打勾的)
  4. 页面底部 Artifacts 处下载 blog-public(就是一个 zip)

每次你更新文章并推送,这里都会自动生成新的 zip。

说明:私有仓库的 Actions 打包会消耗每月 2000 分钟的免费额度(每月 1 号刷新),本任务单次约 2 分钟,正常够用。万一某月额度用完导致这里失败,直接让 AI 帮你打包一份 public.zip,其他步骤照旧。

第 3 步:上传并建站

  1. 浏览器打开 1Panel,登录
  2. 左侧 文件 → 进入 /opt/1panel/www/sites/
  3. 上传,选择刚下载的 zip → 上传完点 解压
  4. 左侧 网站 → 创建网站,类型选 静态网站
  5. 域名填 blog.example.com,主目录选解压出的文件夹 → 确认

第 4 步:域名解析 + 证书

  1. 去域名商 / Cloudflare,把 blog.example.com 的解析改成 A 记录 → 服务器 IP(原来是解析到 Vercel / Cloudflare Pages,改成 A 记录)
  2. 回 1Panel → 网站 → 打开你的网站 → HTTPS申请证书 → 选 Let’s Encrypt → 确认
  3. 等一分钟,https://blog.example.com 就是你的博客

第 5 步:安全设置 + 每周自动维护

  1. 1Panel → 计划任务 → 创建计划任务
  2. 类型选 Shell,执行周期选每周(建议周日凌晨)
  3. 把下面内容整体复制粘贴到”命令”框:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
export DEBIAN_FRONTEND=noninteractive
export NEEDRESTART_MODE=a
apt update
apt upgrade -y
apt autoremove --purge -y
apt clean
if ! swapon --show | grep -q '/swapfile'; then
fallocate -l 1G /swapfile 2>/dev/null || dd if=/dev/zero of=/swapfile bs=1M count=1024
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
grep -q '^/swapfile' /etc/fstab || echo '/swapfile none swap sw 0 0' >> /etc/fstab
fi
echo 'net.ipv4.icmp_echo_ignore_all=1' > /etc/sysctl.d/99-icmp.conf
sysctl -p /etc/sysctl.d/99-icmp.conf >/dev/null 2>&1 || true
command -v ufw >/dev/null 2>&1 || apt install -y ufw
ufw allow 22/tcp >/dev/null 2>&1
ufw allow 80/tcp >/dev/null 2>&1
ufw allow 443/tcp >/dev/null 2>&1
ufw --force enable >/dev/null 2>&1 || true
command -v fail2ban-client >/dev/null 2>&1 || apt install -y fail2ban
cat > /etc/fail2ban/jail.local <<'EOF'
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
[sshd]
enabled = true
EOF
systemctl enable --now fail2ban >/dev/null 2>&1 || true
journalctl --vacuum-time=3d 2>/dev/null || true
journalctl --vacuum-size=100M 2>/dev/null || true
find /tmp -type f -mtime +7 -delete 2>/dev/null || true
find /var/log -type f \( -name "*.gz" -o -name "*.old" \) -mtime +7 -delete 2>/dev/null || true
mkdir -p /etc/systemd/journald.conf.d
cat > /etc/systemd/journald.conf.d/99-size.conf <<'EOF'
[Journal]
SystemMaxUse=200M
MaxRetentionSec=7day
EOF
systemctl restart systemd-journald 2>/dev/null || true
  1. 保存后点 执行 跑一次,看日志成功即可

这个任务每周自动:更新系统、清理垃圾、限制日志;第一次跑还会完成 1G Swap、禁 Ping、防火墙、fail2ban。

第 6 步:以后更新

  • 额度正常:去 GitHub Actions 重新下载最新 blog-public,在 1Panel 文件里上传、解压覆盖,完成。
  • 额度用完(每月 1 号刷新):让 AI 帮你重新打包一份 public.zip,再上传、解压覆盖。

部署方案三:GitHub + Cloudflare Pages(推荐,本站现用)

免费、不限流量、自带全球 CDN,构建在 Cloudflare 那边自动完成,不占 GitHub Actions 额度,源码仓库私有也照常部署。构建命令是 pnpm run build(就是 hexo generate,主域名已经写死在配置里,不需要任何”vercel 专用”配置)。

第 1 步:连接仓库并部署

  1. 打开 https://dash.cloudflare.com 登录(没有就先注册,并把域名托管到 Cloudflare:Add a site → 选 Free 套餐 → 去域名注册商把 NS 记录改成 Cloudflare 给的)
  2. 左侧 Workers 和 PagesPages创建连接到 Git(Connect to Git)
  3. 第一次使用会跳去授权 GitHub:允许 Cloudflare Pages 访问(私有仓库也可以
  4. 仓库列表里选 my-blog开始设置(Begin setup)
  5. 构建配置照填:
配置项
生产分支 main
构建命令 pnpm run build
构建输出目录 public
  1. Node 版本不用设置(默认 Node 22)
  2. 保存并部署(Save and Deploy),等一两分钟构建完成,得到 xxx.pages.dev 预览网址
  3. 以后每次推送到 main 都会自动重新构建上线

第 2 步:绑定域名

  1. Pages 项目里 → 自定义域(Custom domains)设置自定义域
  2. 输入 blog.example.com继续
  3. 提示激活 DNS 时点 激活(自动加好橙色云记录)
  4. 等几分钟证书签发完成,https://blog.example.com 就是你的博客

想先测试再切主域名?先绑 cf.blog.example.com 对比速度,确认更快再把主域名绑上来。

第 3 步:缓存加速(强烈建议)

静态博客整站都可以缓存。缓存已经写进仓库的 source/_headers 文件(Hexo 构建时会自动放进 public/),Cloudflare Pages 每次部署都会自动应用,不用在后台手动配规则

  • /css//js//images/ 静态文件:缓存 1 个月,浏览器本地也缓存 1 个月,老访客二次打开几乎零加载
  • 页面(HTML 等):由 Cloudflare Pages 默认的实时校验(ETag)保证拿到的一定是新版,发完文章推上去就能看到,不用清缓存

Cloudflare 免费版本身还会自动开 Brotli 压缩和 HTTP/3,不用额外设置。

想验证缓存生效:部署完成后打开 https://blog.example.com ,按 F12 → Network,点开一个文件看响应头里的 cache-control

静态文件因为有新版本时基本是新的路径或查询参数(如 main.css?v=1.44.0),所以不用担心旧缓存;如果哪天改了同路径文件想立刻全部生效,去 Cloudflare 左侧 缓存 → 清除缓存 → 清除所有内容(Purge Everything) 即可。


日常使用小结

  • 写文章:GitHub 网页 → source/_posts/ → Add file(或本地写完推送)
  • 发动态:编辑 source/cross/index.md
  • 改标题/头像:编辑 _config.ymlsource/images/avatar.jpg
  • 评论:文章底部用 giscus,评论存在公开评论仓库的 Discussions 里
  • 图片:优先用 Cloudflare R2(见第 8 步),文章里贴链接

常见问题

问题 解决
部署失败(Cloudflare Pages) 检查构建命令是 pnpm run build、输出目录是 public;失败日志发我看
部署失败(Vercel) 确认导入的是你的仓库且构建配置没被改过;失败日志发我看
域名打不开 DNS 生效需要几分钟到几小时;Cloudflare 代理开启时 SSL 模式选”完全”
文章不更新 提交后等 1~2 分钟;刷新时按 Ctrl+F5
图片裂图 检查图床链接能不能直接在浏览器打开
图片想放 R2 存储 见第 8 步,上传后链接形如 https://img.你的域名/图片名.jpg
评论不能用 评论存放在公开的评论仓库(giscus):仓库要公开、Discussions 要开启、giscus App 要安装到该仓库;源码仓库私有不影响