站点在本地跑起来之后,下一步就是让别人能打开它。静态站的好处是完全不需要服务器,直接挂在免费的托管服务上就行。

先明确一件事:site/ 目录就是整个网站。 里面全是 HTML、CSS、JS 和图片,没有任何需要服务端处理的东西。谁提供静态文件托管,谁就能跑这个站。

一、GitHub Pages

适合:代码已经在 GitHub 上、想顺手用仓库管理版本的人。

  1. 新建一个仓库,把站点文件推上去:
cd myblog
git init
git add .
git commit -m "first commit"
git branch -M main
git remote add origin git@github.com:你的用户名/仓库名.git
git push -u origin main
  1. 打开仓库的 Settings → Pages,Source 选 Deploy from a branch,分支选 main、目录选 / (root),保存。
  2. 等一两分钟,访问 https://你的用户名.github.io/仓库名/。

要想访问地址不带仓库名(https://你的用户名.github.io),得把仓库命名为 你的用户名.github.io。

注意:GitHub Pages 在公开仓库上免费,私有仓库需要付费套餐。另外默认构建有大小和流量上的软性限制,个人博客完全够用,具体额度以官方文档为准。

这个仓库可以同时放源码和产物:源码放 content/、build.py,产物提交到单独的 docs/ 目录,Pages 的目录就选 /docs。这样在 GitHub 上也能直接改文章、提交,线上自动更新。

二、Netlify

适合:不想碰 Git、想最快看到结果的人。

  1. 在本地构建好:python3 build.py
  2. 打开 app.netlify.com/drop,把 site 文件夹直接拖进去。
  3. 几秒后它给你一个 xxx.netlify.app 的地址,可以立刻分享。
  4. 要绑定自己的域名,去 Domain settings 添加,然后按提示在域名商那边加一条 CNAME 记录。

拖拽方式改文章不太方便(每次都得重新拖),所以更推荐把 GitHub 仓库连上去:构建命令留空,Publish directory 填 site。不过 Netlify 的构建环境没有 Python?——有的,build.py 只用到标准库,所以构建命令直接写 python3 build.py 也能跑通。

三、Cloudflare Pages

适合:想要无限流量、且域名已经托管在 Cloudflare 的人。

  1. 登录 Cloudflare 控制台 → Workers & Pages → Create → Pages;
  2. 连接 GitHub 仓库;
  3. Framework preset 选 None,Build command 填 python3 build.py,Build output directory 填 site;
  4. 保存部署,之后每次 git push 自动重新构建。

Cloudflare 的免费档在请求数和带宽上给得比较宽松,对个人站点基本等于不花钱。

自定义域名要做的三件事

  1. 在域名商那里把域名解析指向托管商给出的地址(CNAME 或 A 记录);
  2. 在托管商那里添加自定义域名,开启 HTTPS(三家都提供免费证书,一般自动签发);
  3. 回到 build.py,把 CONFIG 里的 site_url 改成你的真实域名——它会影响 RSS 和 sitemap 里的链接,不改的话订阅器里的文章链接会指向 example.com。
CONFIG = {
    "title": "我的博客",
    "site_url": "https://your-domain.com",   # ← 改这一行
    ...
}

关于国内访问

如果服务器在境外(以上三家都是),国内访问速度看线路,有些时候会不稳定。三个选择:

  • 用 Cloudflare 的 CDN 加速(免费),通常能改善;
  • 换国内的静态托管或对象存储(OSS/COS + CDN),访问快,但自定义域名需要 ICP 备案,流程少则一两周;
  • 先不管,反正是给自己和搜索结果看的,慢一点也能接受。

我的选择是先跑起来,真的有人反馈慢再优化。不要在建站第一天就去折腾备案和 CDN。

部署完的检查清单

  • 首页能打开,样式正常(不是一堆没样式的纯文字)
  • 随便点一篇文章,上一页/下一页能跳转
  • 搜索页输入关键词能出结果(注意:必须通过 http 访问,本地直接双击 HTML 文件会因为浏览器安全策略加载不了 index.json)
  • 深色模式切换正常,刷新后保持
  • /feed.xml 能被浏览器正常解析(打开不是报错页)
  • 手机上打开看一眼,字号和边距是否还舒服