1. 项目概述:为什么在 Ubuntu 18.04 上部署 ERPNext 是个“硬核但值得”的选择
ERPNext 这套开源企业资源计划系统,我从 2017 年开始接触,最早是在树莓派上跑 demo,后来在客户现场用过 CentOS 7 搭的生产环境,再后来自己搭过 Docker 版本。但直到去年帮一家本地制造企业做数字化升级时,我才真正把 ERPNext 安装在一台物理服务器上——操作系统就是 Ubuntu 18.04。你可能会问:都 2025 年了,Ubuntu 22.04、24.04 都已发布,为什么还要回头折腾一个早已进入 ESM(扩展安全维护)阶段的老系统?答案很实在:不是怀旧,是现实约束下的最优解。这家企业的 IT 管理员明确要求“所有基础组件必须有长期稳定支持记录”,而 Ubuntu 18.04 的 ESM 支持周期到 2028 年 4 月,比很多商业 ERP 的维保期还长;更重要的是,他们现有的监控告警系统、备份脚本、甚至防火墙策略,全部是基于 18.04 的内核和 systemd 版本写的,强行升级 OS 会触发一连串连锁故障。所以,“Cómo instalar una pila ERPNext en Ubuntu 18.04”这个标题,表面是个安装教程,背后其实是一套面向中小企业的、兼顾稳定性、可控性与可维护性的技术决策逻辑。它解决的不是“能不能装”的问题,而是“如何在有限约束下,让 ERPNext 跑得稳、管得住、修得快”。适合谁?三类人最该认真读完:第一类是像我这样的自由技术顾问,常被要求在客户既定基础设施上落地系统;第二类是中小企业 IT 兼职管理员,手头只有一台旧服务器,预算有限,又不想天天打补丁;第三类是高校实验室或培训讲师,需要一套结构清晰、依赖明确、便于教学拆解的 ERP 部署范例——因为 Ubuntu 18.04 的软件源版本边界非常清晰,MariaDB 是 10.1,Python 是 3.6,Node.js 是 10.x,没有版本模糊地带,学生能一眼看懂每个组件的职责边界。核心关键词 ERPNext、Ubuntu 18.04、MariaDB、Node.js、Yarn,它们不是孤立的工具名,而是一条完整的“数据流管道”:用户在浏览器里点下一个采购单(前端 Vue + Node.js 渲染),请求发到后端 Python 应用(ERPNext 核心),Python 层调用 MariaDB 存取库存和供应商数据,而整个前端工程的构建、依赖管理、热重载开发,则全靠 Yarn 来调度。这五个词串起来,就是 ERPNext 在 Ubuntu 18.04 上真实运转的“血液循环图”。
2. 整体架构设计与技术选型逻辑:为什么是这套组合,而不是别的
2.1 为什么坚持用 Ubuntu 18.04 而非更新版本?
很多人看到“Ubuntu 18.04”第一反应是“太老了”,但这个判断忽略了企业级部署的核心诉求:确定性。我拿一个真实案例说明:去年给一家食品加工厂部署时,他们用的是一台 Dell R720 服务器,CPU 是 E5-2630 v2,内存 64GB,硬盘是 4 块 1TB SATA 盘组 RAID 10。这种硬件在 2025 年依然健壮,但它的 BIOS 不支持 Secure Boot,而 Ubuntu 22.04 默认启用 UEFI 安全启动,强制开启会导致系统无法识别 RAID 卡上的磁盘阵列。我们试过禁用 Secure Boot,结果发现主板固件版本太低,禁用后 USB 键盘失灵,连 BIOS 设置都进不去。最后的解法,就是回退到 Ubuntu 18.04 的 Legacy BIOS 模式,整个安装过程 20 分钟搞定,RAID 识别、网络驱动、磁盘挂载全部原生支持。这就是“老系统”的价值:它不追求新特性,但把兼容性刻进了基因。Ubuntu 18.04 的内核是 4.15,systemd 是 237,这两个版本在大量工业网关、嵌入式设备、老旧服务器上经过了十年以上的压力验证。ERPNext 官方文档虽然主推 Ubuntu 20.04/22.04,但它底层依赖的 Frappe 框架对 Python 3.6+、MariaDB 10.1+、Node.js 10+ 全部兼容,这意味着只要我们手动控制好组件版本,18.04 反而是最“干净”的画布——没有新版系统里那些为兼容旧软件而加的冗余 shim 层,也没有因激进优化引入的不可预测行为。我统计过过去三年帮客户部署的 17 个 ERPNext 实例,其中 9 个运行在 Ubuntu 18.04 上,平均无故障运行时间是 412 天,远高于 22.04 实例的 287 天。原因很简单:18.04 的更新包数量少,每次 apt upgrade 触发的变更面小,出问题的概率自然低。
2.2 为什么数据库必须选 MariaDB,而不是 MySQL 或 PostgreSQL?
ERPNext 官方明确声明“仅支持 MariaDB”,这不是营销话术,而是由底层 Frappe 框架的 SQL 生成器决定的。Frappe 大量使用了 MariaDB 特有的 INSERT ... ON DUPLICATE KEY UPDATE 语法来实现高并发下的库存扣减,这个语法在 MySQL 5.7 中虽存在,但行为不一致(比如对 NULL 值的处理),而在 PostgreSQL 中则完全不存在对应写法。我做过对比测试:把同一套 ERPNext 数据库 dump 导入 MySQL 5.7,执行采购入库单时,系统会报错 Unknown column 'modified' in 'field list' ,原因是 MySQL 对 DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 的字段定义解析更严格,而 MariaDB 10.1 允许在 modified 字段上同时设置默认值和自动更新,这是 ERPNext 表结构定义的基础。至于 PostgreSQL,Frappe 框架里有大量硬编码的 SHOW VARIABLES LIKE 'max_allowed_packet' 这类 MySQL/MariaDB 专属命令,直接报错退出。还有一个实操中极易被忽略的点:字符集。Ubuntu 18.04 的 MariaDB 10.1 默认字符集是 latin1 ,而 ERPNext 要求 utf8mb4 。如果跳过这一步,后期录入中文供应商名称、产品描述时,数据库会静默截断超出 latin1 范围的字符,导致数据丢失且难以排查。我见过最惨的一次,是客户在“物料主数据”里录入了“不锈钢304”,结果数据库只存了“不锈”,后面两位“钢3”被丢弃,采购单打印出来全是错的。所以,MariaDB 不是“可选项”,而是“唯一解”,它的版本、配置、字符集,每一个参数都卡在 ERPNext 的运行命门上。
2.3 Node.js 和 Yarn 的角色分工:它们到底在 ERPNext 里干啥?
很多初学者以为 Node.js 是 ERPNext 的后端服务,这是个典型误解。ERPNext 的业务逻辑、数据库交互、权限控制、工作流引擎,全部由 Python 编写的 Frappe 框架承担,Node.js 在这里纯粹是“前端工程化工具链”的一部分。具体来说,它负责三件事:第一,编译 Vue.js 前端代码。ERPNext 的 Web 界面是用 Vue 2.6.12 写的(注意,不是 Vue 3),所有 .vue 文件、 .js 组件、CSS 样式,都需要通过 Webpack 打包成浏览器能直接加载的静态文件;第二,提供开发服务器( bench start 启动后, http://localhost:8000 的实时热重载功能就靠 Node.js 的 webpack-dev-server );第三,管理前端依赖。比如 frappe-web 这个包,它封装了登录页、全局导航栏、消息通知等公共 UI 组件,这些不是 ERPNext 自己写的,而是从 npm 仓库下载的独立模块,Yarn 就是负责下载、校验、链接这些模块的“包管家”。这里有个关键细节:Ubuntu 18.04 的 APT 源里自带的 Node.js 是 8.x,而 ERPNext 要求最低 10.19.0。为什么不能用 8.x?因为 Vue 2.6.12 的 vue-template-compiler 依赖 @babel/parser 7.x,而后者需要 Node.js 10+ 的 async/await 语法支持。我试过强行用 nvm 切换到 Node.js 8.17.0, bench setup requirements 能跑过,但 bench build 会卡在 Parsing err


488

被折叠的 条评论
为什么被折叠?



