工程

用 Go 与 SQLite 构建一个轻量内容管理系统

不需要 Node、不需要数据库服务、不需要复杂构建链。一个静态二进制加一个数据库文件,就能跑起一个完整、可被搜索引擎完全收录的内容站。

大多数内容站其实并不需要一套庞大的技术栈。它们要做的事情很朴素:把文章存起来,渲染成 HTML,让人和搜索引擎都能读到。当我们把需求收敛到这一点,Go + SQLite 这套组合的优势就变得格外清晰。

为什么是 Go 加 SQLite

Go 把整个应用编译成一个静态二进制文件,配合 embed.FS 可以把模板与静态资源一并打包进去。部署时不再有「装运行时、装依赖、配环境」的烦恼——scp 上传,运行,结束。

SQLite 则把数据库收敛成一个文件。没有独立的数据库进程,没有网络往返,读取延迟以微秒计。对于读多写少的内容站,这恰好是最舒服的形态。

把复杂留在编译期,把简单交给运行时。这是这套架构最朴素,也最值钱的一句话。

数据怎么建模

一个最小但够用的内容模型,通常只需要三张表:文章、分类、以及站点设置。文章表里,除了标题和正文,每一个 SEO 字段都应当独立成列,这样模板取值直接,索引也方便。

CREATE TABLE posts (
  id            INTEGER PRIMARY KEY,
  slug          TEXT NOT NULL,          -- 用于生成干净 URL
  title         TEXT NOT NULL,
  excerpt       TEXT,                   -- 列表与 description
  content       TEXT NOT NULL,          -- 正文(Markdown)
  lang          TEXT NOT NULL,          -- 语种(多语种关键)
  status        TEXT DEFAULT 'draft'
);

有了 slug,路由就能映射出 /posts/go-sqlite-cms 这样语义清晰、对 SEO 友好的地址,而不是 ?id=42

渲染:服务端,一次到位

这是整套方案里和 SEO 关系最紧的一环。我们用标准库的 html/template服务端把数据填进 HTML,返回给浏览器的是一份「已经写好的、完整的」页面。爬虫无需执行任何 JavaScript,就能拿到标题、正文与结构化数据。

小结

当你的目标是「把内容稳定、快速、可被收录地呈现出来」,Go + SQLite 提供了一条极短的路径:一个二进制、一个数据库文件、一份服务端渲染的 HTML。复杂度被压到最低,而该有的能力,一个都不少。