ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

开源 ERP+CRM+HRM 系统 Ever Gauzy 架构拆解与部署实战

开源 ERP+CRM+HRM 系统 Ever Gauzy 架构拆解与部署实战 如果你所在的公司或者团队正在纠结“到底要不要自己从零写一套业务管理系统”我的建议通常是先别急着自己造轮子。过去大半年里我把 Ever Gauzy 从头到尾摸了一遍从源码部署到业务落地都走过一遍今天这篇就想把整个项目的架构逻辑、核心模块、部署细节以及我踩过的坑一次讲清楚。Ever Gauzy 是一套开源的 ERP CRM HRM 一体化业务管理平台简单说就是企业里常见的销售、采购、库存、财务、项目、考勤薪酬、客户关系这些事它都能统一管理。它不是那种只能看不能用的演示项目而是真正有社区版、有商业版、有完整产品思路的开源系统。如果你手头正缺一套能拿来就用、也能二开改造的管理后台或者你想研究现代全栈项目是怎么组织的这篇文章会很适合你。1. 项目整体架构与设计思路1.1 它到底在解决什么业务问题先说最直接的感受Ever Gauzy 解决的是“企业内部信息孤岛”的问题。绝大多数中小型公司在业务管理上都很碎片化——销售用一套表格财务用一套软件人事又有一套工具数据互相不打通。月底对账的时候销售说这个月签了 50 万合同财务说回款只有 30 万人事说工资得发 20 万最后所有数据都在 Excel 里来回倒腾。这种场景相信很多人都不陌生。Ever Gauzy 的核心设计目标就是把订单、客户、库存、项目、工时、薪酬、报销、发票、记账这些环节串成一个闭环。它不是单纯做一个“录入数据的后台”而是让业务动作之间产生联动的状态流转。比如一笔销售订单审核通过后库存数量会自动扣减财务那边会生成待开票记录项目模块里会创建对应的执行任务。这种自动化联动才是它作为 ERP 系统最值钱的地方。我当时选择深入研究的另一个原因是它的数据模型设计得非常完整。从组织架构Organization到多租户Multi-Tenant隔离从员工档案到供应商资料从产品目录到报价单几乎所有实体都有对应的数据库表和 API。这意味着即使你不打算直接用它的界面也可以把它当作一个可以做业务建模的参考模板这点对后端工程师来说价值极高。1.2 技术选型与工程架构的取舍看一个开源项目值不值得长期跟技术栈和工程组织方式是很重要的判断维度。Ever Gauzy 的前后端都基于 TypeScript这一点就在工程统一性上占了很大便宜。后端是 NestJS前端是 Angular。两个框架有个共同特点模块化程度非常高依赖注入体系成熟非常适合构建大型业务应用。NestJS 的 Module/Controller/Service 分层天然支持业务模块的拆分比如 CRM、Accounting、Inventory 各自成为独立模块代码边界清楚多人协作时不至于改一个地方崩一片。数据层用 TypeORM 配 PostgreSQL缓存和队列任务用 Redis。这套组合在业务系统开发里属于非常成熟甚至有点保守的方案但它胜在稳定、文档多、踩坑的人多、问问题能找到答案对于开源 ERP 这种要长期运营的项目稳妥比炫技重要得多。值得多说一句的是项目采用了 monorepo 结构apps 目录下放着 api、desktop、mobile、website 等应用入口packages 目录下放着公共库。这种组织方式的好处是一个仓库就能管理所有端版本同步方便坏处是仓库体积大初次安装依赖会比较慢。但总体看利大于弊。部署层面Ever Gauzy 提供了 Docker Compose 编排可以一键拉起 PostgreSQL、Redis、API、Client 等多个容器对想快速体验的人来说非常友好。它还内置了配置文件模板和环境变量机制可以覆盖数据库连接、文件存储方式、邮件服务、支付网关等几十个配置项。这个工程成熟度在同类开源项目里算是相当高的。2. 核心功能模块深度拆解2.1 CRM 与销售管道从线索到回款的全流程我先从我最常用的 CRM 模块说起。这个模块解决的是销售过程管理的问题核心是机会管理和销售管道Sales Pipeline。在 Ever Gauzy 里一条完整的销售链路大致是这样建立潜在客户Proposal/Lead→ 转化为商业机会Deal→ 关联报价Quote→ 生成订单Order→ 审核后生成发票Invoice→ 记录收款Payment。每一步都有独立的页面和状态而且数据是一路串联的。实际操作中我最认可它的是“Deal 页面”的看板视图。销售机会可以用拖拽的方式在管道阶段之间移动比如从“初步接触”拖到“方案报价”再从“报价”拖到“赢单”。每次拖拽本质上是一次状态更新系统会自动记录操作的轨迹销售主管一眼就能看出哪个环节卡住了这对销售过程管理的意义很大。报价和发票的模块也比较贴心。报价单支持按产品明细生成自动计算税费和折扣确认报价后可以一键转成发票发票号自动生成还能设置到期日和支付方式。这些功能虽然看起来基础但在真实业务里是高频操作。如果之前没接触过 ERP可能会觉得“这不就是几个表格吗”但实际上从报价到回款的状态机管理才是财务和销售能对齐的关键。2.2 HRM 模块考勤、薪酬和员工全生命周期HRM 模块是 Ever Gauzy 里最“完整”的部分之一这也是它区别于很多纯进销存开源项目的独特优势。首先是员工管理。它可以给每个员工建立档案包括职位、部门、上级、入职日期、联系方式还能关联用户账号、设置权限角色。员工数据和组织架构是绑定的这为后面所有“按部门/按人”的统计报表打好了基础。考勤管理支持多种打卡方式和工时记录。它内置了时间日志Time Log功能团队做项目时可以按任务记录投入时长后端生成日报、周报和工时统计。这一点和项目管理模块联动得特别好——你接了一个任务启动计时器结束后这个工时既会记到任务上也会汇总到员工绩效数据里。对于实施项目制的团队这个功能的实用价值非常高。薪酬管理也是亮点。你可以配置员工的薪酬结构包括基本工资、奖金、扣款项系统根据考勤数据和任务工时自动计算当月的薪资。它与记账模块也是联动的薪酬审核后可以生成对应费用凭证财务在做利润分析时能看到“人力成本”这个维度。很多 ERP 把这套流程拆成了两套系统Ever Gauzy 把它们放在了一起虽然带来了一定的配置复杂度但从数据统一的角度看是合理的。2.3 财务记账与报表中小企业最实用的部分财务模块是我个人认为 Ever Gauzy 最“懂中小企业”的地方它没有把会计做得像专业财务软件那么晦涩而是从业务场景出发分成了几个非常实用的子模块。应收应付是日常使用最频繁的部分。发票可以作为应收账款管理系统支持设置客户、税率、折扣、到期日付款进来后自动核销对应的发票并回写客户余额。采购方向同理供应商发票进入应付账款付款后核销。这套流程虽然不如金蝶用友那么财务化但对小团队管理和记录现金流够了。费用管理也做得比较简单直观。员工可以提交费用报销单上传票据附件管理人员审核后进入待报销队列打款后状态自动变为已支付。这些费用会自动归集到成本科目里月底做利润表的时候就能看到总支出。总账的部分基于“账户 科目”的方式记录所有流水。主营业务收入、应收账款、银行账户、应付薪酬每笔业务都会自动生成对应的会计科目分录。报表方面系统提供了利润表、资产负债表、现金流量表等基础财务报表还支持按时间段、按部门、按项目筛选。这个维度对一个开源项目来说相当完整了。2.4 项目管理与协作把团队工作流放到一起除了传统的进销存和财务Ever Gauzy 的项目管理模块也做得不凑合。它把任务拆分成 Epic、Task、Issue 等层级支持看板视图和列表视图。任务可以关联项目、里程碑、优先级、指派人、截止日期还能上传附件和做备注。项目模块最大的特色是“一体化”你在销售模块里建的客户可以直接关联项目你在项目里建的任务可以记录工时工时会自动汇总到薪酬和统计报表项目产生的费用和收入又能汇总到财务分析。换句话说它不是独立的项目管理工具而是整个 ERP 生态里的一个可见的业务细胞和销售、人事、账务都建立了关联。实际体验下来对于 20-50 人的小型公司Ever Gauzy 一个系统就基本替代了 CRM 软件 项目管理工具 考勤薪酬系统的组合。当然如果你需要的是 Jira 级别的复杂敏捷管理能力它可能不够细但它胜在“统一”让数据不必来回搬运。3. 本地部署与快速启动实务3.1 先想清楚该用哪种部署方式在正式动手之前你首先要明确自己的使用场景因为 Ever Gauzy 至少有三种跑法不同跑法投入的时间和精力差别很大。第一种是 Docker Compose 模式适合快速体验和中小团队内部使用。一条命令拉起所有依赖半小时内能跑起来。第二种是源码模式适合开发者想做二次开发或深入定制。需要本地装好 Node.js、PostgreSQL、Redis然后分别启动 API 和 Client开发和调试体验最好。第三种是使用官方托管的商业版适合完全不想管运维的团队。但那是收费服务而且因为平台的限制二开空间相对小。我建议初次上手的人先走 Docker 模式体验一遍确认这个系统符合需求以后再做源码模式的部署。不要一上来就啃源码不然会因为工程复杂度劝退。3.2 Docker Compose 一键部署实操用 Docker 部署的前提是你已经装好了 Docker Engine 和 Docker Compose 插件。如果你用的是桌面版 Docker这一步已经包含在内了。拉取 Ever Gauzy 仓库目录里自带 docker-compose.yml 文件里面定义了 postgres、redis、api、client 这些核心服务。一个最基础的启动命令是这样的git clone https://github.com/ever-co/ever-gauzy.git cd ever-gauzy cp .env.compose .env docker compose up -d启动后默认情况下 API 服务会在 3000 端口Client 界面会在 4200 端口。浏览器访问 http://localhost:4200 就能看到登录页。首次安装时管理员账号和密码在初始化脚本里有默认值组成一般是 adminever.co / admin正式使用前务必去用户设置里改掉。这里有个经验之谈如果你不想自己构建镜像可以直接用官方发布的 Docker Hub 镜像。修改 docker-compose.yml 里 api 和 client 的 image 字段就能指向已发布的版本启动速度会快很多。自己构建虽然灵活但前端依赖安装和打包的过程比较耗时首次构建可能需要十几分钟甚至更久。3.3 源码模式本地开发环境配置如果你决定走源码模式环境准备上要稍微花点心思。Node.js 版本有要求我记得当时用的是 Node 18.x 或更高的稳定版本。包管理工具方面官方用的是 yarn建议你也用 yarn不要混用 npm因为锁文件和依赖树可能会有出入。数据库需要 PostgreSQL 14 以上Redis 要有可用的实例。启动前需要把 .env 文件里的数据库连接字符串和 Redis 地址改成你自己的配置。数据库初始化不用手动建表API 服务启动时 TypeORM 的自动迁移机制会帮你建好 Schema如果没生效也可以手动跑迁移命令。依赖安装是整个流程里最容易出问题的一环。建议在仓库根目录执行yarn install这个命令会把所有子包的依赖都装好耗时取决于网络状况。装完以后先启动 APIyarn start:api看到日志输出数据库连接成功、服务监听 3000 端口后再开一个终端启动前端yarn start:client前端开发服务器起来后会自动打开浏览器默认走 4200 端口代理到后端的 3000跨域问题框架层面已经处理好了不需要额外配置。3.4 初始化设置组织、用户和首单业务系统第一次启动后界面上的引导会要求你先创建一个组织Organization并设置基本资料。这一步非常关键因为 Ever Gauzy 几乎所有业务数据都挂在组织下不建组织就无法添加员工、客户和订单。创建组织的流程包括填写组织名称、选择行业、设置时区、货币等。这些信息后续都能在组织设置里修改但建议第一次就尽量填准确避免后续统计口径不一致。接下来建议按这个顺序做初始化配置创建员工档案关联一个登录账号。在设置里配置税收类型、货币格式等财务参数。添加供应商和客户的基本资料。建立产品目录和服务项目方便后面的订单和工单选择。建立一个测试项目关联一个任务走一遍“任务 → 时间工时 → 薪酬统计”的链路。我第一次搭建测试环境时偷懒没有建产品目录结果做发票的时候发现没法选商品只能手动一个一个填明细。所以建好主数据是后面所有业务顺畅运行的前提这一步真的不能省。4. 常见问题与排查技巧实录4.1 数据库连接失败不要盲目相信默认配置这个问题的表现通常是 API 启动时报连接 PostgreSQL 超时或者密码验证失败。原因基本集中在几个地方一是 .env 里的 DB_HOST 写成了 localhost但在 Docker 容器里应该指向 postgres 服务名二是 PostgreSQL 的默认用户密码和配置里的不一致三是数据库端口冲突宿主机上的 PG 占用了 5432。我的建议是用 Docker Compose 的时候确认 database 容器已经健康再启动 API可以通过docker compose ps看状态。改 .env 之后要重启 API 进程因为配置是启动时加载的不是热更新。4.2 Redis 相关功能不生效Ever Gauzy 里 Redis 负责缓存和任务队列比如邮件发送、后台统计任务、定时任务这些功能依赖 Redis 的上游。如果发现自己创建的记录没有触发后续动作比如订单没有自动扣库存第一反应应该是查 Redis 连接是否正常。一个常见问题是 .env 里的 Redis 地址写成了 localhost但实际运行在容器里时也应该使用服务名。另一个容易忽略的是 Redis 密码如果 Redis 实例设置了密码配置里面必须同步填上。排查时可以先用 redis-cli 手动连接测试一下确认连通性再谈业务逻辑。4.3 文件上传之后找不到图片和附件Ever Gauzy 支持本地存储和云存储两种文件保存方式默认是本地存储。本地存储的路径由环境变量控制默认指向应用目录下的某个子文件夹。如果你用源码模式启动然后又让另外一个模块去读取这个文件路径对不上就会出现“接口返回成功但图片 404”的问题。建议在 .env 里显式设置文件存储路径并确保该目录有读写权限。如果用 Docker还需要把目录挂载到宿主机上避免容器重启后文件丢失。如果团队没有特别的私有化需求我更推荐直接对接 S3 或 OSS 这类云存储省去备份和迁移的麻烦。4.4 时区货币和本地化设置细节决定报表对错Ever Gauzy 支持多时区、多货币这也带来一个隐患如果组织设置的时区不对所有工时统计和考勤报表都可能偏移。我曾在测试环境里遇到工时汇总总是少一小时的问题最后发现是设置了错误的 UTC 偏移。货币方面如果一个组织同时涉及多币种交易要做“本位币”的换算设置。默认情况下系统按所选货币显示但报表里的汇总金额需要折算为本位币。这部分配置藏在组织财务设置里找不到的话可以搜索 Currency 相关配置项。我的建议是汇率变动勤快的业务最好定期校验汇率避免对外报价和损溢统计失真。4.5 我再补一个源码调试的实用技巧如果你需要改代码做二次开发强烈建议先跑一遍 API 的单元测试来做环境自检。这个项目单测覆盖了不少核心服务层的逻辑跑一遍能提前暴露环境问题比如数据库 Schema 没建全、Redis 连接异常等省得你后面手工造数据时才发现。另外NestJS 的热重载在开发时是默认启用的改完代码保存后 API 会自动重启这个响应速度对调试很友好。最后分享一点我的实际体会这套系统我最常向朋友推荐的场景有两种一种是想在短期内搭出一套能用的小公司管理系统另外一种是开发团队想参考“企业业务系统到底怎么建模”。Ever Gauzy 的模块完整度、工程粒度、社区活跃度在开源 ERP 项目里都非常值得关注。如果说有哪些不能忽视的“坑”总结下来就是主数据初始化一定要认真、环境配置一定要看日志、文件存储一定要选对方式。只要把这三点把握好这套系统的整体体验会是超出预期的。我目前还在继续跟这个项目后续会在权限配置和报表二开这两个方向再深入写一些文章。如果你也在研究或者落地 Ever Gauzy欢迎在评论区交流你遇到的问题。
返回列表