🔥 A plugin-first content platform rebuilt from Halo with independent namespace, branding, and delivery pipeline.
🚀 Built with Java 21, Spring Boot, WebFlux, R2DBC, Vue 3, and Gradle multi-module architecture.
⭐ Supports private deployment, plugin extensibility, API-first integration, and env-driven DB/Redis/Ollama configuration.
面向个人与团队内容场景的可扩展 CMS(管理后台 + 插件生态 + 私有化部署)
Status:
showcase-readyUpstream:
halo-dev/halo
非官方声明(Non-Affiliation)
本仓库为社区维护的衍生/二次开发版本,与上游项目及其权利主体不存在官方关联、授权背书或从属关系。
商标声明(Trademark Notice)
相关项目名称、Logo 与商标归其各自权利人所有。本仓库仅用于说明兼容/来源,不主张任何商标权利。Series: talentflow-hr · aurora-mall
| Repo | 主要角色 | 技术侧重 | 最适合的展示点 |
|---|---|---|---|
NebulaCMS |
内容平台 | 插件系统、WebFlux、Vue 3 | 插件生态、内容管理、平台化 |
TalentFlow HR |
业务后台 | Spring Boot + Vue | 组织流程、人事场景、后台系统 |
Aurora Mall |
电商系统 | Spring Boot + MyBatis | 商品交易、配置治理、质量门禁 |
- 1. 项目定位
- 2. 改造目标与工程原则
- 3. 已完成改造(40项)
- 4. 技术架构
- 5. 模块结构
- 6. 快速开始
- 7. 配置说明
- 8. 部署方式
- 9. 与上游差异
- 10. 仓库元信息
- 11. 协议与合规
- 12. 致谢
NebulaCMS 是基于 Halo 2.x 做工程化二次开发后的独立内容平台仓库,目标是形成“可长期维护、可持续迭代、可独立发布”的自有项目形态。
本仓库重点解决三件事:
- 命名与品牌独立:避免与上游包名、镜像名、npm scope 混用
- 配置可注入:数据库、Redis、Ollama 等依赖全部支持环境变量驱动
- 发布链路独立:CI、镜像、前端包作用域、仓库元信息统一为 NebulaCMS
- 从“Fork 副本”升级为“独立可演进仓库”
- 建立统一的项目命名、品牌与发行链路
- 在不破坏主干结构的前提下完成系统性重构
- 可审查:改动尽量落在明确文件与模块边界内
- 可验证:核心配置与构建链路可通过命令直接验证
- 可维护:参数化敏感配置,减少本地化硬编码
settings.gradle项目名改为nebulacms- Java 主命名空间从
run.halo.app切换至io.nebulacms.app - Java 工具平台命名空间从
run.halo.tools.platform切换至io.nebulacms.tools.platform api/build.gradle的group改为io.nebulacms.appapplication/build.gradle的group改为io.nebulacms.appplatform/application/build.gradle坐标改为 Nebula 命名platform/plugin/build.gradle坐标改为 Nebula 命名- 自定义 Gradle 插件 ID 从
halo.publish改为nebulacms.publish buildSrc发布插件文件改名为nebulacms.publish.gradle- 主应用产物命名从 Halo 命名切换至 NebulaCMS
- 前端 workspace 包作用域从
@halo-dev/*切换到@nebula-labs/* ui/package.json依赖引用统一切换为@nebula-labs/*ui/packages/api-client包名与仓库链接切换ui/packages/components包名与关键词切换ui/packages/console-shared包名切换ui/packages/editor包名与仓库链接切换ui/packages/shared包名与仓库链接切换ui/packages/ui-plugin-bundler-kit包名与仓库链接切换- 前端 package
author/repository/homepage统一切换到 NebulaCMS - 前端相关 issue/repo URL 从 halo-dev 指向 nebula-labs
- 主配置数据库 URL 改为
NEBULACMS_DB_URL驱动 - 主配置数据库用户名改为
NEBULACMS_DB_USERNAME - 主配置数据库密码改为
NEBULACMS_DB_PASSWORD - 主配置新增 Redis Host 变量
NEBULACMS_REDIS_HOST - 主配置新增 Redis Port 变量
NEBULACMS_REDIS_PORT - 主配置新增 Redis Password 变量
NEBULACMS_REDIS_PASSWORD - 主配置新增 Redis Database 变量
NEBULACMS_REDIS_DATABASE - 主配置新增 Ollama 开关
NEBULACMS_OLLAMA_ENABLED - 主配置新增 Ollama 地址
NEBULACMS_OLLAMA_BASE_URL - 主配置新增 Ollama 模型
NEBULACMS_OLLAMA_MODEL - 工作目录默认值从
.halo2迁移为.nebulacms - 新增
.env.example用于本地与服务器配置模板
- GitHub Actions 主工作流命名改为 NebulaCMS
- CI 工件命名改为
nebulacms-artifacts - Docker 镜像默认仓库切换到
ghcr.io/nebula-labs/nebulacms - Docker Hub 镜像名切换到
nebulalabs/nebulacms application/build.gradle插件预置下载支持NEBULACMS_APPSTORE_PLUGIN_URL.github/actions/setup-env描述与命名改为 NebulaCMS 语义.github/actions/docker-buildx-push默认参数改为 NebulaCMS 体系
- 重写 README、替换 Logo/Wordmark、新增 Fork 协议说明与
.github/settings.yml仓库元信息模板
flowchart LR
U["用户 / 管理员"] --> UI["NebulaCMS Console (Vue 3)"]
UI --> APP["NebulaCMS Application\nSpring Boot + WebFlux"]
APP --> DB[("PostgreSQL / MySQL / MariaDB / H2")]
APP --> REDIS[("Redis (Optional)")]
APP --> OLLAMA["Ollama (Optional)"]
APP --> PLUGIN["Plugin Runtime"]
APP --> OPENAPI["OpenAPI + Client SDK"]
nebulacms/
├── api/ # 公共 API 与扩展模型
├── application/ # 主应用(WebFlux + Security + Plugin)
├── platform/ # 平台依赖与 BOM
├── ui/ # Vue 3 管理后台与前端子包
├── api-docs/ # OpenAPI 产物
├── e2e/ # 端到端测试
├── buildSrc/ # 自定义 Gradle 插件
└── .github/ # CI/CD 与仓库设置
git clone https://github.com/however-yir/nebulacms.git
cd nebulacms
cp .env.example .env
./gradlew clean build
./gradlew :application:bootRun --args='--spring.profiles.active=dev,mysql'- 管理后台:
http://127.0.0.1:8090/console - API 文档:
http://127.0.0.1:8090/swagger-ui/index.html
关键环境变量如下:
NEBULACMS_WORK_DIRNEBULACMS_DB_URLNEBULACMS_DB_USERNAMENEBULACMS_DB_PASSWORDNEBULACMS_REDIS_HOSTNEBULACMS_REDIS_PORTNEBULACMS_REDIS_PASSWORDNEBULACMS_REDIS_DATABASENEBULACMS_OLLAMA_ENABLEDNEBULACMS_OLLAMA_BASE_URLNEBULACMS_OLLAMA_MODELNEBULACMS_APPSTORE_PLUGIN_URL
详细示例见 ./.env.example。
docker run -d \
--name nebulacms \
-p 8090:8090 \
-v ~/.nebulacms:/root/.nebulacms \
--env-file .env \
ghcr.io/nebula-labs/nebulacms:latest- 数据库与 Redis 使用托管服务并开启备份
- 将
.env交给密钥管理系统(如 Vault / GitHub Secrets) - CI 使用独立镜像仓库凭据,不复用上游仓库发布凭据
| 入口 | 路径 | 作用 |
|---|---|---|
| 文档中心 | docs/ |
功能、插件、认证、备份等说明 |
| OpenAPI 产物 | api-docs/openapi/ |
API-first 集成与客户端生成 |
| 端到端测试 | e2e/README.md |
系统级回归入口 |
| 前端包与控制台 | ui/ |
管理后台与插件 UI 生态 |
| 工作流 | .github/workflows/ |
构建、发布与 CI 链路 |
- 已完成品牌、命名空间、镜像、包作用域、仓库元信息独立化
- 保留上游可追踪基础,便于后续按需同步安全修复
- 配置项全面环境化,适配本地开发、容器化和私有化部署
| 迁移面 | 关注点 |
|---|---|
| 命名空间 | run.halo.* 已迁移为 io.nebulacms.* |
| 前端包作用域 | 从 @halo-dev/* 切到 @nebula-labs/* |
| 环境变量 | 统一改为 NEBULACMS_* 前缀 |
| 工作目录 | 默认从 .halo2 切到 .nebulacms |
| 发布镜像 | 镜像名、工件名和 CI 流程已改为 NebulaCMS 语义 |
仓库元信息模板在 ./.github/settings.yml,已包含:
- 仓库名称:
nebulacms - 仓库描述:
NebulaCMS - plugin-first open source content platform forked from Halo with independent namespace, branding, and deployment pipeline. - Topics:
nebulacms,cms,spring-boot,webflux,vue,r2dbc,plugin-system,self-hosted
- 主协议:GPL-3.0(见
./LICENSE) - Fork 说明:
./NEBULACMS_FORK_LICENSE_NOTICE.md
感谢 Halo 社区提供稳定的上游基础能力。NebulaCMS 在此基础上进行工程化延展,并保持对上游开源协议的尊重与遵循。