<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
  <title>jemai</title>
  <link>https://jemai.cc/zh/</link>
  <description>一份关于边缘推理与小团队工程的技术博客。文章以一种语言写成，发布为中文、英文、日文、西班牙文和阿拉伯文。</description>
  <language>zh-CN</language>
  <lastBuildDate>Sat, 17 Oct 2026 15:19:38 GMT</lastBuildDate>
  <atom:link href="https://jemai.cc/zh/rss.xml" rel="self" type="application/rss+xml"/>
  <item>
    <title>0 技术基础、0 费用：30 分钟搭好你的顶级域名独立博客（CF CMS 保姆级教程）</title>
    <link>https://jemai.cc/zh/posts/zero-cost-blog-cf-cms</link>
    <guid isPermaLink="true">https://jemai.cc/zh/posts/zero-cost-blog-cf-cms</guid>
    <pubDate>Sat, 17 Oct 2026 11:55:13 GMT</pubDate>
    <description>不会写代码、不想租服务器？用开源 CF CMS + Cloudflare 免费套餐，除了域名本身一分钱不花，一条命令部署带顶级域名、五种语言、AI Agent 可运维的独立博客。附完整步骤与常见报错速查。</description>
    <content:encoded><![CDATA[<p>你有没有过这种时刻：</p>
<p>在平台上写了两年，<strong>一次限流、一次封号，内容和粉丝说没就没</strong>。</p>
<p>想搭个属于自己的博客，一搜教程：买服务器、装环境、配 Nginx、上 HTTPS、天天防攻击……还没开始写，就先被劝退了。</p>
<p>今天这篇，就是写给你的。</p>
<p>我会带你用开源项目 <strong>CF CMS</strong>，在 Cloudflare 上搭一个<strong>带顶级域名的独立博客</strong>。你现在看到的这个站，就是这么搭起来的。</p>
<p>先把话说在前面：</p>
<ul>
<li><strong>0 技术基础</strong>：不用会写代码。全程就是<strong>复制、粘贴、回车</strong>；嫌麻烦，还可以把命令直接交给 AI Agent 去跑。</li>
<li><strong>0 费用</strong>：<strong>除了域名本身</strong>（便宜的后缀一年几美元），网站、数据库、图片存储、自动翻译全部跑在 Cloudflare 免费套餐上，<strong>不用租服务器</strong>。</li>
</ul>
<p>准备好了吗？我们开始。</p>
<h2 id="先看结论-你能得到什么">先看结论：你能得到什么</h2>
<ul>
<li>✅ 一个属于你自己的顶级域名，比如 <code>yourdomain.com</code></li>
<li>✅ 自动 HTTPS + 全球 CDN，打开速度不输大站</li>
<li>✅ <strong>中、英、日、西、阿五种语言</strong>，写一篇中文，保存时自动翻译</li>
<li>✅ 8 套预制模板 + 一键生成 logo、favicon、主题色</li>
<li>✅ 后台藏在随机秘密路径后面，直接访问 <code>/admin</code> 是 404</li>
<li>✅ 自带 MCP 接口，<strong>以后让 AI Agent 帮你发文章、改设置</strong></li>
</ul>
<p>你需要准备的只有三样：</p>
<ul>
<li><input disabled="" type="checkbox"> 一个域名（下面教你买）</li>
<li><input disabled="" type="checkbox"> 一个 Cloudflare 免费账号</li>
<li><input disabled="" type="checkbox"> 一台能打开终端的电脑（macOS / Linux；Windows 建议用 WSL）</li>
</ul>
<h2 id="一张图看懂-它到底跑在哪">一张图看懂：它到底跑在哪</h2>
<p><img src="/media/images/2026/10/a6f004bc-9cee-4ad5-ad9e-e1ba0ae6e689.png" alt="CF CMS 架构图：访客通过 yourdomain.com 访问，经 Cloudflare DNS 与 CDN，到达 Pages Functions，后端是 D1 数据库、R2 图片存储和 Workers AI 翻译" loading="lazy" decoding="async"></p>
<p>简单说：</p>
<ul>
<li><strong>Pages</strong>：网站本体，负责渲染页面</li>
<li><strong>D1</strong>：数据库，存文章、标签、设置</li>
<li><strong>R2</strong>：存图片</li>
<li><strong>Workers AI</strong>：你保存文章时，帮你翻译成另外四种语言</li>
</ul>
<p><strong>没有一台需要你维护的服务器。</strong> 打补丁、扩容、防 DDoS，都是 Cloudflare 的事。</p>
<h2 id="全流程一图看懂-8-步">全流程一图看懂：8 步</h2>
<p><img src="/media/images/2026/10/8c5ccb23-d13f-4d5f-8ccf-822fa287c2ff.png" alt="从 0 到上线的 8 个步骤：买域名、接入 Cloudflare、建 API Token、开通 R2、拿代码、一条命令部署、进隐藏后台、写作与运维" loading="lazy" decoding="async"></p>
<p>顺利的话 <strong>30–60 分钟</strong>。其中真正需要你动脑的，只有第 1 步：<strong>起个好名字</strong>。</p>
<h2 id="第-1-步-选购域名">第 1 步：选购域名</h2>
<p>域名是你在互联网上的门牌号，也是这套方案里<strong>唯一要花钱的地方</strong>。</p>
<p>在任意一家正规注册商购买都可以，比如 Spaceship、Cloudflare Registrar、Namecheap。<strong>选一家价格透明、续费不坑、支持 WHOIS 隐私保护的就行。</strong></p>
<p>挑域名的 3 个小建议：</p>
<ol>
<li><strong>短、好记、好拼</strong>。能口述给朋友听的，就是好域名。</li>
<li><strong>看续费价，别只看首年价</strong>。有些后缀首年很便宜，第二年翻好几倍。</li>
<li>后缀不必执着 <code>.com</code>：<code>.cc</code>、<code>.dev</code>、<code>.me</code> 都很适合个人博客。</li>
</ol>
<h2 id="第-2-步-把域名接入-cloudflare">第 2 步：把域名接入 Cloudflare</h2>
<ol>
<li>打开 Cloudflare 官网，注册一个<strong>免费账号</strong>。</li>
<li>点 <strong>Add a site / 添加站点</strong>，输入你的域名，套餐选 <strong>Free</strong>。</li>
<li>Cloudflare 会给你**两个 Nameserver（名称服务器）**地址。</li>
<li>回到你买域名的注册商后台，把 Nameserver 改成这两个。</li>
<li>等几分钟到几小时，Cloudflare 显示 <strong>Active</strong> 就成了。</li>
</ol>
<p><strong>关键点：域名要和后面部署用的，是同一个 Cloudflare 账号。</strong> 安装脚本会用 API Token 去找这个域名。</p>
<h2 id="第-3-步-创建-api-token-照抄就行">第 3 步：创建 API Token（照抄就行）</h2>
<p>路径：Cloudflare 右上角头像 → <strong>My Profile → API Tokens → Create Token → Create Custom Token</strong>。</p>
<p>按下面这张图，一项一项勾上：</p>
<p><img src="/media/images/2026/10/0a5a224c-c80d-4c9c-a7bc-34c19abdc3f9.png" alt="Cloudflare API Token 权限清单：Account 级 Cloudflare Pages Edit、D1 Edit、Workers R2 Storage Edit、Account Settings Read；Zone 级 Zone Read、DNS Edit" loading="lazy" decoding="async"></p>
<ul>
<li>Account · Cloudflare Pages · <strong>Edit</strong></li>
<li>Account · D1 · <strong>Edit</strong></li>
<li>Account · Workers R2 Storage · <strong>Edit</strong></li>
<li>Account · Account Settings · <strong>Read</strong></li>
<li>Zone · Zone · <strong>Read</strong>（要绑自己的域名时）</li>
<li>Zone · DNS · <strong>Edit</strong>（要绑自己的域名时）</li>
</ul>
<p>两个提醒：</p>
<ul>
<li><strong>Workers AI 不用额外权限</strong>，网站运行时走 Pages 的 AI 绑定。</li>
<li><strong>这个 Token 只给安装脚本用，别交给写作 Agent。</strong> 生成后只显示一次，先存好。</li>
</ul>
<h2 id="第-4-步-开通-r2">第 4 步：开通 R2</h2>
<p>R2 是放图片的地方，<strong>必须提前在控制台手动开通</strong>，脚本没法替你点。</p>
<p>进入 Cloudflare 控制台左侧的 <strong>R2</strong>，点开通即可。</p>
<p>⚠️ 实话实说：<strong>有的账号开通 R2 时要先绑一张卡或 PayPal</strong>。别慌，绑了不等于扣钱，<strong>在免费额度（10 GB 存储）以内不收费</strong>。一个个人博客的图片，很难用完。</p>
<p>我第一次部署就卡在这里：脚本跑到一半报 <code>10042</code>，原因就是 R2 没开通。开通之后重跑，一次过。</p>
<h2 id="第-5-步-拿到代码">第 5 步：拿到代码</h2>
<p>CF CMS 是开源的，代码在 GitHub：<code>github.com/jemkuo/cf-cms</code></p>
<p>二选一：</p>
<ul>
<li><strong>推荐</strong>：在 GitHub 上点 <strong>Fork</strong>，复制一份到你自己的账号，以后改起来方便。</li>
<li>或者直接克隆：</li>
</ul>
<pre class="code"><code class="language-bash">git clone https://github.com/jemkuo/cf-cms.git
cd cf-cms</code></pre>
<p>电脑上需要先装好 <strong>Node.js 20 或更新版本</strong>（官网下载安装包，一路下一步）。</p>
<h2 id="第-6-步-一条命令部署">第 6 步：一条命令部署 ⭐</h2>
<p>这是整篇最核心的一步。先把第 3 步的 Token 放进环境变量（<strong>它只存在你的终端里，脚本不会打印出来</strong>）：</p>
<pre class="code"><code class="language-bash">export CLOUDFLARE_API_TOKEN=粘贴你的token</code></pre>
<p>然后，<strong>一条命令</strong>：</p>
<pre class="code"><code class="language-bash">npm install &amp;&amp; ./scripts/setup.sh --project myblog --domain yourdomain.com</code></pre>
<p>把 <code>myblog</code> 换成你想要的项目名，<code>yourdomain.com</code> 换成你的域名。</p>
<p>不放心？先加 <code>--dry-run</code> 预演一遍，<strong>只检查、不创建任何东西</strong>：</p>
<pre class="code"><code class="language-bash">./scripts/setup.sh --project myblog --domain yourdomain.com --dry-run</code></pre>
<h3 id="它会先给你做一次-体检">它会先给你做一次「体检」</h3>
<p>脚本动手之前，会打印一份<strong>预检清单</strong>：Token、账号、Pages、D1、R2、域名，逐项打勾。</p>
<p><img src="/media/images/2026/10/9ca9725b-50b7-4b8b-b3e4-ed7e2a71ed4c.png" alt="setup.sh 预检清单终端示意：第一次运行时 R2 未开通显示错误 10042，开通 R2 后重跑全部通过，并提示域名已有旧 DNS 记录" loading="lazy" decoding="async"></p>
<ul>
<li><strong>全是 ✓</strong>：自动建 D1 数据库、R2 存储桶、Pages 项目、各种密钥，然后发布网站。</li>
<li><strong>有 ✗</strong>：<strong>一个资源都不建</strong>，直接告诉你哪一步有问题、去控制台哪里改、改完用哪条命令重跑，中英文都有。</li>
<li><strong>account id 不用自己找</strong>：Token 只能看到一个账号时，脚本自动填。</li>
</ul>
<h3 id="半路失败-直接重跑">半路失败？直接重跑</h3>
<p>进度记在本地的 <code>.cf-cms-setup.json</code> 里。<strong>重跑会接着做</strong>，已经建好的 D1、R2、Pages 都会复用，不会重复创建，也不会清空你的文章。</p>
<h3 id="域名上有旧记录-它会先问你">域名上有旧记录？它会先问你</h3>
<p>如果你的域名以前指向别的服务器，脚本会<strong>先列出旧的 A / AAAA / CNAME 记录，默认不删</strong>。</p>
<p>你确认可以替换后，加上 <code>--replace-dns</code> 重跑（或者在提示里回答 <code>y</code>），它会换成一条指向 Pages 的 CNAME：</p>
<p><img src="/media/images/2026/10/311e3ccb-67f2-44e3-bdcf-b47ddc7c22fb.png" alt="DNS 记录切换前后对比：两条指向旧服务器的 A 记录被替换为指向 yourproject.pages.dev 的橙色云 CNAME，TXT 验证记录保留" loading="lazy" decoding="async"></p>
<p><strong>注意</strong>：替换之后，旧服务器在这个域名上的服务就访问不到了。TXT 之类的其他记录会保留。</p>
<h3 id="跑完之后">跑完之后</h3>
<p>终端最后会打印一行 <strong>Admin 地址</strong>，长这样：</p>
<pre class="code"><code class="language-text">Admin:      https://yourdomain.com/&lt;ADMIN_SAFEPATH&gt;/admin/</code></pre>
<p>后台密码是<strong>随机生成</strong>的，写在项目目录的 <code>.dev.vars</code> 文件里，<strong>不会显示在屏幕上</strong>。</p>
<p>👉 <strong>把 Admin 地址和 <code>.dev.vars</code> 一起存好</strong>，这就是你博客的钥匙。</p>
<p>域名状态如果显示 <code>pending</code>，别急，证书签发和 DNS 生效一般要几分钟。</p>
<h2 id="第-7-步-进入隐藏后台-换上你的风格">第 7 步：进入隐藏后台，换上你的风格</h2>
<p>打开那个 Admin 地址，输入密码：</p>
<p><img src="/media/images/2026/10/27918977-8d29-4389-831d-ba5b8c5c96c2.png" alt="CF CMS 隐藏后台登录页真实截图，地址为 yourdomain.com/&lt;ADMIN_SAFEPATH&gt;/admin/" loading="lazy" decoding="async"></p>
<p><strong>为什么要藏起来？</strong> 绝大多数扫描器都在撞 <code>/admin</code>、<code>/wp-login</code>。CF CMS 的后台在一串随机路径后面，直接访问 <code>/admin</code> 返回 404，连登录框都看不到。</p>
<p>进去之后先做两件事：</p>
<ol>
<li><strong>选模板</strong>：个人技术博客（Dispatch、Signal）、生活方式（Atelier、Hearth）、企业首页（Practice、Civic）、科技公司（Launch、Orbit），外加原创的 Paper、Ink、Terminal。</li>
<li><strong>一键生成视觉套件</strong>：点 <strong>Generate visual kit</strong>，自动生成和模板配套的 <strong>logo、favicon、主题色</strong>。不满意就再生成，或者换成自己的图。</li>
</ol>
<h2 id="第-8-步-写文章-自动变成五种语言">第 8 步：写文章，自动变成五种语言</h2>
<p>新部署的站点自带几篇示例文章，你可以先看看效果：</p>
<p><img src="/media/images/2026/10/11177172-d757-4c54-b968-62443f0e7e0a.png" alt="CF CMS 部署完成后的博客首页真实截图，默认 Paper 模板，顶部可切换中英日西阿五种语言" loading="lazy" decoding="async"></p>
<p>看完删掉，写你自己的：</p>
<ul>
<li>用 <strong>Markdown</strong> 写，标题、列表、代码块、图片都支持</li>
<li>图片直接上传，存进 R2</li>
<li><strong>保存时勾选翻译</strong>，Workers AI 自动生成英、日、西、阿四个版本（阿拉伯语自动从右往左排版）</li>
<li>每篇文章可以单独设置 SEO：关键词、canonical、Open Graph 分享图</li>
</ul>
<p><strong>写一次，五种语言的读者都能搜到你。</strong> 这是很多大平台都给不了的。</p>
<h2 id="日常运维-让-ai-agent-当你的编辑">日常运维：让 AI Agent 当你的编辑</h2>
<p>博客上线只是开始。真正省心的，是<strong>日常运维几乎可以交给 AI</strong>。</p>
<h3 id="1-一句话接入-ai-agent">1. 一句话接入 AI Agent</h3>
<p>CF CMS 自带 MCP 接口（地址是你域名下的 <code>/mcp</code>）。在 Cursor、Claude 等支持 MCP 的客户端里，<strong>贴一段项目 README 里现成的「一句话说明」</strong>，再把 <code>.dev.vars</code> 里的 <code>ADMIN_API_TOKEN</code> 填进去，Agent 就能：</p>
<ul>
<li>列出、创建、修改、发布、删除文章</li>
<li>管理标签、栏目、模板、logo</li>
<li>上传图片</li>
</ul>
<p>接上之后，你可以直接说：</p>
<blockquote>
<p>「帮我建一篇中文草稿，slug 叫 edge-notes，放到 notes 栏目，并翻译成其他语言。」</p>
</blockquote>
<p><strong>安全设计</strong>：<code>ADMIN_API_TOKEN</code> 只能管内容，<strong>动不了部署，也碰不到你的 Cloudflare 账号</strong>。这也是为什么第 3 步的 Cloudflare Token 不要给 Agent。</p>
<h3 id="2-定期轮换密钥">2. 定期轮换密钥</h3>
<p>觉得密码或 Token 可能泄露了？一条命令换掉：</p>
<pre class="code"><code class="language-bash">npx wrangler pages secret put ADMIN_PASSWORD --project-name myblog</code></pre>
<p><code>ADMIN_API_TOKEN</code>、<code>SESSION_SECRET</code> 也一样。部署完成后，第 3 步那个 Cloudflare API Token 也可以删掉或轮换，等下次部署再新建。</p>
<h3 id="3-免费额度心里有数">3. 免费额度心里有数</h3>
<table>
<thead>
<tr>
<th>资源</th>
<th>在博客里干什么</th>
<th>常见免费额度</th>
</tr>
</thead>
<tbody><tr>
<td>Pages</td>
<td>网站和 Functions</td>
<td>每月 500 次构建，每天 10 万次 Functions 请求</td>
</tr>
<tr>
<td>D1</td>
<td>文章、设置</td>
<td>5 GB，按天限制读写行数</td>
</tr>
<tr>
<td>R2</td>
<td>图片</td>
<td>10 GB 存储，有限次数的读写操作</td>
</tr>
<tr>
<td>Workers AI</td>
<td>保存时翻译</td>
<td>每天 10,000 Neurons</td>
</tr>
</tbody></table>
<p>额度以 Cloudflare 控制台为准。<strong>个人博客的流量，基本碰不到天花板。</strong> 翻译只在保存时跑，不是每次有人访问都跑，Workers AI 额度每天重置。</p>
<h3 id="4-常见报错速查">4. 常见报错速查</h3>
<table>
<thead>
<tr>
<th>你看到的</th>
<th>怎么办</th>
</tr>
</thead>
<tbody><tr>
<td><code>✗ R2 is not enabled</code>，错误 <strong>10042</strong></td>
<td>去控制台开通 R2（可能要先绑付款方式），然后重跑</td>
</tr>
<tr>
<td>Token 无效（<strong>10000</strong>）或权限不足（<strong>9109</strong>、HTTP 403）</td>
<td>按第 3 步的清单补齐权限，重新 <code>export</code> 后重跑</td>
</tr>
<tr>
<td>域名一直 <strong>pending</strong></td>
<td>看脚本列出的旧 A / AAAA / CNAME，确认后加 <code>--replace-dns</code> 重跑；DNS 对了之后证书还要几分钟</td>
</tr>
<tr>
<td>Pages 项目名被占用</td>
<td>换一个 <code>--project</code> 名字</td>
</tr>
<tr>
<td>D1、R2、Pages 已存在</td>
<td>直接重跑，同名资源会复用</td>
</tr>
<tr>
<td>网络错误</td>
<td>检查网络后重跑，做完的步骤会跳过</td>
</tr>
</tbody></table>
<p><strong>记住一句话：报错了，先看提示，改完重跑。</strong> 脚本会告诉你去哪改、怎么跑。</p>
<h2 id="关于-0-技术基础-说句实话">关于「0 技术基础」，说句实话</h2>
<p>这套流程里，你确实要打开终端、敲几条命令。</p>
<p>但你<strong>不需要理解</strong>它们在干嘛。你要做的只是：</p>
<ol>
<li>复制命令</li>
<li>粘贴到终端</li>
<li>回车，看有没有 ✗</li>
</ol>
<p>更懒的办法：<strong>把这篇文章和 README 丢给你的 AI Agent，让它替你跑。</strong> 它卡住的时候，要么是要你去控制台点一下（比如开通 R2），要么是要你确认一下（比如替换 DNS），跟着提示做就行。</p>
<h2 id="算一笔账">算一笔账</h2>
<table>
<thead>
<tr>
<th>项目</th>
<th>费用</th>
</tr>
</thead>
<tbody><tr>
<td>域名</td>
<td><strong>每年几美元起</strong>（看后缀）</td>
</tr>
<tr>
<td>服务器</td>
<td>0（Cloudflare Pages）</td>
</tr>
<tr>
<td>数据库</td>
<td>0（D1 免费额度）</td>
</tr>
<tr>
<td>图片存储</td>
<td>0（R2 免费额度）</td>
</tr>
<tr>
<td>五语翻译</td>
<td>0（Workers AI 免费额度）</td>
</tr>
<tr>
<td>HTTPS 证书 + CDN</td>
<td>0</td>
</tr>
<tr>
<td>CMS 软件</td>
<td>0（开源）</td>
</tr>
</tbody></table>
<p><strong>除了域名，一分钱不花。</strong></p>
<h2 id="最后">最后</h2>
<p>平台给你流量，但地盘永远是平台的。</p>
<p><strong>独立博客才是你的数字资产</strong>：域名是你的，内容是你的，读者能直接找到你。</p>
<p>今天就迈出第一步：<strong>挑一个你喜欢的域名，照着这篇走一遍。</strong></p>
<p>搭建过程中遇到问题，欢迎留言。觉得项目有用，也欢迎去 GitHub 给 CF CMS 点个 ⭐。</p>
<p>下一篇，我们聊聊<strong>怎么让 AI Agent 每天帮你运营这个博客</strong>。</p>
]]></content:encoded>
    <category>CF CMS</category>
    <category>Cloudflare</category>
    <category>独立博客</category>
    <category>建站教程</category>
  </item>
</channel>
</rss>
