开源企业资源规划ERPNext的安装

news2024/7/3 10:51:02

在这里插入图片描述

往常节假日,都是呆在家里看别人堵,这回老苏也出门凑了个热闹,28号早上 7 点半出的门

在这里插入图片描述

2 点半往回走的

在这里插入图片描述

一天啥也没干,就开了 7 个小时的车去舅舅家蹭了顿饭。还别说,那个田园鸡味道是真不错。

车很久没开了,但这回起码两个月不用遛了。


本文是应网友 潇雨 的要求折腾的。

什么是 ERPNext ?

ERPNext 是一种免费的、开源的企业资源规划(ERP)软件,它提供了一套完整的企业解决方案,包括会计、采购、销售、库存、制造、CRM 等功能。ERPNext 旨在为中小型企业提供一种简单、易用、灵活的 ERP 系统,以帮助企业管理业务流程、优化运营效率、提高生产力和盈利能力。ERPNext 建立在 Frappe 框架之上,这是一个使用 PythonJavaScript 构建的全栈 web 应用程序框架。

前期准备

在网友提出要求之前,老苏也曾经尝试过安装 ERPNext,但都以失败告终。

首先尝试了英文版,但由于涉及多个容器,可能有些地方改漏了、改错了,导致出现了错误,因为工作原因,也没有太多的时间去深入研究。

之后又尝试了中文版,这是一个All in one 的版本,安装相对简单。但遗憾的是,老苏一直遇到数据库出错的问题。由于老苏的机器内存较小,初步怀疑这可能是导致问题的原因。此外,由于容器内反复启动,导致机器的 CPU 占用率也急剧上升,最终只能放弃了。

docker-compose.yml

这次老苏牺牲了几个晚上,认真把 docker-compose.yml 好好整理了一下👇。如果你不知道什么含义,不建议你直接改这个文件,老苏已经把需要修改的内容,单独拎了出来放在了env.txt

docker-compose.yml 是基于官网 https://github.com/frappe/frappe_docker/blob/main/pwd.yml 修改

version: "3"

