CoreBunch/Instatic
GitHub: CoreBunch/Instatic
Instatic 是一个基于 Bun 运行时的自托管可视化 CMS,将设计编辑器、内容引擎、表单、媒体管理和发布器整合在单一服务中,输出干净的静态化页面代码。
Stars: 3369 | Forks: 294
# Instatic
**拥有你的网站。享受构建的过程。**
一个自托管的 CMS,其可视化编辑器、内容引擎和发布器都运行在一个 Bun 服务器中——并且它生成的页面代码足够整洁,完全可以直接查看源代码。
[](https://github.com/corebunch/instatic/releases)
[](https://github.com/corebunch/instatic/stargazers)
[](LICENSE)
[](https://bun.sh)
[](https://www.typescriptlang.org/)
[一键部署](#deploy-in-one-click) · [快速开始](#quick-start) · [文档](docs/README.md) · [插件](docs/features/plugin-system.md) · [路线图](#early-on-purpose)
*在 YouTube 上观看关于 Instatic 的介绍视频。*
*在 YouTube 上观看关于 Instatic 的介绍视频。*
一个现代网站通常意味着需要组装一套技术栈:一个 headless CMS、一个框架、一个主机托管服务、一个表单服务、一个数据分析商、一个图像 CDN——每一项都有自己的账单、控制台,以及可能在凌晨两点发生的服务中断。Instatic 则反其道而行之。一个 Bun 服务器承载了所有内容——画布编辑器、内容引擎、媒体、身份验证、表单、插件以及发布器——你可以将它部署在任何你喜欢的地方,由 SQLite 或 Postgres 提供支持。 而最终输出的是大多数构建者通常会妥协的部分:纯净的语义化 HTML 和紧凑的 CSS,页面中不会残留任何编辑器的机械代码。没有框架的运行时,没有构建器属性,没有杂乱无章的 div 堆叠。网站加载起来就像一个静态文件一样,因为在大多数情况下,它就是一个静态文件。 **MIT 协议。自托管。完全属于你。**
## 一键部署 Railway 是让 Instatic 上线最快的方式。选择一个模板,点击按钮,等待大约两分钟。就这样。它会自动生成密钥、挂载存储卷,并自行设置健康检查。你完全不需要打开终端。
*一分钟上线。无剪辑。*
| 服务商 | 数据库 | 最适合 | 部署 | |---|---|---|---| | **Railway** · *推荐* | SQLite | 单一站点 —— 博客、作品集、小型企业 | [部署 →](https://railway.com/deploy/instatic-cms-sqlite?referralCode=Zm9bVJ&utm_medium=integration&utm_source=template&utm_campaign=generic) | | **Railway** | Postgres | 多作者、托管备份、扩展空间 | [部署 →](https://railway.com/deploy/instatic-cms-postgres?referralCode=Zm9bVJ&utm_medium=integration&utm_source=template&utm_campaign=generic) | | **Render** | SQLite 或 Postgres | 偏好 Render 服务、磁盘和托管 Postgres 的团队 | [指南 →](docs/deployment/render.md) | | **Docker / VPS** | SQLite 或 Postgres | 自带服务器、Caddy TLS、自定义备份策略 | [指南 →](docs/deployment/vps.md) | SQLite 是最适合大多数网站的默认选项。当你拥有一个创作者团队或想要托管数据库备份时,请选择 Postgres。 ### 更新只是重新部署 当有新的 Instatic 版本可用时,通过重新部署最新镜像即可进行更新。你的数据库和上传文件保留在挂载的存储卷中,因此可以在不从头重新构建网站的情况下替换应用容器。 更喜欢使用你自己的硬件?Instatic 是一个单一的 Docker 镜像: ``` INSTATIC_IMAGE=ghcr.io/corebunch/instatic:latest docker compose -f compose.prod.yml -f compose.sqlite.yml up -d ``` 关于 VPS、Postgres、使用 Caddy 配置 HTTPS、Render 以及备份的完整指南位于 [docs/deployment](docs/deployment/README.md)。
## 一个工具,覆盖网站的一生 大多数工具只做一项工作,剩下的就交给你自己去处理。你在一个地方设计,在另一个地方构建,内容存放在其他地方,然后再从第四个地方加上分析功能。Instatic 把这些全包了。以下是它实际包含的内容。 ### 🎨 设计
编辑器是一个真正的画布,而不是一个生硬拼接了预览窗格的表单。你可以将多个断点框架并排放置并一起编辑。在同一个视图中修改桌面端,移动端框架也会同步反应。当你想要直接在真实页面上工作时,切换到实时模式,直接在原处编辑单个全尺寸页面。
其他产品没有的部分:**内置 [Core Framework](https://coreframework.com)。** 这是成千上万的 WordPress 专业人员每天都在使用的设计 token 引擎,在这里它是一个核心系统,而不是一个你安装后只能听天由命的插件。
- **能自动生成色阶的颜色 token。** 定义一个品牌色,即可自动获得全套经过调校的色调和阴影。
- **流畅且符合数学逻辑的字体缩放。** 一个随视口缩放的坡度,而不是四十个你必须手动保持同步的字号。
- **间距缩放**,确保每个页面和每个断点都保持相同的节奏。
- **一个实用类生成器**,将锁定的、生成的类输出到一个很小的 `framework.css` 中。没有臃肿,没有重复的规则,没有任何你不需要的东西。
你的整个设计系统以数据形式存在。修改一个 token,所有使用它的页面都会自动更新。
### 🧱 构建
- **模块 (Modules)** 是构建块:容器、文本、图像、按钮、视频、列表、链接、SVG、表单。将它们拖放到画布上,并按你想要的方式嵌套。
- **可视化组件 (Visual Components)** 是具有类型化参数和命名插槽的可复用部件。参数可以是字符串、数字、布尔值、颜色、图像、URL、富文本、枚举,或整个内容插槽。只需编辑一次组件,站点上的每个实例都会更新。可能会相互引用的组件会在发生前被拦截,因此不会出现死循环。
- **模板 (Templates)** 负责处理共享的页面外壳。整个站点使用一个布局,每种文章类型使用单独的布局,以及一个由你自己设计的真正的 404 页面。内容流入一个出口,因此页眉和页脚只需编写一次即可包裹所有内容。
- **循环 (Loops)** 可在一个集合上重复布局:你的文章、页面、媒体,或任何插件作为源暴露的内容。为一个循环设定几个变体,它就会在运行时在它们之间交替。非常适合用于文章列表、产品网格、画廊。
- **属于你 CMS 的表单。** 通过语义化字段构建表单,提交的数据将直接进入你自己的数据表中。Instatic 可以读取你放置的字段,并为你创建匹配的表。无需第三方表单服务,无需嵌入代码,无需为联系表单支付月费。
- **一个能真正编辑页面的 AI agent。** 描述你想要的内容,它就会在画布上将其构建为真实的、可编辑的节点,而不是截图或一大段代码。它通过你粘贴标记时使用的相同导入管道,编写语义化 HTML 来构建结构,并使用 CSS 来定义样式。35 个工具的 Site 作用域用于构建页面;15 个工具的 Content 作用域用于编辑条目。自带你的模型:Claude、OpenAI、OpenRouter,或本地的 Ollama。你的密钥,你的模型,你买单。
- **可靠的导入功能。** 粘贴原始 HTML 即可获得可编辑的节点。或者投入一整个静态站点 —— HTML、CSS、图像、字体 —— Super Import 会将其转换为页面、样式规则、设计 token 和媒体。在写入任何内容之前,每个冲突都会展示给你,并且整个导入过程只需一次撤销即可恢复。
### 🗂 管理
- **底层统一的内容模型。** 页面、文章、组件、自定义集合,以及你创建的任何结构化表,都存储在同一个地方:`data_tables` 和 `data_rows`。没有隐藏在角落里的特殊“页面”表。schema、原始数据行、导入、导出和表单提交都位于一个一致的位置。
- **一个由你设计自己集合的数据工作区。** 在 `/admin/data` 中,你可以创建具有自己字段的自定义文章类型和自定义数据表,然后在类似电子表格的网格中处理这些数据行:搜索、排序、过滤、批量发布、批量导出。自定义文章类型配备了真正的编辑工作流 —— 草稿、定时、已发布 —— 并且已发布的副本具有版本历史记录。普通数据表是简单的网格,你可以将其用于任何用途:表单提交、产品目录、轻量级 CRM、推荐语列表。你构建的每个表都是循环可以渲染的内容源。只需定义一个“团队”表,将其循环输出到关于页面上,就完成了。
- **专用于写作的内容工作区。** 为文章和集合提供了一个专注的界面,并支持实时模式,以便作者在站点的真实设计中进行编辑,而不是在灰色的文本域中。
- **一个像文件管理器一样工作的媒体工作区。** 文件夹和智能文件夹、批量操作、使用情况跟踪(让你知道文件实际在哪里被使用)、替换工作流,以及当你不再满足于本地磁盘时可插拔的存储适配器。
- **真正而非装饰性的访问控制。** 角色由 38 项能力构建而成,基于 token 的会话,静态加密密钥的 TOTP 双因素身份验证,在多次失败后具有退避机制的账户锁定,以及在执行危险操作(如删除用户或登出所有设备)之前的提权提示。
- **⌘K 无所不能。** 覆盖整个后台的模糊搜索命令面板。无需触摸鼠标,即可跳转到任何地方,执行任何操作。
- **草稿始终是草稿。** 未发布的编辑内容永远不会泄露给访客。你没有发布的内容,他们就看不到。
### 📊 分析
- **一个由你自己安排的控制台。** 一个由平铺小部件组成的 12 列网格,你可以拖拽、调整大小和重新排列。在自定义模式下添加你关心的小部件,布局会按用户分别保存。插件也可以将自己的小部件投射到同一个网格中。
- **不会遗忘的审计日志。** 每一个有意义的后台操作都会写入一条记录:登录、内容更改、角色编辑、插件生命周期。它是只追加的,因此它是关于谁在何时做了什么的真正记录,而不是任何人都可以悄悄重写的东西。
- **完全属于你的表单数据。** 提交的数据就存放在你自己的表中。查询它们、导出它们、基于它们进行构建。中间没有任何供应商。
如今的分析层面有意侧重于运营:控制台状态、审计历史和自有的表单数据,而不是第三方的访客跟踪。
### 🔌 扩展
每个 CMS 都有插件。这里的区别在于后端插件代码的运行位置。
Instatic 插件是一个带有清单的 zip 包。它的服务器入口点运行在一个专属插件 worker 中,该 worker 托管着一个 **QuickJS-WASM 沙盒**:没有文件系统,没有环境变量,除非站点所有者明确授予,否则完全没有任何网络访问权限,且一次只能访问一个主机。编辑器扩展和应用类的后台页面则不同:它们在管理窗口中运行,并且在安装前需要显式的 `editor.code` 权限。
通过 SDK,插件可以添加:
- HTTP 路由及其专属的后台页面
- 存储和定时后台任务
- 循环数据源,让你的内容循环可以从任何地方拉取数据
- 画布模块 —— 出现在编辑器中的新构建块
- 媒体存储适配器和前端资源
- 跨安装、激活及后续过程的生命周期钩子
从[插件系统文档](docs/features/plugin-system.md)和[模板插件](examples/plugins/template/README.md)开始了解。
## 快速,因为几乎不需要加载任何内容 一个已发布的 Instatic 页面基本上就是一个存放在磁盘上的文件。无需启动框架,没有注水步骤,在常规的访问路径上也没有数据库的往返。浏览器只需拉取语义化 HTML 和紧凑的 CSS 包就完成了。访客和内容之间几乎没有间隔,因此页面感觉是瞬间加载的。 这种速度不是你调试出来的设置。它是发布工作方式的自然结果,分为三个你永远不需要去操心的层级: - **静态页面在发布时直接固化到磁盘上**,并以原子方式替换。访客获得的是文件,而不是渲染结果。 - **确实会发生变化的路由**会命中带版本控制的内存缓存。发布会提升版本号,因此旧条目会延迟失效,没有人会看到过时的页面。 - **极少数真正因访客而异的部分**会被自动检测,并由一个大小约为 1.1 kB 的运行时进行延迟加载。比这一段文字还要小。 最终输出的是彻头彻尾的纯 HTML 和紧凑的 CSS。编辑器中的任何东西都不会被带入其中:你的公开页面上没有 React,没有编辑器运行时,标记中也没有框架。而且因为只有 HTML 和 CSS,没有什么能绑架你的网站——你可以查看它,把它托管在任何地方,或者带走它然后离开。完整设计:[发布器](docs/features/publisher.md)。
## 快速开始 你需要 [Bun](https://bun.sh)。仅此而已。默认的开发环境运行在 SQLite 上,因此不需要搭建任何额外的服务。 ``` git clone https://github.com/corebunch/instatic.git cd instatic bun install bun run dev ``` 打开 `http://:5173`。首次访问将引导你完成站点和所有者账户的创建。 想看看它实际发布后的样子?`bun run start` 会构建后台程序,并从位于 `http://localhost:3001/admin` 的 Bun 服务器上提供服务。
## 背后的团队 我们是 **[Motion.page](https://motion.page)** 和 **[Core Framework](https://coreframework.com)** 背后的团队——成千上万的人使用这些工具以构建网站为生,主要是在 WordPress 世界中。 我们花了很多年时间让其他平台变得更易于使用。在某个时刻,一个显而易见的问题挥之不去:如果底层的工具一开始就是完全正确的呢?没有需要变通解决的遗留问题,没有我们不被允许触碰的标记,也没有依赖于将你的网站保留在我们监管范围内的商业模式。 所以我们构建了 Instatic。并且我们把 Core Framework 也引入了进来,作为核心系统接入,这样我们的用户已经依赖的颜色阴影、字体缩放、间距和实用类就成为了产品的一部分——而不是一个你安装后只能祈祷它好用的附加组件。
## 处于早期阶段是有意为之 这里有一句实话:这是 0.0.x 版本。 上面提到的所有内容——画布、Core Framework、通用内容模型、沙盒插件、AI agent、表单、循环、模板、媒体、MFA、审计日志、一键部署、整洁的发布器——只是起跑线,而不是终点。即将推出的内容: - **真正的分析功能。** 第一方且尊重隐私,以完善“分析”支柱。 - **更庞大的模块和插件生态系统。** 更多的第一方构建块,更广阔的 SDK 范围,更多可供借鉴的示例。 - **更强大的 AI agent。** 更多工具,对你实际站点有更深刻的感知。 - **一切都会更加紧密。** 我们有意保持在 1.0 之前的阶段。这是抛弃糟糕想法并保持架构整洁成本最低的时期。 在 1.0 版本之前,API 和工作流仍然可能发生变动。如果这让你感到不安,请等待 1.0 版本——我们完全理解。如果你想帮助塑造未来二十年网站所有权的样子,现在是占据有利位置的好时机。
## 面向开发者 一个 Bun 服务器。一个使用 Vite 构建的 React 后台程序。一个能生成让你乐于亲自手写代码的页面的发布器。 | | | |---|---| | **运行时** | Bun,同时用于服务器和工具链 | | **语言** | 全面使用 TypeScript | | **后台应用** | React 19 (开启 React Compiler)、Vite、Zustand + Mutative、CodeMirror、dnd-kit | | **服务器** | 带有手写路由的 `Bun.serve` | | **数据库** | SQLite 或 Postgres —— 统一的 `DbClient` 接口,由 `DATABASE_URL` 决定 | | **校验** | 在所有非类型化边界使用 TypeBox;schema 是唯一事实来源 | | **插件** | QuickJS-WASM 后端沙盒、所有者授权的权限,针对后台窗口代码显式要求 `editor.code` 权限 | | **AI** | 基于原始 HTTP/SSE 的与提供商无关的驱动程序,无需供应商 SDK | | **输出** | 语义化 HTML、紧凑的 CSS、固化的静态文件加上自动检测的动态区块 | 代码库是具有强烈主见的,并且这些主见在代码中得到了强制执行。架构规则以实际测试的形式存在于 `src/__tests__/architecture/` 中,因此保持输出整洁的结构不会悄无声息地腐坏。 ``` bun run build # tsc -b && vite build bun test bun run lint ``` 深入了解:[文档索引](docs/README.md) · [架构](docs/architecture.md) · [编辑器](docs/editor.md) · [服务器](docs/server.md) · [发布器](docs/features/publisher.md) · [插件系统](docs/features/plugin-system.md)
## 致谢 Instatic 的界面使用了由 Gerrit Halfmann 设计的 [Pixelarticons](https://pixelarticons.com/)。感谢 Gerrit 提供了这套真正别具一格的图标集,并善意地允许我们在开源项目中使用它们。 ## 许可证 MIT。详见 [LICENSE](LICENSE)。没有分层限制,没有开源核心的附加说明,没有“联系销售”。
标签:Bun, CMS, Syscall, TypeScript, Web开发, 可视化编辑器, 安全插件, 自动化攻击, 自托管, 请求拦截