Docker 部署 ERPNext:轻松搭建开源 ERP 企业管理平台

发布时间:2026/7/29 17:37:16
Docker 部署 ERPNext:轻松搭建开源 ERP 企业管理平台 本文基于 frappe/erpnext:v16.29.0Ubuntu 24.04实测。报价、采购单、入库出库、销售开票、应收应付……公司一大这些单据就散落在 Excel、微信群和好几套互不相通的小软件里库存对不上账、财务月底对账靠人肉、销售一问交期仓库答不上来。商业 ERP / SaaS 能把流程串起来但授权贵、定制慢关键主数据还躺在厂商云上——合规要求「数据不出域」、内网要断公网、或只是想少一份年费时就需要一套可自托管的开源 ERP。ERPNext是 Frappe Technologies 维护的免费开源企业资源规划ERP系统跑在自家的Frappe低代码框架上。同一套 Web Desk 里集成财务会计总账、应收应付、发票与报表、供应链采购、库存、销售、生产制造BOM、工单、委外、固定资产、项目与质量以及公司 / 用户 / 权限等组织主数据业务流程可按行业勾选模块单据之间能互相带出减少「多系统对账」。源代码可按需二次开发无按席位收取的许可费。实例跑在你自己的 Docker 主机上库表与附件落在本地卷里——浏览器打开就能管进销存与账本不必把核心经营数据绑死在某一家公有云 ERP。上手不是「拉一个容器」那么简单。官方运行时镜像要配合MariaDB 双 Redis backend / frontend / worker / scheduler / websocket多服务栈。国内又常访问不了 GitHub没法直接git clone frappe_docker。本文按「能跟做」写完整链路用 轩辕镜像 加速域docker.xuanyuan.run拉取frappe/erpnext:v16.29.0mariadb:11.8redis:6.2-alpine在本地目录粘贴完整 Compose逻辑对齐官方演示栈pwd.yml无需 clone等create-site建站完成后访问8080走完登录与 Welcome 向导再把界面切到简体中文实测搜Chinese会 No Results应搜「中文」或zh并逛一眼组织、会计、资产、库存、生产与全局默认值。Ubuntu 24.04全程实测附15 张截图、运维命令与 FAQ。说明本文 Compose 用于短期试用 / 学习不是生产加固方案。生产请参考官方 frappe_docker 的compose.yaml overrides可在能访问外网的环境准备或自行内嵌 YAML。默认管理员密码仅演示用上线务必修改。镜像说明见 frappe/erpnext 镜像页标签列表见 tags。上游项目ERPNext用户文档docs.erpnext.com。图 1浏览器打开 8080 后的登录页一、ERPNext 是什么ERPNext面向中小企业与成长型团队把「进销存 财务 生产」收拢到一个浏览器工作台Desk。它不是单一进销存插件而是按模块拼装的一体化平台开票与收款进会计科目采购收货进库存余额工单耗料再回写成本——单据链路打通后报表才有可信度。核心能力一览能力说明财务会计总账、应收应付、销售/采购发票、付款与日记账、损益等报表供应链询价/采购订单、收货、库存批次、销售订单与出库、交货相关单据生产制造物料清单BOM、生产工单、工序任务、委外加工固定资产资产卡片、折旧计划、资产移动与维护项目 / 质量项目任务与成本、质量检验相关流程组织与权限多公司、部门、角色权限、用户与系统默认值自托管与扩展Docker / K8s 部署基于 Frappe 可做 DocType / 工作流二次开发和「只做库存的进销存」或「只做记账的财务软件」相比ERPNext 的价值在于同一主数据、多模块协同客户 / 供应商 / 物料只维护一份销售、采购、仓库、财务共用。代价是栈更重数据库 缓存队列 多进程部署与运维门槛高于单容器小工具——这也是本文用 Compose 多服务跟做的原因。典型场景贸易/电商后台的进销存与对账、小型工厂的 BOM 与工单、需要私有化试点以替代昂贵 SaaS ERP 的团队。全球社区持续维护版本线本文为v16中文界面可用但个别术语翻译可能未 100% 覆盖。版本与依赖本文使用frappe/erpnext:v16.29.0配套MariaDB 11.8、Redis 6.2。生产请固定三位版本号勿用latest/develop。架构本文演示栈浏览器 ──HTTP:8080──▶ frontend (nginx) │ ┌───────────────┼───────────────┐ ▼ ▼ ▼ backend:8000 websocket:9000 sites/logs 卷 │ ┌────┼────┬────────────┐ ▼ ▼ ▼ ▼ MariaDB redis-cache redis-queue queue/scheduler二、环境要求项目建议系统Linux 建议Ubuntu 24.04本文实测CPU无 AVX 硬性要求v16.29.0提供amd64 arm64核数 / 内存演示建议≥2 vCPU、≥4 GB RAM生产常见4 vCPU / 8 GB起DockerEngine Compose V2磁盘镜像较大erpnext 单镜像约 800MB整栈建议≥20–40 GBSSD端口宿主机8080frontend目录/www/wwwroot/erpnextdocker--versiondockercompose versionLinux 未装 Dockerbash(wget-qO- https://xuanyuan.cloud/docker.sh)ARM 主机若误拉 amd64 会走模拟变慢可在 compose 各服务加platform: linux/arm64。三、标签怎么选标签用途推荐v16.29.0固定稳定版与官方演示栈对齐试用 / 本文首选v16/version-16跟踪 v16 最新可跟主线生产仍钉三位号v15.xv15 维护线仅业务要求留 v15latest最新稳定仅临时试用develop开发构建勿上生产标签列表xuanyuan.cloud/r/frappe/erpnext/tags。四、拉取镜像轩辕加速上游为 Docker Hubdocker.io。公共登录域docker.xuanyuan.run首次需docker login已登录则直接 pull。规范见 agents.md。grep-qdocker.xuanyuan.run~/.docker/config.jsonecho已登录||echo未登录# 未登录时# docker login docker.xuanyuan.runsudomkdir-p/www/wwwroot/erpnextcd/www/wwwroot/erpnextdockerpull docker.xuanyuan.run/frappe/erpnext:v16.29.0dockerpull docker.xuanyuan.run/library/mariadb:11.8dockerpull docker.xuanyuan.run/library/redis:6.2-alpine实测拉取摘要Digest: sha256:a951e8c905161ec50246d5f6da8e324d89ffb8bb3b407b3508208890f6a9483c Status: Downloaded newer image for docker.xuanyuan.run/frappe/erpnext:v16.29.0 Digest: sha256:efb4959ef2c835cd735dbc388eb9ad6aab0c78dd64febcd51bc17481111890c4 Status: Downloaded newer image for docker.xuanyuan.run/library/mariadb:11.8 Digest: sha256:ec5e187c913d422cdf60f4216a5fdfb95246792c6de6fe21ff5bed75cbfc8c23 Status: Downloaded newer image for docker.xuanyuan.run/library/redis:6.2-alpine失败时按错误码分流401→登录402→充值manifest→核对标签不要默认改回 Docker Hub 直拉。五、部署免 clone 的完整 Compose不要依赖git clone https://github.com/frappe/frappe_docker国内常连不上。在目录内新建docker-compose.yml粘贴下文即可。5.1 完整 docker-compose.yml# docker-compose.yml — ERPNext 演示栈基于 frappe_docker pwd.yml# 访问 http://主机IP:8080 账号 Administrator / adminservices:backend:image:docker.xuanyuan.run/frappe/erpnext:v16.29.0networks:-frappe_networkdeploy:restart_policy:condition:on-failurevolumes:-sites:/home/frappe/frappe-bench/sites-logs:/home/frappe/frappe-bench/logsenvironment:DB_HOST:dbDB_PORT:3306MYSQL_ROOT_PASSWORD:adminMARIADB_ROOT_PASSWORD:admindepends_on:configurator:condition:service_completed_successfullyconfigurator:image:docker.xuanyuan.run/frappe/erpnext:v16.29.0networks:-frappe_networkdeploy:restart_policy:condition:noneentrypoint:-bash--ccommand:-ls -1 apps sites/apps.txt; bench set-config -g db_host $$DB_HOST; bench set-config -gp db_port $$DB_PORT; bench set-config -g redis_cache redis://$$REDIS_CACHE; bench set-config -g redis_queue redis://$$REDIS_QUEUE; bench set-config -g redis_socketio redis://$$REDIS_QUEUE; bench set-config -gp socketio_port $$SOCKETIO_PORT;environment:DB_HOST:dbDB_PORT:3306REDIS_CACHE:redis-cache:6379REDIS_QUEUE:redis-queue:6379SOCKETIO_PORT:9000volumes:-sites:/home/frappe/frappe-bench/sites-logs:/home/frappe/frappe-bench/logscreate-site:image:docker.xuanyuan.run/frappe/erpnext:v16.29.0networks:-frappe_networkdeploy:restart_policy:condition:nonevolumes:-sites:/home/frappe/frappe-bench/sites-logs:/home/frappe/frappe-bench/logsentrypoint:-bash--ccommand:-wait-for-it -t 120 db:3306; wait-for-it -t 120 redis-cache:6379; wait-for-it -t 120 redis-queue:6379; export startdate %s; until [[ -n grep -hs ^ sites/common_site_config.json | jq -r .db_host // empty ]] \ [[ -n grep -hs ^ sites/common_site_config.json | jq -r .redis_cache // empty ]] \ [[ -n grep -hs ^ sites/common_site_config.json | jq -r .redis_queue // empty ]]; do echo Waiting for sites/common_site_config.json to be created; sleep 5; if (( date %s-start 120 )); then echo could not find sites/common_site_config.json with required keys; exit 1 fi done; echo sites/common_site_config.json found; if [ -d sites/frontend ]; then echo Site frontend already exists, skipping creation; else bench new-site --mariadb-user-host-login-scope% --admin-passwordadmin --db-root-usernameroot --db-root-passwordadmin --install-app erpnext --set-default frontend; fi;db:image:docker.xuanyuan.run/library/mariadb:11.8networks:-frappe_networkhealthcheck:test:[CMD,healthcheck.sh,--connect,--innodb_initialized]start_period:5sinterval:5stimeout:5sretries:5deploy:restart_policy:condition:on-failurecommand:---character-set-serverutf8mb4---collation-serverutf8mb4_unicode_ci---skip-character-set-client-handshakeenvironment:MYSQL_ROOT_PASSWORD:adminMARIADB_ROOT_PASSWORD:adminvolumes:-db-data:/var/lib/mysqlfrontend:image:docker.xuanyuan.run/frappe/erpnext:v16.29.0networks:-frappe_networkdepends_on:-websocket-backenddeploy:restart_policy:condition:on-failurecommand:-nginx-entrypoint.shenvironment:BACKEND:backend:8000FRAPPE_SITE_NAME_HEADER:frontendSOCKETIO:websocket:9000UPSTREAM_REAL_IP_ADDRESS:127.0.0.1UPSTREAM_REAL_IP_HEADER:X-Forwarded-ForUPSTREAM_REAL_IP_RECURSIVE:offPROXY_READ_TIMEOUT:120CLIENT_MAX_BODY_SIZE:50mvolumes:-sites:/home/frappe/frappe-bench/sites-logs:/home/frappe/frappe-bench/logsports:-8080:8080queue-long:image:docker.xuanyuan.run/frappe/erpnext:v16.29.0networks:-frappe_networkdeploy:restart_policy:condition:on-failurecommand:-bench-worker---queue-long,default,shortvolumes:-sites:/home/frappe/frappe-bench/sites-logs:/home/frappe/frappe-bench/logsenvironment:FRAPPE_REDIS_CACHE:redis://redis-cache:6379FRAPPE_REDIS_QUEUE:redis://redis-queue:6379depends_on:configurator:condition:service_completed_successfullyqueue-short:image:docker.xuanyuan.run/frappe/erpnext:v16.29.0networks:-frappe_networkdeploy:restart_policy:condition:on-failurecommand:-bench-worker---queue-short,defaultvolumes:-sites:/home/frappe/frappe-bench/sites-logs:/home/frappe/frappe-bench/logsenvironment:FRAPPE_REDIS_CACHE:redis://redis-cache:6379FRAPPE_REDIS_QUEUE:redis://redis-queue:6379depends_on:configurator:condition:service_completed_successfullyredis-queue:image:docker.xuanyuan.run/library/redis:6.2-alpinenetworks:-frappe_networkdeploy:restart_policy:condition:on-failurevolumes:-redis-queue-data:/dataredis-cache:image:docker.xuanyuan.run/library/redis:6.2-alpinenetworks:-frappe_networkdeploy:restart_policy:condition:on-failurescheduler:image:docker.xuanyuan.run/frappe/erpnext:v16.29.0networks:-frappe_networkdeploy:restart_policy:condition:on-failurecommand:-bench-schedulevolumes:-sites:/home/frappe/frappe-bench/sites-logs:/home/frappe/frappe-bench/logsdepends_on:configurator:condition:service_completed_successfullywebsocket:image:docker.xuanyuan.run/frappe/erpnext:v16.29.0networks:-frappe_networkdeploy:restart_policy:condition:on-failurecommand:-node-/home/frappe/frappe-bench/apps/frappe/socketio.jsenvironment:FRAPPE_REDIS_CACHE:redis://redis-cache:6379FRAPPE_REDIS_QUEUE:redis://redis-queue:6379volumes:-sites:/home/frappe/frappe-bench/sites-logs:/home/frappe/frappe-bench/logsdepends_on:configurator:condition:service_completed_successfullyvolumes:db-data:redis-queue-data:sites:logs:networks:frappe_network:driver:bridge数据落在 Compose命名卷sites/logs/db-data/redis-queue-data无需再挂宿主机子目录。5.2 启动与建站日志cd/www/wwwroot/erpnextdockercompose up-ddockercompose logs-fcreate-site实测启动成功时大致为✔ Network erpnext_frappe_network Created ✔ Volume erpnext_redis-queue-data Created ✔ Volume erpnext_sites Created ✔ Volume erpnext_logs Created ✔ Volume erpnext_db-data Created ✔ Container erpnext-db-1 Started ✔ Container erpnext-redis-queue-1 Started ✔ Container erpnext-create-site-1 Started ✔ Container erpnext-configurator-1 Exited ✔ Container erpnext-redis-cache-1 Started ✔ Container erpnext-queue-long-1 Started ✔ Container erpnext-backend-1 Started ✔ Container erpnext-queue-short-1 Started ✔ Container erpnext-scheduler-1 Started ✔ Container erpnext-websocket-1 Started ✔ Container erpnext-frontend-1 Startedcreate-site正常结束示例wait-for-it: db:3306 is available after 28 seconds sites/common_site_config.json found Installing frappe... Installing erpnext... Current Site set to frontend create-site-1 exited with code 0首次建站可能要数分钟。看到exited with code 0后再打开浏览器。容器期望erpnext-configurator-1Exited一次性配置正常erpnext-create-site-1Exited (0)建站完成erpnext-frontend-1等Up0.0.0.0:8080-8080/tcp访问http://服务器IP:8080默认账号Administrator/admin仅演示。六、浏览器登录与 Welcome 向导6.1 登录打开http://IP:8080进入Sign In。邮箱可填Administrator密码admin点Continue。图 1登录页6.2 Welcome语言 / 国家 / 时区 / 货币首次会进入Welcome。国家选China后时区常见为Asia/Chongqing货币CNY。语言默认常为English——不会因选了 China 自动变中文。若此处下拉不好用可先英文走完向导登录后再改见第七节。图 2Welcome——语言、国家、时区、货币6.3 创建账户填写Full Name、Email Address登录 ID、Password点Next。图 3Let’s set up your account6.4 业务画像与模块按提示选择团队规模、工作类型等并可勾选计划启用的模块如 Accounting、Manufacturing、Stock、Project Management。图 4A little about you——模块勾选6.5 等待初始化出现Setting up your system/Starting Frappe …时耐心等待完成后进入 Desk。图 5系统初始化进度七、切换简体中文重要踩坑7.1 为什么搜 Chinese 没有结果语言显示名是「简体中文」代码zh不是英文词Chinese。在 Language 的 Autocomplete 里搜Chinese会显示No Results——这不代表镜像没有中文。正确做法已实测打开用户资料或 Awesome Bar 搜 User→ 找到Language清空原有English输入中文或zh选中结果如zh/ 中文→Save等待Refreshing…再CtrlShiftR强刷图 7搜索「中文」即可匹配到 zh图 8Language 保存为中文页面刷新中命令行兜底站点名本栈为frontenddockercomposeexecbackend bench--sitefrontend set-language zhdockercomposeexecbackend bench--sitefrontend clear-cache7.2 中文 Desk 主页切换成功后主页图标为中文模块名组织、会计、资产、采购、生产、项目、质量、销售、库存、委外、ERPNext 设置等。图 6简体中文 Desk 首页部分菜单/术语仍可能夹杂英文属社区翻译覆盖不全属正常。八、功能演示组织、会计、资产、库存、生产与设置以下截图用于熟悉系统演示数据来自实测环境公司名示例「轩辕镜像」。8.1 组织公司列表进入组织可见公司主数据国家中国、货币 CNY。右下角Getting Started会提示完成公司、用户、邮箱、权限等引导步骤。图 9组织——公司列表8.2 会计快捷入口与开票工作区点击会计可看到开票、付款、报表、税、银行等快捷入口进入开票管理可见损益相关图表与应收应付入口。图 10会计——功能快捷入口图 11开票管理工作区8.3 资产资产模块提供固定资产价值分析、折旧、维护等入口新站点图表可能为空按 Getting Started 逐步建分类与资产即可。图 12资产工作区8.4 库存与生产继续点开库存、生产等工作区左侧为单据与报表导航中间为趋势图与 KPI新站多为 0右下角有模块向导。图 13库存等工作区图 14生产工作区8.5 全局默认值在ERPNext 设置 → 全局默认值可核对默认公司、国家、默认货币CNY等改完点Save。图 15全局默认值官方语言说明Set Language。九、运维命令速查cd/www/wwwroot/erpnextdockercomposeps-adockercompose logs-ffrontenddockercompose logs-fbackenddockercompose logs-fcreate-site# 改语言兜底dockercomposeexecbackend bench--sitefrontend set-language zhdockercomposeexecbackend bench--sitefrontend clear-cache# 停止 / 销毁演示环境可直接 down加 -v 会删命名卷数据dockercompose down# docker compose down -v十、FAQQ能不能docker run单个 erpnext 容器A不能当完整 ERP 用。需要 MariaDB、Redis 与多个进程角色请用本文 Compose。Q国内 clone 不了 frappe_docker 怎么办A不必 clone。把本文docker-compose.yml存到本地目录即可。QCPU 有没有 AVX 之类限制A无 AVX 硬性要求。v16.29.0支持 amd64/arm64。真正卡点是内存与核数建议 ≥4 GB / 2 核起。Q搜 Chinese 没有语言A搜「中文」或zh。详见第七节。Qcreate-site 一直不退出A看docker compose logs -f create-site与db日志确认内存够用、8080 未被占用。正常结束为exited with code 0。Q默认密码安全吗AAdministrator/admin与库 root 密码admin仅演示。公网暴露前必须改密并加防火墙 / 反代 HTTPS。Q这套能直接上生产吗A不建议。请改用官方生产 ComposeHTTPS、密码、备份、资源限制等本文仅作试用。十一、延伸阅读frappe/erpnext 镜像页frappe/erpnext 镜像标签列表轩辕镜像 agents.mdERPNext 文档Set Languagefrappe_docker官方容器编排需可访问 GitHubERPNext 源码仓库