← 技术 Blog
开源· 约 6 分钟

我们把 CRM 开源了:一个给小团队用、AI 只起草不落库的客户管理系统

Daedalus CRM 是我们三条产品线里的应用层。这篇讲它为什么从 SaaS 改成开源、五个 AI 功能为什么都不直接写库、"少即是多"在代码里具体长什么样,以及克隆下来两条命令怎么跑起来。

Daedalus CRM 数据首页
数据首页:四张指标卡、趋势、漏斗、盯盘提醒。截图里是虚构的演示数据。

先说结论

仓库在 github.com/BeckY824/daedalus-crm,AGPL-3.0。有 Docker 就能跑:

git clone https://github.com/BeckY824/daedalus-crm.git && cd daedalus-crm
docker compose up -d

打开 http://localhost:3000,用户名 admin,密码 admin123。没有任何东西要配:会话密钥自动生成并存在数据卷里,数据库自动建表,升级时迁移自动跑。数据是一份 SQLite 文件,在你自己的机器上。

它是给谁的

1–20 人的销售团队。我们最早是给教培 / 升学咨询机构做的:客户在微信里,成交靠试听和转介绍,团队里没有人会去写 SQL。所以默认措辞是"学员、院校 / 年级 / 专业、已试听、与家人商议"。

但数据模型本身是通用的销售漏斗——线索 → 客户 → 跟进 → 商机 → 签约。于是我们把措辞从代码里抽出来放进设置页:客户叫什么、三个档案字段叫什么、下拉里有哪些选项、状态显示成什么,管理员改一下,全站同步。一个设计工作室把"学员"改成"客户"、"院校"改成"公司",就能用。

为什么从 SaaS 改成开源

我们一度按 SaaS 的路子做:订阅、企业版、多租户。停下来的原因很简单——小团队最在意的是数据在谁手里,以及第二年还要不要续费。一个 5 个人的机构,客户名单就是全部家当,放在别人的云上心里不踏实;而每年续费的决策成本,对他们来说比买断高得多。

开源自托管把这两个问题一起解决了:数据在自己的服务器上,代码可以看、可以改;AGPL 保证了改了并对外提供服务的人要把改动公开。我们靠部署、定制和上层的工作流产品挣钱,不靠锁住数据。

AI 只起草,不落库

系统里有五个 AI 功能。它们遵守同一条规则:AI 产出的东西永远先摆在人面前,人核对后走原有的保存流程。AI 没有直接写库的路径。

功能在哪做什么
跟进速记新建跟进弹窗口述或粘贴微信聊天记录,AI 预填类型、要点、下次计划、待办
临战简报客户详情联系前一键生成:故事线、卡在哪、建议谈什么、风险
问数据数据复盘自然语言问业务数字。AI 只把问题翻译成受限的查询规格,不写 SQL
盯盘提醒数据首页被遗忘的客户、停滞的商机、逾期的计划。检测是纯规则,AI 只在你点"起草"时写话术
转介绍雷达渠道管理谁在帮你带人、下一个该请谁开口。排序是纯规则,AI 只写邀请

为什么这么保守?因为模型的输出是不可信输入。它会把枚举拼错、编造一个不存在的联系人 id、把"下周三晚上"换算成一个不合法的时间。我们写了一层清洗:能收敛到系统认识的取值就收敛,收敛不了的宁可置空让人补填,也不能让脏值进库污染统计。"问数据"更极端——模型只能输出一个受限的查询规格(指标、分组维度、时间范围),由代码去执行;它问"明天能签几单",系统回答"这是预测不是查询",而不是查未来某天得出"0 笔"。

接什么模型也不重要。设置页填接口地址、Key、模型名,任何 OpenAI 兼容接口都行:DeepSeek、OpenAI、本地 Ollama、各类中转站。Key 用会话密钥加密后存库,界面只回显尾 4 位,数据库备份里没有明文。不配 Key,AI 入口整体隐藏,其余功能照常。

客户详情页
客户详情:跟进时间线、待办、下次计划,「简报」按钮只在配了 AI 时出现。

少即是多,在代码里长什么样

这是我们做产品的原则,落到这个仓库里是几件具体的事:

工程纪律

开源意味着别人会读你的代码、在你没见过的机器上跑它。有几条纪律是这个仓库一直守着的:

开源前我们做了一件事:把 git 历史整个重来。旧的提交里有服务器地址和真实的员工姓名,脱敏不是"改掉最新版",是让它们从来没进过仓库。

接下来

路线图在仓库里。近期是 PostgreSQL 支持和更细的权限;不在计划里的是移动端和多租户。欢迎提 issue,尤其欢迎"我不是教培,这个术语改不过来"这类反馈——那正是我们想验证的事。