services:
  backend:
    image: frappe/erpnext:${APP_VERSION}
    container_name: ${APP_NAME}-backend
    deploy:
      restart_policy:
        condition: on-failure
    volumes:
      - sites:/home/frappe/frappe-bench/sites
      - logs:/home/frappe/frappe-bench/logs
      
  configurator:
    image: frappe/erpnext:${APP_VERSION}
    container_name: ${APP_NAME}-configurator
    deploy:
      restart_policy:
        condition: none
    entrypoint:
      - bash
      - -c
    depends_on:
      - db
    command:
      - >
        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_SOCKETIO";
        bench set-config -gp socketio_port $$SOCKETIO_PORT;
    environment:
      DB_HOST: db
      DB_PORT: "3306"
      REDIS_CACHE: redis-cache:6379
      REDIS_QUEUE: redis-queue:6379
      REDIS_SOCKETIO: redis-socketio:6379
      SOCKETIO_PORT: "9000"
    volumes:
      - sites:/home/frappe/frappe-bench/sites
      - logs:/home/frappe/frappe-bench/logs
      
  create-site:
    image: frappe/erpnext:${APP_VERSION}
    container_name: ${APP_NAME}-create-site
    depends_on:
      - configurator
    deploy:
      restart_policy:
        condition: none
    volumes:
      - sites:/home/frappe/frappe-bench/sites
      - logs:/home/frappe/frappe-bench/logs
    entrypoint:
      - bash
      - -c
    command:
      - >
        wait-for-it -t 240 db:3306;
        wait-for-it -t 120 redis-cache:6379;
        wait-for-it -t 120 redis-queue:6379;
        wait-for-it -t 120 redis-socketio:6379;
        export start=`date +%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";
        bench new-site frontend --no-mariadb-socket --admin-password=${APP_PASSWORD} --db-root-password=${DB_ROOT_PASSWORD} --install-app erpnext --set-default;

  db:
    image: mariadb:10.6
    container_name: ${APP_NAME}-db
    healthcheck:
      test: mysqladmin ping -h localhost --password=${DB_PASSWORD}
      interval: 1s
      retries: 15
    deploy:
      restart_policy:
        condition: on-failure
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
      - --skip-character-set-client-handshake
      - --skip-innodb-read-only-compressed # Temporary fix for MariaDB 10.6
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
    volumes:
      - ./data:/var/lib/mysql
    #ports:
    #  - "${DB_PORT}:3306"

  frontend:
    image: frappe/erpnext:${APP_VERSION}
    container_name: ${APP_NAME}-frontend
    deploy:
      restart_policy:
        condition: on-failure
    command:
      - nginx-entrypoint.sh
    environment:
      BACKEND: backend:8000
      FRAPPE_SITE_NAME_HEADER: frontend
      SOCKETIO: websocket:9000
      UPSTREAM_REAL_IP_ADDRESS: ${APP_HTTP_IP}
      UPSTREAM_REAL_IP_HEADER: X-Forwarded-For
      UPSTREAM_REAL_IP_RECURSIVE: "off"
      PROXY_READ_TIMOUT: 120
      CLIENT_MAX_BODY_SIZE: 50m
    volumes:
      - sites:/home/frappe/frappe-bench/sites
      - logs:/home/frappe/frappe-bench/logs
    ports:
      - "${APP_HTTP_PORT}:8080"

  queue-default:
    image: frappe/erpnext:${APP_VERSION}
    container_name: ${APP_NAME}-queue-default
    deploy:
      restart_policy:
        condition: on-failure
    command:
      - bench
      - worker
      - --queue
      - default
    volumes:
      - sites:/home/frappe/frappe-bench/sites
      - logs:/home/frappe/frappe-bench/logs

  queue-long:
    image: frappe/erpnext:${APP_VERSION}
    container_name: ${APP_NAME}-queue-long
    deploy:
      restart_policy:
        condition: on-failure
    command:
      - bench
      - worker
      - --queue
      - long
    volumes:
      - sites:/home/frappe/frappe-bench/sites
      - logs:/home/frappe/frappe-bench/logs

  queue-short:
    image: frappe/erpnext:${APP_VERSION}
    container_name: ${APP_NAME}-queue-short
    deploy:
      restart_policy:
        condition: on-failure
    command:
      - bench
      - worker
      - --queue
      - short
    volumes:
      - sites:/home/frappe/frappe-bench/sites
      - logs:/home/frappe/frappe-bench/logs

  redis-queue:
    image: redis:6.2-alpine
    container_name: ${APP_NAME}-redis-queue
    deploy:
      restart_policy:
        condition: on-failure
    volumes:
      - ./redis-queue-data:/data

  redis-cache:
    image: redis:6.2-alpine
    container_name: ${APP_NAME}-redis-cache
    deploy:
      restart_policy:
        condition: on-failure
    volumes:
      - ./redis-cache-data:/data

  redis-socketio:
    image: redis:6.2-alpine
    container_name: ${APP_NAME}-redis-socketio
    deploy:
      restart_policy:
        condition: on-failure
    volumes:
      - ./redis-socketio-data:/data

  scheduler:
    image: frappe/erpnext:${APP_VERSION}
    container_name: ${APP_NAME}-scheduler
    deploy:
      restart_policy:
        condition: on-failure
    command:
      - bench
      - schedule
    volumes:
      - sites:/home/frappe/frappe-bench/sites
      - logs:/home/frappe/frappe-bench/logs
      
  websocket:
    image: frappe/erpnext:${APP_VERSION}
    container_name: ${APP_NAME}-websocket
    deploy:
      restart_policy:
        condition: on-failure
    command:
      - node
      - /home/frappe/frappe-bench/apps/frappe/socketio.js
    volumes:
      - sites:/home/frappe/frappe-bench/sites
      - logs:/home/frappe/frappe-bench/logs
      
volumes:
  logs:
  sites:

env.txt

下面是 env.txt 的内容,之所以没用 .env 是为了方便在 File Station 中方便修改,但是带来的不方便之处是启动时需要指定 --env-file,当然在 docker-compose.yml 中指定也是可以的

# ERPNext config
APP_NAME=erp
APP_VERSION=v14.23.0
APP_HTTP_IP=192.168.0.197
APP_HTTP_PORT=6380
APP_PASSWORD=admin

# MariaDB config
DB_HOST=db
DB_PASSWORD=twj9nwyoutRei9C4VV
DB_ROOT_PASSWORD=4aixKdghP3j56hPB8k
DB_PORT=3336
  • APP_NAME: 主要影响生成的容器名称的前缀

在这里插入图片描述

  • APP_VERSIONERPNext 的版本, 老苏测试过v14.22.3v14.23.0,其他版本没试过;
  • APP_HTTP_IP:主机 IP,要根据你自己的群晖主机 IP 修改;
  • APP_HTTP_PORT:这是访问 ERPNext 服务的的本地端口,不冲突就行;
  • APP_PASSWORD:管理员密码,建议登录成功之后再改;
  • DB_HOST:数据库主机,不要改;
  • DB_PASSWORD:数据库密码,建议改;
  • DB_ROOT_PASSWORD:数据库管理员密码,建议改;
  • DB_PORT:数据库本地端口,不冲突就行,默认老苏在 docker-compose.yml 中已经注释掉了端口;

上面两个文件,老苏放在了 https://github.com/wbsu2003/synology/tree/main/ERPNext

安装

采用 docker-compose 方式运行

# 新建文件夹 erpnext 和 子目录
mkdir -p /volume2/docker/erpnext/{data,redis-cache-data,redis-queue-data,redis-socketio-data}

# 进入 erpnext 目录
cd /volume2/docker/erpnext

# 将 docker-compose.yml 和 env.txt 两个文件放入当前目录
  
# 一键运行
docker-compose --env-file env.txt up -d

如果一键启动总是超时,可以加个 timeout 参数

# 超时设置
docker-compose --env-file env.txt up -d --timeout 120

运行

如果你没有修改 APP_HTTP_PORT的值,你可以在浏览器中打开 http://群晖IP:6380来访问 ERPNext.

第一次启动的过程是比较长的,因为脚本中使用了 wait-for-it,好几处都是 -t 120,老苏甚至把数据库的改为了 wait-for-it -t 240 db:3306;,如果能看到登录界面,说明安装成功了

  • 默认的账号是 Administrator,密码就是前面设置的 APP_PASSWORD 的值,如果你没改的话,那就是 admin

在这里插入图片描述

软件启动后,正常情况下,erp-configuratorerp-create-site 会停掉,因为它们已经完成了自己的使命

在这里插入图片描述

但如果出现👇的错误

在老苏的机器上还是会有一定的几率发生,不要慌,我们还有补救措施,请往下看

在这里插入图片描述

则还需要执行一次下面的命令

参考文档:

  • https://github.com/frappe/frappe_docker/blob/main/docs/site-operations.md
  • https://github.com/frappe/frappe_docker/issues/711
# 设置新站点
docker-compose --env-file env.txt exec backend bench new-site <site-name> --no-mariadb-socket --admin-password=<管理员密码> --db-root-password=<数据库root账户的密码> --install-app erpnext --set-default

# 示例
docker-compose --env-file env.txt exec backend bench new-site frontend --no-mariadb-socket --admin-password=admin --db-root-password=4aixKdghP3j56hPB8k --install-app erpnext --set-default

其中:

  • <site-name> 对应于 docker-compose.yml 中前端的 service name 的名称 frontend,这个在 nginx 的设置中也用到了;
  • <管理员密码> 对应前面 env.txt 中的 APP_PASSWORD 的值;
  • <数据库root账户的密码> 对应前面 env.txt 中的 DB_ROOT_PASSWORD 的值;

在这里插入图片描述

之所以会出现这样的情况,应该还是容器编排的启动顺序上有问题,这些命令按道理在 erp-create-site 容器中应该是要被执行的

之后,如果容器停止了,再启动也是需要时间的,你太快打开网址,会看到下面这样的界面

在这里插入图片描述

登录成功后,第一次还需要设置

在这里插入图片描述

语言有时候能弹出下拉,但是有时候又不行,不过可以直接输入,现在已经支持 简体中文

在这里插入图片描述

国家支持下拉,但可能输入更快

在这里插入图片描述

设置用户

在这里插入图片描述

设置公司

在这里插入图片描述

设置组织

在这里插入图片描述

设置完成

在这里插入图片描述

现在可以开始使用了

在这里插入图片描述

至于反代,老苏试过 npm ,正常设置就可以,无论你的域名有没有端口,都是可以正常访问的。

参考文档

ERPNext: Free and Open Source Cloud ERP Software
地址:https://erpnext.com/

frappe/erpnext: Free and Open Source Enterprise Resource Planning (ERP)
地址:https://github.com/frappe/erpnext

frappe/frappe_docker: Docker images for production and development setups of the Frappe framework and ERPNext
地址:https://github.com/frappe/frappe_docker
Home
地址:https://docs.erpnext.com/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/479865.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(详解)vue中实现 ‘换肤 / 主题切换’ 功能的三种方式

目录 一、背景 二、实现思路 方法1&#xff1a;定义全局的CSS变量 方法2&#xff1a;切换已定义好的css文件 方法3&#xff1a;切换顶级CSS类名 (需使用css处理器,如sass、less等) 一、背景 在我们开发中我们会遇到像是需要切换程序风格、主题切换啦这种应用场景。 二、实现…

JavaScript通过函数异常处理来输入圆的半径,输出圆的面积的代码

以下为实现通过函数异常处理来输入圆的半径&#xff0c;输出圆的面积的代码和运行截图 目录 前言 一、通过函数异常处理来输入圆的半径&#xff0c;输出圆的面积 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 运行截图 前言 1.若有选择&#xff0c;您可以…

【RPA开发】pymongo 使用教程

实际开发时抓取到的诸多数据如何保存是一个关键问题&#xff0c;MongoDB 相比传统关系型数据库&#xff08;比如mysql&#xff09;来说灵活度更高&#xff0c;爬虫时字段格式及数量很可能会随着需求或实际数据的变动而改变&#xff0c;因此 MongoDB 作为数据库来说最合适不过了…

2023年华中杯选题人数公布

2023年华中杯选题人数公布 经过一晚上代码的编写&#xff0c;论文的写作&#xff0c;C题完整版论文已经发布&#xff0c; 注&#xff1a;蓝色字体为说明备注解释字体&#xff0c;不能出现在大家的论文里。黑色字体为论文部分&#xff0c;大家可以根据红色字体的注记进行摘抄。…

【STM32】知识补充 分频技术深度解析: 原理、应用与实现方法

【STM32】知识补充 分频技术深度解析: 原理、应用与实现方法 概述分频概念分频原理技术器分频器触发器分频器模数计数器分频器 分频应用微控制器时钟分频通信系统中的频率合成数字电路设计中的计时与同步 分频实现方法硬件分频器软件分频器 案例总结 概述 分频 (Frequency Div…

c#笔记-创建一个项目

创建一个项目 创建控制台程序 在你安装完成Visual Studio后打开它&#xff0c;你会的到一个启动窗口 点击创建新项目&#xff0c;选择右上角c#的没有Framework的控制台应用。 项目名称&#xff0c;位置自己随意。 目标框架选择NET7.0。 项目创建完成后应该你的界面应该类似…

nvdec与vaapi与vdpau的关系

nvdec/vaapi/vdpau的关系 NVDEC&#xff1a;nvidia video decoder。 英伟达官网中有关video codec SDK的介绍&#xff0c;其中有头文件、开发API文档等。 Nvidia Video SDK中提供了NVDEC、NVENC&#xff0c;其中NVDEC以前也叫做NVCUVID&#xff08;不知道NVDEC的开发API中很…

【9.HTML入门知识-其他知识补充】

其他知识补充 1.使用Web字体和图标1.1 web fonts兼容性写法1.2 字体图标1.2.1 字体图标的使用 2.精灵图 CSS Sprite2.1 精灵图的使用 3.置鼠标指针&#xff08;光标&#xff09;样式cusor4.居中方案4.1 使用绝对定位元素居中 1.使用Web字体和图标 1.1 web fonts兼容性写法 1.2 …

软件开发团队的护网低成本应对方案

主题&#xff1a; 1、攻击方技术手段说明&#xff0c;结合攻击队手段重点关注的防御点介绍&#xff1b; 2、防守方&#xff08;软件开发团队&#xff09;的低成本应对思路&#xff1b;系统是如何被攻破的 攻防演练&#xff08;APT&#xff09;攻击路径 未知攻&#xff0c;焉知…

IGH EtherCAT主站应用层代码开发:控制驱动电机

1、安装IGH EtherCAT主站 Ubuntu18.04环境下安装igH EtherCAT Master 2、查询从站配置信息 连接从站通过网线连接主站与从站 启动主站打开终端,输入: sudo /etc/init.d/ethercat star 显示Starting EtherCAT master 1.5.2 done则说明成功。 查询从站列表终端输入: eth…

【C++】 list-map 链表与映射表的简单使用

目录 list 链表 定义链表&#xff0c;并在首、尾添加、删除元素 迭代器遍历链表 任意位置插入或删除 获取首尾节点中元素的值 使用增强的范围for循环进行遍历链表 其他常见的函数 map 映射表 定义map 添加 使用函数插入元素 迭代器遍历map 修改 删除 使用增强的范…

PMP项目管理-[第七章]成本管理

成本管理知识体系&#xff1a; 规划成本管理&#xff1a; 估算成本&#xff1a; 制定预算&#xff1a; 控制成本&#xff1a; 7.1 挣值管理新兴实践 ps&#xff1a;了解即可&#xff0c;考试考不到 7.2 规划成本管理 定义&#xff1a;确定如何估算、预算、管理、监督和控制项目…

直接插入排序

一、概念及其介绍 插入排序(InsertionSort)&#xff0c;一般也被称为直接插入排序。 对于少量元素的排序&#xff0c;它是一个有效的算法。插入排序是一种最简单的排序方法&#xff0c;它的基本思想是将一个记录插入到已经排好序的有序表中&#xff0c;从而一个新的、记录数增…

你是否曾经为自己写的代码而感到懊恼?那如何才能写出高质量代码呢?

这里写目录标题 一、 前言二、高质量代码的特征三、编程实践技巧1. 遵循编码规范2. 使用有意义的变量名和函数名3. 减少代码重复4. 使用注释5. 编写单元测试6. 使用设计模式7. 使用版本控制工具8. 保持代码简洁9. 优化代码性能10. 学习和借鉴他人的代码总结 一、 前言 写出高质…

Python入门教程+项目实战-11.5节: 程序实战-选择排序算法

目录 11.5.1 排序算法简介 11.5.2 选择排序算法 11.5.3 系统学习python 11.5.1 排序算法简介 所谓排序&#xff0c;是指将数据集合中的元素按从小到大的顺序进行排列&#xff0c;或按从大到小的顺序进行排列。前者称为升序排序&#xff0c;后者称为降序排序。在数据结构与算…

ChatGPT会颠覆SEO内容创作吗

近几年 AI 的发展日新月异。除了搜索算法本身大规模应用人工智能&#xff0c;我也一直关注着 AI 用于写作的进展。 上篇关于 Google 有用内容更新的帖子还在说&#xff0c;高质量内容创作是 SEO 最难的事之一&#xff0c;对某些网站来说&#xff0c;如果能有工具帮助&#xff…

python毕业设计之django+vue.js幼儿园网站系统

开发语言&#xff1a;Python 框架&#xff1a;django Python版本&#xff1a;python3.7.7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;PyCharm 采用了Windows10操作系统平台&#xff0c;使用HTMLCSSJS前端模板django作为后台监控&#xff0…

大数据Doris(九):Apache Doris 简单使用

文章目录 Apache Doris 简单使用 一、用户创建 二、创建数据库 三、账户赋权 四、创建数据表 1、创建数据表 2、准备数据 3、导入数据 五、查询数据表 Apache Doris 简单使用 下面按照官网给出的示例简单操作Doris&#xff0c;首先创建用户、创建数据库、赋权、创建表…

第二弹进阶吴恩达 ChatGPT Prompt 技巧

第一弹笔记在这里&#xff1a; 总结吴恩达 ChatGPT Prompt 免费课程 今天分享第二弹&#xff0c;进阶篇。 第一点&#xff0c;任务序列化。 通常看完一篇长文&#xff0c;脑子里往往充满无数疑问。急切想知道所有答案&#xff0c;必须列一个问题清单。对话式问法&#xff0c;对…

ChatGPT:数字时代革新与展望

ChatGPT&#xff1a;数字时代革新与展望 AGI 未来的愿景&#xff1a;建安全有益的 AGI OpenAI团队对AGI的展望&#xff1a; 我们希望 AGI 能够赋予人类在宇宙中最大程度地繁荣发展的能力。我们不期望未来是一个不合格的乌托邦&#xff0c;但我们希望将好的最大化&#xff0c;将…