首页 >>  正文

temporary+home

来源:baiyundou.net   日期:2024-08-08

作者:熊猫不是猫QAQ

怕错过我的精彩分享?那就赶快关注下熊猫吧!

前言

该容器其实之前便发现了,但是一直折腾不对,各种报错。近期看到老苏把它折腾好了,于是想着搭建试试。项目为ERPNext,它提供了一套完整的企业解决方案,包括会计、采购、销售、库存、制造、CRM等功能,为中小型企业提供一种简单、易用、灵活的ERP系统,如果你有创业需求,那么在创业初期不愿意花钱买ERP的情况下可以尝试一用。(本次部署使用为群晖6.x系统,推荐至少8G内存)

部署过程

这里我们直接用老苏整理好的docker-compose.yml与env.txt文件,实在是该项目要启动的容器太多了,熊猫懒得折腾了。docker-compose.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文件,里面的内容可以根据自己情况更改。

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

# MariaDB config
DB_HOST=db
DB_PASSWORD=panda
DB_ROOT_PASSWORD=panda
DB_PORT=3336

  • APP_NAME: 主要影响生成的容器名称的前缀

  • APP_VERSION: ERPNext的版本,已测试过v14.22.3 和 v14.23.0;

  • APP_HTTP_IP:主机 IP,要根据你自己的群晖主机IP修改;

  • APP_HTTP_PORT:这是访问ERPNext服务的的本地端口,不冲突就行;

  • APP_PASSWORD:管理员密码,建议登录成功之后再改;

  • DB_HOST:数据库主机,不要改;

  • DB_PASSWORD:数据库密码,建议改;

  • DB_ROOT_PASSWORD:数据库管理员密码,建议改;

  • DB_PORT:数据库本地端口,不冲突就行。\r\n在准备好这一切之后我们打开群晖的ssh功能,随后用ssh工具连接到群晖,依次执行以下命令:

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

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

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

这一步需要等待一段时间,因为需要拉取大概十来个容器,所以请耐心等待,如果出现无法拉取或者拉取超时,可重新执行命令。

体验

如果启动正常那么你能看到你的容器中多了很多容器,前缀都是ERP。

首次启动会等待异常久的时间,我们可以在erp-create-site容器中查看进度,等待该容器自动停止运行后便启动成功了。

我们输入http://群晖IP:6380来访问ERPNext,看看是否可以访问。

OK了!成功启动容器,我们先登录,账户默认为Administrator,密码则是你自己设置的APP_PASSWORD的值,首次登录还会进行一些配置。(语言选择可以选择中文,如果不能选择,直接输入简体中文也行)

设置完成后会自动刷新,便可以看到主界面了,ERP系统的内容连接的都懂,熊猫这里就不一一介绍了。感兴趣的可以自行研究。

总结

以上便是本期的全部内容了,如果你觉得还算有趣或者对你有所帮助,不妨点赞收藏,最后也希望能得到你的关注,咱们下期见!

最后给大家推荐群晖的923+,熊猫最近容器大部分都是使用923+部署。感兴趣的小伙伴可以点点链接去了解哦!!!(无任何合作)

查看文章精彩评论,请前往什么值得买进行阅读互动

","gnid":"9764a8e2cb40aa5f4","img_data":[{"flag":2,"img":[{"desc":"","height":"255","title":"","url":"https://p0.ssl.img.360kuai.com/t01bce4e9ba75852b7a.jpg","width":"600"},{"desc":"","height":"375","title":"","url":"https://p0.ssl.img.360kuai.com/t0153a19d8a2cf29bcf.jpg","width":"600"},{"desc":"","height":"373","title":"","url":"https://p0.ssl.img.360kuai.com/t01735127270fbf7fa3.jpg","width":"600"},{"desc":"","height":"359","title":"","url":"https://p0.ssl.img.360kuai.com/t016b128abcdc03042f.jpg","width":"600"},{"desc":"","height":"579","title":"","url":"https://p0.ssl.img.360kuai.com/t0177628f6e60a62e90.jpg","width":"600"},{"desc":"","height":"296","title":"","url":"https://p0.ssl.img.360kuai.com/t01aecc918ece883f18.jpg","width":"600"},{"desc":"","height":"370","title":"","url":"https://p0.ssl.img.360kuai.com/t01fb99c39593b7bbfa.jpg","width":"600"},{"desc":"","height":"364","title":"","url":"https://p0.ssl.img.360kuai.com/t01da5acde074bee715.jpg","width":"600"},{"desc":"","height":"176","s_url":"https://p0.ssl.img.360kuai.com/t01a01947880c5e05e0_1.gif","title":"","url":"https://p0.ssl.img.360kuai.com/t01a01947880c5e05e0.gif","width":"600"}]}],"original":0,"pat":"art_src_1,fts0,sts0","powerby":"hbase","pub_time":1685081993000,"pure":"","rawurl":"http://zm.news.so.com/8e2e6f1d60d60f75bd8c34e815b0e469","redirect":0,"rptid":"76bbbc3f2e1f17d4","rss_ext":[],"s":"t","src":"什么值得买","tag":[{"clk":"ktechnology_1:app","k":"app","u":""}],"title":"请问需要企业服务吗?我用NAS搭建ERPNext助力你的创业!

