ever-gauzy 这个名字,我第一次看到的时候以为是某个个人开发者的实验项目,结果点进去之后发现事情没那么简单。它是一套开源的企业资源计划系统,从财务、库存、销售点收银到人力资源、任务管理全包了,而且技术栈相当统一,后端 NestJS、前端 Angular、数据库 PostgreSQL,全栈 TypeScript。更值得注意的是,它背后是 Ever 团队在做,跟他们那套 AI 招聘和销售助手产品属于同一个生态。
这篇文章,我想从实际使用的角度把 ever-gauzy 掰开揉碎讲一遍。它适合谁用、能解决什么问题、部署的时候有哪些坑、二次开发从哪里下手,以及它跟那种商业的 Odoo、用友、金蝶到底有什么区别。如果你正在为中小团队挑一套能自己掌控代码的业务管理系统,这篇文章应该能帮上不少忙。
1. 先搞清楚它到底是个什么项目
1.1 一个“全家桶”式的开源业务管理平台
ever-gauzy 的核心定位很直白:给中小型公司提供一套可以自己部署、自己改代码的业务管理后端。它不是一个单一功能的工具,而是把企业日常运营里最常见的几块需求集中到了一个项目里。我把它拆开看了下,从功能模块上看大致分为销售与客户管理、采购与库存、财务与会计、项目与任务协作、人力资源管理这几大块。
其中销售点收银那一块做得尤其重。它不是简单做一个“下单付款”的页面,而是设计了完整的 POS 收银流程,支持二维码扫描、现金和银行卡混合支付、订单挂单、小票打印等场景。这一点对实体零售店、餐厅、快消品门店来说是非常实用的功能。配合上客户管理、会员折扣、促销规则,它基本能把一个小店的日常经营链路串起来。
会计模块也不是摆设。它支持多币种会计、多实体(Multi-Entity)账务管理,甚至可以生成基于会计模板的科目表和财务报表。也就是说你在系统里销售了一单商品,财务端会自动生成对应的记账凭证和应收记录,库存也会同步扣减。这种“业务数据自动进入财务”的设计,比很多中小企业用 Excel 记一遍、再用财务软件录一遍的做法省了太多事。
从产品形态来看,ever-gauzy 走的是“ERP + 项目管理 + 人力资源”三合一路线。它想干的不是单点工具,而是把公司内部从合同签约、交付执行到员工工资发放这条长链路,用一个系统贯穿起来。用我自己的话说,它是一个“业务中台”的雏形。
1.2 为什么选择 NestJS、Angular、PostgreSQL 这套技术组合
技术选型能看出一个团队的偏好和取舍。ever-gauzy 选择的后端是 NestJS,这个框架在 TypeScript 生态里属于企业级应用最成熟的方案之一。它不是最轻量的,但它的模块化设计、依赖注入机制、装饰器风格,跟大型业务系统的开发模式匹配度很高。
在实际浏览源码的过程中,我发现整个工程并不是把所有功能塞在一个巨型应用里,而是拆成了大量模块,每个模块处理一个相对独立的业务域。比如 accounting、invoicing、candidate、timesheet 这些目录,一眼扫过去就能明白每个模块的职责。NestJS 的 Module 机制和这套目录结构配合得很好,新加入的开发者可以按模块切入,不需要看懂全项目才能动代码。
前端选择 Angular 而不是 Vue 或 React,这个决策放到今天看其实有利有弊。Angular 的强约定和依赖注入风格让大型项目的长期可维护性更好,模板语法对业务人员也更直观。但 Angular 的学习曲线确实比 React 陡,如果你团队里都是 React 背景的开发者,二次开发的前端部分会有一定的适应成本。
数据库用 PostgreSQL 是这类系统最稳妥的选项。事务支持、行级锁、JSON 字段、丰富的扩展生态,这些都是业务系统不可或缺的。加上 ever-gauzy 大量使用了 TypeORM 来做数据映射,切换数据库在理论上可行,但我劝你还是老老实实用 PostgreSQL,因为很多查询是直接基于 PG 特性设计的,换库容易踩坑。
从整体看,ever-gauzy 在技术选型上走的是一条“求稳、求统一”的路:一门语言(TypeScript)、一个框架(NestJS)、一个前端框架(Angular)、一个数据库(PostgreSQL)。对于长期维护来说,这种单一技术栈的好处是明显的——团队招人、代码审查、模块复用都会简单很多。
2. 核心业务模块解析与我的实测体会
2.1 财务、库存与销售点收银是真的能用的那种
我先说说最让我意外的销售点模块。你启动系统后,进入 Sales 相关页面,能看到一个完整的收银工作台界面,产品列表、购物车、客户选择、结算按钮一应俱全。商品可以通过条码或搜索快速加入购物车,也可以直接点击产品卡片。结算时可以选择现金、银行卡,还能组合支付。它不仅是一个界面设计,后端有完整的订单、支付、退款流程支撑。
我实测跑通了一条比较完整的业务链路:首先在产品管理里创建一个商品并设置成本价和零售价,然后到采购模块录入一张采购订单确认收货,此时库存增加。接着切换到销售点收银台,模拟顾客把商品加入购物车并结算,订单生成后库存自动扣减,应收账款自动生成。再去会计模块看报表,销售收入和库存成本都已经体现在利润表里了。
这个链路跑通的意义非常大。很多开源系统所谓的“进销存”只是界面之间互相跳转,数据根本不通。ever-gauzy 是真正把业务动作同步到了财务账上,这本质上是 ERP 和进销存软件的本质区别,也是企业最看重的部分。
库存部分支持多仓库管理,每个仓库有独立的库存数量。采购订单、销售订单、库存调整单都会影响对应仓库的存量。它没有像专业 WMS 那样做到库位级、批次级的精细,但对大多数贸易型、零售型中小企业来说已经够用了。如果你要做服装鞋帽、日用百货、快消品代理这类业务,ever-gauzy 的库存粒度跟实际需求是吻合的。
再往下说会计模块。它预置了多套会计科目模板,你可以在初始化的时候选择。多币种支持是这里的一个亮点,你可以在发票上设置不同的币种,系统按设定的汇率换算成本币入账。税务处理也做得比较细,可以按税率模板设置不同地区不同的销项税和进项税规则。
2.2 项目工时、员工薪资与 AI 功能的真实完成度
除开业务和财务这条线,ever-gauzy 还内置了项目管理和人力资源模块。项目管理部分允许你建项目、排任务、设置负责人和截止日期。最狠的地方在于它有计时器功能,员工可以在任务上开启计时,记录每小时的花费工时,这些工时数据会流转到发票和工资模块里。
这等于打通了一条从工时记录到客户账单再到员工工资的完整链路。服务型公司、外包开发团队会特别喜欢这个设计:项目上用了多少人力、能卖给客户多少钱、员工该拿多少提成,系统里都有据可查。我用它模拟过一个 30 人左右的开发团队场景,项目经理分配任务、开发人员记录工时、财务在月底统一生成工资单,这套流程在系统里是可以顺畅跑通的。
工资模块支持按时薪或月薪计算,可以设置加班费规则,也能处理各种津贴和扣款项。它生成的工资单不仅能看到应发金额,还能追溯到具体任务和项目工时,这对于按项目核算人力成本的公司来说太关键了。
还有一个我不能不提的——ever-gauzy 内部集成了 AI 面试和员工测评相关功能。这块是 Ever 生态的老本行,他们在招聘 AI 上有积累。在实际项目里,AI 模块可以用于初步筛选候选人、生成面试题目、甚至对候选人视频回答做情绪和压力分析。说实话,这类功能在国内企业的实际接受度还有待验证,但作为开源项目能内置这种能力,确实比同类产品多了一个卖点。
不过需要提醒的是,AI 相关功能在部署时需要额外配置一些环境变量和模型服务。如果你只是想先跑通进销存和财务,这些 AI 功能可以先不启用,不影响主流程。
2.3 它也有一堆做得不够好的地方
我不能光夸不骂。ever-gauzy 对移动端适配是真的比较弱,虽然页面能缩放,但用手机浏览器操作收银台和审批流程的体验远不如桌面端。如果你的业务场景里店长需要经常用手机查看经营数据,这套系统只能算“能用”,离“好用”还有距离。
多语言支持虽然提供了国际化框架,但不少业务字段的中文翻译是缺失的,部分页面会混着中英文显示。这一点对国内使用者来说比较伤,需要社区或你自己花时间去汉化。
报表功能也存在“有而不精”的问题。基础的销售报表、利润表、库存报表是有的,但如果你想做像老板驾驶舱那种多维度可视化大屏,或者复杂的同比环比分析,就得依赖外部 BI 工具对接数据库了。
此外,它没有一个应用市场或插件商店。不像 Salesforce、Shopify 那样可以在商店里安装第三方应用,ever-gauzy 的所有扩展都得基于源码开发。这既是灵活性的体现,也是复杂度的来源——不是每个企业都有养一支开发团队。
3. 本地部署与上手实操记录
3.1 部署前需要准备的环境和耐心
我测试时最深的感受是:ever-gauzy 的分支和配置矩阵比一般开源项目要复杂。它同时支持 SQLite、PostgreSQL、MySQL 几种数据库,还区分了本地开发模式和 Docker 生产部署模式。如果没有提前阅读文档,很容易在环境变量这里卡住。
我的建议是第一次尝试别直接上生产配置,先在本地用 SQLite 跑起来,把功能摸熟了再切换 PostgreSQL。SQLite 模式下几乎不需要额外配置,npm 安装完依赖,配置好环境变量就能启动。但要注意,SQLite 只适合开发和演示,生产环境务必换成 PostgreSQL,否则并发一上来就会出现锁竞争问题。
环境准备这块,Node.js 版本要求 18 以上,推荐 20 LTS 版本。包管理器建议用 npm 或者 pnpm,Yarn 在某些依赖版本下会有兼容性问题。另外还需要一个 Redis 实例,ever-gauzy 用它来做跨进程的缓存同步、 Socket 消息转发和任务队列。我的经验是先把 Redis 准备好,很多神秘问题其实是 Redis 没启动导致的。
数据库的话直接装一个 PostgreSQL 14 以上版本即可。首次使用需要手动创建一个空数据库,系统在首次启动时会自动执行迁移脚本建表,不用你自己手写建表语句。整个过程中最容易出问题的其实是环境变量文件——默认的 .env 示例文件里数据库连接、Redis 地址、JWT 密钥都需要你改成自己的本地环境值。
3.2 如何一步步启动整个项目
第一步是拉取代码。ever-gauzy 在 GitHub 上的代码仓库分成前后端两个子仓库,一个叫 ever-gauzy(主体),另一个是 gauzy-api(目前已经并入主仓库)。建议直接克隆主仓库,最新的代码已经将前端、后端、CLI 工具整合在了一个单一代码库里。
克隆完成后先复制一份环境变量示例文件:
git clone https://github.com/ever-co/ever-gauzy.git cd ever-gauzy cp .env.example .env然后编辑 .env 文件,重点确认这几个配置项:
DB_HOST=localhost DB_PORT=5432 DB_NAME=my_gauzy_db DB_USER=postgres DB_PASS=yourpassword REDIS_URI=redis://localhost:6379 API_PORT=3000 CLIENT_PORT=4200接下来安装依赖。这个项目依赖非常多,如果网络条件不好可能会失败,推荐使用 npm 并配置好国内镜像源:
npm install依赖装完以后,先启动数据库迁移和种子数据。ever-gauzy 提供了一个 CLI 工具,可以一键完成建表和填充演示数据:
npm run db:migrate npm run db:seed:all最后在开发模式下同时启动后端和前端。你可以在两个终端里分别跑,也可以用项目内置的并发命令一键启动:
npm run start:api npm run start:web启动完成后,前端一般在 http://localhost:4200 访问,后端接口在 http://localhost:3000/api。用管理员账号登录系统,就能看到完整的工作台了。我第一次跑通时用了大概半小时,大部分时间花在等 npm install 上,实际配置并不复杂。
3.3 部署后必做的验证清单
系统启动不代表一切正常,我建议按下面的顺序做一轮验证,基本能覆盖大部分核心模块是否工作正常:
- 用提供的演示账号登录,确认前端能正常加载且接口没有 CORS 报错。
- 进入仪表盘查看今天的销售数据和图表,确认统计接口返回的数据不是空的。
- 创建一个测试产品,走一遍采购、销售、退款流程,检查库存数量是否同步变化。
- 在会计模块打开利润表,确认刚才的销售记录已经生成了对应的营业收入和成本分录。
- 如果是多人在线使用场景,开两个浏览器窗口同时操作一个资金账户,验证并发期间数据是否一致。
- 确认文件上传功能正常,头像和产品图片能成功写入存储目录并可以被访问。
这一套验证下来,系统上没上正道基本一目了然。如果其中某一步数据没同步,多半是后台任务队列没有正常工作,优先检查 Redis 连接和 worker 进程。
4. 适用场景、二次开发切入点与许可证风险
4.1 到底什么样的团队和业务适合上 ever-gauzy
先从反面说起——哪些情况不要用它。如果你的公司只是需要一个简单的记账工具或者只是把库存做个 Excel 替代,那就别上 ever-gauzy。它的安装部署和日常维护成本远高于那几个轻量级 SaaS 工具,对非技术型老板不太友好。
真正适合 ever-gauzy 的是这几种场景:第一种是年营收在几百万到几千万之间的零售、电商、贸易型公司,需要打通 POS、库存、采购、财务这条业务流,同时又不想每个月为多套 SaaS 系统付几种订阅费。第二种是外包开发公司或软件服务商,自己有技术团队,愿意在这套开源系统基础上做定制开发,交付给有 ERP 需求的终端客户。第三种是海外业务公司,需要一套原生的多币种多语言业务系统,并且希望数据完全由自己掌控。
跟市面上的商业 ERP 相比,ever-gauzy 最大的优势在于代码开放、一次性成本清晰、可以按需裁剪。商业 ERP 先不说每年服务的费用,光是那些你根本用不上的模块就够你烦的。它最大的劣势则在于快速上线这套技术栈相对冷门,团队招人难是一方面,文档和社区活跃度也不算特别高。
4.2 想做二次开发,从哪里入手比较高效
我建议先熟悉它的目录结构。后端代码在根目录的 packages,前端在另一个同级目录,CLI 工具的入口是 packages/gauzy-cli。整体看下来,angular 前端这部分的目录组织和数据模型,对学过 Angular 的人相对友好,对没学过的人“有边界感”特别强。
做功能扩展时,最常规的路子是在后端新建一个 Module,然后在对应的 controller 里暴露 REST API,再在前端用 Service 调用这个 API。因为项目大量使用 TypeORM 的 Entity 装饰器,新建数据表基本不需要手写 SQL,改完代码后跑一下迁移命令即可。这个流程对于有 NestJS 和 TypeORM 经验的开发者来说非常顺。
如果你要做的是对标客户定制的报表,我更建议直接用 SQL 查数据库再对接一个可视化面板工具,而不是在 ever-gauzy 里硬造报表页面。它的灵活度在业务规则层,不在报表可视化层。
提醒一句,开发前务必在 git 上切一个自己的分支。ever-gauzy 主分支更新频率不低,如果你在本地改了大量代码,会面临从上游频繁合并的冲突问题。我第一次折腾时没注意这个,结果一次 git pull 把自己的修改全部冲掉了,都是泪。
4.3 许可证问题,这个坑不能踩
这一点必须单独拎出来说。ever-gauzy 用的不是大众熟知的 MIT 或 Apache 2.0 协议,而是一个叫 Ever Gauzy Platform License 的专有许可证。这个许可证的核心意思是:代码你可以看、可以改、可以内部使用,也可以用来给第三方做商业服务,但是你不能直接把原版或改名后的 ever-gauzy 作为 SaaS 产品对外多大销售,也不能移除或修改版权声明。
换句话说,如果你是一个软件公司,拿 ever-gauzy 给客户做私有化部署项目交付是基本可以操作的;但如果你打算把它改一改,做成一个多租户 SaaS 平台公开售卖,那就需要仔细对照许可证条款,甚至联系 Ever 团队购买商业授权。这不是道德问题,是法律风险,别等做大了再回头补课。
看完许可证之后,还要关注一下 Ever 生态的产品规划。Ever 团队长期在往 AI 方向投入,除了这个 ERP 系统,他们还有 AI 招聘、AI 销售助手这些产品线。这就意味着 ever-gauzy 以后大概率会越来越多地内置 AI 能力,这既是想象力所在,也带来了模型服务的部署成本和数据隐私问题。
5. 常见问题与排查实录
5.1 部署阶段我踩过的高频坑
写代码这么多年,进坑出坑都是常规操作。ever-gauzy 部署期的问题我总结下来其实就那么几类。
先说类型报错。npm install 之后,第一次启动就报一堆 TypeScript 类型错误,后来发现是 Node 版本不对。项目要求的 Node 版本和本地版本差异太大时,依赖编译会产生各种诡异错误。解决方案很简单,用 nvm 切换到项目要求的版本。
再说数据库连接失败。PHP 项目那种数据库连接失败一般会给出明确的提示,这个项目的报错往往是你启动 API 时说某个端口没监听,看半天也看不出跟数据库有什么关系。后来换了个思路,先把 Postgres 单独用工具连了一遍,确认账号密码没问题,又查了 .env 里数据库名字和实际建好的库名是否一致,最后把 Redis 也确认了一遍,才彻底解决。
还有一个容易被忽视的,就是端口占用。前端默认跑 4200,后端默认 3000,如果你本地正好有别的服务占用了,项目启动时不会主动告诉你“端口被占用”,而是直接报一个含混的错误或者干脆无声退出。用 lsof 查一下端口析下,立刻破案。
5.2 运行期间遇到的问题及其排查思路
系统好不容易跑起来,不等于后面就顺风顺水。运行期最容易出问题的是后台任务。销售生成发票、邮件通知、定时任务这些操作,都是通过队列异步处理的。如果你发现某个单据状态迟迟不更新,某封邮件半天没发出去,第一反应不应该是去翻业务代码,而是去查队列 worker 进程还在不在。手动重启 worker 之后,积压的任务会重新执行。
另一个常见问题是文件上传失败。默认的图片上传路径有时候没有写入权限,你在界面上传头像死活传不上去,后台日志也不给明确报错。处理方式很直接:给上传目录加上可写权限,或者改环境变量把存储路径指到一个确定的目录。确认完再重新登录,问题基本消失。
数据序列化也是需要留意的点。前后端交互时,有些日期字段会变成一串很难读的时间戳,有些金额字段会出现浮点精度问题。这类问题多半跟 TypeORM 的数据库列类型映射有关。如果你准备做二次开发,特别要注意金额字段最好用 decimal 类型,别顺手改成 float,不然到月底对账时你会怀疑人生。
最后是多租户环境下的数据隔离性能问题。虽然 ever-gauzy 内置的组织机构设计可以承载多组织数据,但在高并发场景下如果索引没建好,跨组织查询会产生很重的性能开销。我在测试中给常用的外键字段补了索引后,查询速度肉眼可见地提升了。
5.3 一些我自己的使用建议
用下来我最大的体会是,不要把 ever-gauzy 当做一个开箱即用的成品软件来看,把它理解成一个“比较完整的业务中台种子”更准确。它的数据模型设计得很全面,这反而是它最大的资产。哪怕你最后不直接用它的界面,把它的数据库结构和 NestJS 模块作为需求清单去开发一套更适合自己的系统,也会节省大量调研时间。
对于小团队,先把销售点、库存、采购、财务这四件套跑通,已经能覆盖我大部分线下零售业务的日常运营了。项目管理和工时模块可以留着,等服务型业务起来了再慢慢用上。AI 功能这一块,我更倾向于把核心业务跑顺之后再探索。
从开发的角度说,这套项目值得学习的东西其实不少。一个单体仓库里装下一整个业务平台,模块怎么组织、异常怎么处理、数据校验怎么做、多语言怎么做,这些工程决策的细节都值得过一遍。哪怕你不打算在项目里用它,把它当做一个企业级 TypeScript 全栈项目的样板来读,也绝对不亏。如果你打算深入定制,建议按照模块粒度去读,不要从头到尾硬啃,展开速度会快很多。