平仁蒋3594temp在编程语言中是什么意思 -
郭狠昌17252448934 ______ temp在编程语言中没有特别的含义,既不是关键字也不是库函数的函数名. 可能是编程人员自定义的一个变量名或函数名. 通常用来定义一个临时变量,是"临时"英文单词temporary的前4个字母. 举例如下: int temp; // 定义一个int类型的变量,变量名为temp double temp; // 定义一个double类型的变量,变量名为temp int temp(int a, int b) // // 自定义一个函数,函数名为temp { return a+b; }

平仁蒋3594Temporarily于temporary的词性 -
郭狠昌17252448934 ______ 不一定的. ly不一定是副词词尾,但是大部分形容词的副词形式都是用ly副词词尾. temporarily ['tempərərili] adj. 临时的 adv. 暂时地,临时地 temporary ['tempərəri] adj. 暂时的,临时的 n. 临时工

平仁蒋3594用 temporary 造句 -
郭狠昌17252448934 ______ He found a temporary lodgment in Paris. 他在巴黎找到了一个临时住所.

平仁蒋3594以temporary结尾的单词
郭狠昌17252448934 ______ extemporary [形容词] :无准备的contemporary[形容词] : 当代的; 同时代的; 同年龄的[名词] : 同时代的人; 同龄人

平仁蒋3594momentary 和temporary 的区别 -
郭狠昌17252448934 ______ temporary和momentary,transient 这些形容词均含“短暂的,瞬息的”的意思. temporary:普通用词,其反义是permanent.指持续有限的可计时间,着重暂时的存在、应用或效应. momentary:指瞬时即逝的,也表明间很短的. transient:指停留或延续的时间很短.

平仁蒋3594temporary;transient; contingent; provisional; temporal都表临时的,在英语中有什么区别? -
郭狠昌17252448934 ______ temporal表示“当时或某个时候呈现的状态或动作时的时间”,意味“当时的” provisional 表示“暂时的、尚未解决的”,多用于合同、协议的条款中 contingent 表示“可能发生但不一定发生需要依赖一定的环境条件的一种临时状态” transient强调的是“时间短暂” temporary表示“短暂的时间或状态”,强调缺乏持续性,耐性.

平仁蒋3594temporary 和 interim 都有临时的意思有什么区别 -
郭狠昌17252448934 ______ Temporary主要用于形容一些突发性的事件,缺乏规律性.大多用在这样没有固定开始和结束的临时,随机性、随意性大. interim强调的是间隔时间,可具有周期性,过渡性和中间过程. temporary 和 interim 详细区别: 1、Temporary: adj. 暂时...

平仁蒋3594temporary threshold shift是什么意思 -
郭狠昌17252448934 ______ temporary threshold shift [英][ˈtempərəri ˈθreʃhəuld ʃift][美][ˈtɛmpəˌrɛri ˈθrɛʃˌold ʃɪft] 暂时性阈移; 网络 文本暂时延时; 一时性听力障碍;

平仁蒋3594谁能帮我翻译temporary hardness是什么意思
郭狠昌17252448934 ______ 暂时硬度

平仁蒋3594temporary 和for the time being的区别,怎么用 -
郭狠昌17252448934 ______ temporary 是形容词 temporarily = for the time being 当副词使用就可以 I am here temporarily, and I am going to beijing tommorow

(编辑:自媒体)
关于我们 | 客户服务 | 服务条款 | 联系我们 | 免责声明 | 网站地图 @ 白云都 2024