开源库存管理系统InvenTree的安装

news2025/1/15 13:00:15

在这里插入图片描述

本文是应网友 shijie880500 要求折腾的;

什么是 InvenTree ?

InvenTree 是一个开源的库存管理系统,提供强大的低级别库存控制和零件跟踪。InvenTree 系统的核心是 Python/Django 数据库后端,它提供了一个管理界面(基于 web)和一个 REST API,用于与外部接口和应用程序交互。强大的插件系统为自定义应用程序和扩展提供支持。

前期准备

在群晖上以 Docker 方式安装。因为涉及到多个容器,所以采用了 docker-compose 安装

老苏是按生产环境搭建,因为开发模式只能用 localhost 访问,所需的文件都来自于官方的 production 目录:https://github.com/inventree/InvenTree/tree/master/docker/production

版本选择的是 InvenTree 的最新稳定版本stable ,对应的版本为 0.12.8

docker-compose.yml

将下面的内容保存为 docker-compose.yml 文件

version: "3.8"

# Docker compose recipe for a production-ready InvenTree setup, with the following containers:
# - PostgreSQL as the database backend
# - gunicorn as the InvenTree web server
# - django-q as the InvenTree background worker process
# - nginx as a reverse proxy
# - redis as the cache manager (optional, disabled by default)

# ---------------------
# READ BEFORE STARTING!
# ---------------------

# -----------------------------
# Setting environment variables
# -----------------------------
# Shared environment variables should be stored in the env.txt file
# Changes made to this file are reflected across all containers!
#
# IMPORTANT NOTE:
# You should not have to change *anything* within this docker-compose.yml file!
# Instead, make any changes in the env.txt file!

# ------------------------
# InvenTree Image Versions
# ------------------------
# By default, this docker-compose script targets the STABLE version of InvenTree,
# image: inventree/inventree:stable
#
# To run the LATEST (development) version of InvenTree,
# change the INVENTREE_TAG variable (in the env.txt file) to "latest"
#
# Alternatively, you could target a specific tagged release version with (for example):
# INVENTREE_TAG=0.7.5
#

services:
    # Database service
    # Use PostgreSQL as the database backend
    inventree-db:
        image: postgres:13
        container_name: inventree-db
        expose:
            - ${INVENTREE_DB_PORT:-5432}/tcp
        environment:
            - PGDATA=/var/lib/postgresql/data/pgdb
            - POSTGRES_USER=${INVENTREE_DB_USER:?You must provide the 'INVENTREE_DB_USER' variable in the env.txt file}
            - POSTGRES_PASSWORD=${INVENTREE_DB_PASSWORD:?You must provide the 'INVENTREE_DB_PASSWORD' variable in the env.txt file}
            - POSTGRES_DB=${INVENTREE_DB_NAME:?You must provide the 'INVENTREE_DB_NAME' variable in the env.txt file}
        volumes:
            # Map 'data' volume such that postgres database is stored externally
            - inventree_data:/var/lib/postgresql/data/
        restart: unless-stopped

    # redis acts as database cache manager
    # only runs under the "redis" profile : https://docs.docker.com/compose/profiles/
    inventree-cache:
        image: redis:7.0
        container_name: inventree-cache
        depends_on:
            - inventree-db
        profiles:
            - redis
        env_file:
            - .env
        expose:
            - ${INVENTREE_CACHE_PORT:-6379}
        restart: always

    # InvenTree web server service
    # Uses gunicorn as the web server
    inventree-server:
        # If you wish to specify a particular InvenTree version, do so here
        image: inventree/inventree:${INVENTREE_TAG:-stable}
        container_name: inventree-server
        # Only change this port if you understand the stack.
        # If you change this you have to change:
        # - the proxy settings (on two lines)
        # - only change the exposed port - eg `1338:8000` if you want to expose the server on port 1338
        expose:
            - 8000
        depends_on:
            - inventree-db
        env_file:
            - .env
        volumes:
            # Data volume must map to /home/inventree/data
            - inventree_data:/home/inventree/data
        restart: unless-stopped

    # Background worker process handles long-running or periodic tasks
    inventree-worker:
        # If you wish to specify a particular InvenTree version, do so here
        image: inventree/inventree:${INVENTREE_TAG:-stable}
        container_name: inventree-worker
        command: invoke worker
        depends_on:
            - inventree-server
        env_file:
            - .env
        volumes:
            # Data volume must map to /home/inventree/data
            - inventree_data:/home/inventree/data
        restart: unless-stopped

    # nginx acts as a reverse proxy
    # static files are served directly by nginx
    # media files are served by nginx, although authentication is redirected to inventree-server
    # web requests are redirected to gunicorn
    # NOTE: You will need to provide a working nginx.conf file!
    inventree-proxy:
        image: nginx
        container_name: inventree-proxy
        depends_on:
            - inventree-server
        env_file:
            - .env
        ports:
            # Default web port is 1337 (can be changed in the env.txt file)
            - ${INVENTREE_WEB_PORT:-1337}:80
        volumes:
            # Provide nginx configuration file to the container
            # Refer to the provided example file as a starting point
            - ./nginx.prod.conf:/etc/nginx/conf.d/default.conf:ro
            # nginx proxy needs access to static and media files
            - inventree_data:/var/www
        restart: unless-stopped

volumes:
    # Persistent data, stored external to the container(s)
    inventree_data:
        driver: local
        driver_opts:
            type: none
            o: bind
            # This directory specified where InvenTree data are stored "outside" the docker containers
            device: ${INVENTREE_EXT_VOLUME:?You must specify the 'INVENTREE_EXT_VOLUME' variable in the env.txt file!}

相比官方的 docker-compose.yml,老苏做了 2 处修改,但都不是必须的,你可以直接用官方原版的

  • nginx 的版本,官方用的是 nginx:stable,老苏为了少下载一个镜像,改为了 nginx,也就是 nginx:latest,因为机器上已经有了,这个不是必须要改的;
  • 给每个容器增加了 container_name,只是为了看着舒服,同样也不是必须的;

nginx.prod.conf

将下面的内容保存为 r-compose.yml 文件,不需要做任何改动

server {

    # Listen for connection on (internal) port 80
    # If you are exposing this server to the internet, you should use HTTPS!
    # In which case, you should also set up a redirect from HTTP to HTTPS, and listen on port 443
    # See the Nginx documentation for more details
    listen 80;

    real_ip_header proxy_protocol;

    location / {

        proxy_set_header      Host              $http_host;
        proxy_set_header      X-Forwarded-By    $server_addr:$server_port;
        proxy_set_header      X-Forwarded-For   $remote_addr;
        proxy_set_header      X-Forwarded-Proto $scheme;
        proxy_set_header      X-Real-IP         $remote_addr;
        proxy_set_header      CLIENT_IP         $remote_addr;

        proxy_pass_request_headers on;

        proxy_redirect off;

        client_max_body_size 100M;

        proxy_buffering off;
        proxy_request_buffering off;

        # Do not touch this unless you have a specific reason - this and the docker-compose need to match
        proxy_pass http://inventree-server:8000;
    }

    # Redirect any requests for static files
    location /static/ {
        alias /var/www/static/;
        autoindex on;

        # Caching settings
        expires 30d;
        add_header Pragma public;
        add_header Cache-Control "public";
    }

    # Redirect any requests for media files
    location /media/ {
        alias /var/www/media/;

        # Media files require user authentication
        auth_request /auth;

        # Content header to force download
        add_header Content-disposition "attachment";
    }

    # Use the 'user' API endpoint for auth
    location /auth {
        internal;

        proxy_pass http://inventree-server:8000/auth/;

        proxy_pass_request_body off;
        proxy_set_header Content-Length "";
        proxy_set_header X-Original-URI $request_uri;
    }

}

.env

将下面的内容保存为 .env 文件

# InvenTree environment variables for a postgresql production setup

# Location of persistent database data (stored external to the docker containers)
# Note: You *must* un-comment this line, and point it to a path on your local machine

# e.g. Linux
INVENTREE_EXT_VOLUME=/volume1/docker/inventree/data

# e.g. Windows (docker desktop)
#INVENTREE_EXT_VOLUME=c:/Users/me/inventree-data

# Default web port for the InvenTree server
INVENTREE_WEB_PORT=1337

# Ensure debug is false for a production setup
INVENTREE_DEBUG=False
INVENTREE_LOG_LEVEL=WARNING

# InvenTree admin account details
# Un-comment (and complete) these lines to auto-create an admin acount
INVENTREE_ADMIN_USER=laosu
INVENTREE_ADMIN_PASSWORD=123456
INVENTREE_ADMIN_EMAIL=wbsu2003@gmail.com

# Database configuration options
# Note: The example setup is for a PostgreSQL database
INVENTREE_DB_ENGINE=postgresql
INVENTREE_DB_NAME=inventree
INVENTREE_DB_HOST=inventree-db
INVENTREE_DB_PORT=5432

# Database credentials - These must be configured before running
# Uncomment the lines below, and change from the default values!
INVENTREE_DB_USER=pguser
INVENTREE_DB_PASSWORD=pgpassword

# Redis cache setup (disabled by default)
# Un-comment the following lines to enable Redis cache
# Note that you will also have to run docker-compose with the --profile redis command
# Refer to settings.py for other cache options
#INVENTREE_CACHE_HOST=inventree-cache
#INVENTREE_CACHE_PORT=6379

# Options for gunicorn server
INVENTREE_GUNICORN_TIMEOUT=90

# Enable custom plugins?
INVENTREE_PLUGINS_ENABLED=False

# Run migrations automatically?
INVENTREE_AUTO_UPDATE=False

# Image tag that should be used
INVENTREE_TAG=stable

COMPOSE_PROJECT_NAME=inventree-production

参数说明:

  • 基本设置
    • INVENTREE_EXT_VOLUME:映射为卷的本地目录,需要根据自己的目录进行修改;
    • INVENTREE_WEB_PORT:访问时的 Web 端口,本地不冲突就可以;
    • INVENTREE_DEBUG:调试模式,默认 False 为关闭;
    • INVENTREE_LOG_LEVEL:日志级别;

【建议】:前两项需要根据自己的情况就行修改;

  • 管理员设置
    • INVENTREE_ADMIN_USER:管理员账号;
    • INVENTREE_ADMIN_PASSWORD:管理员密码;
    • INVENTREE_ADMIN_EMAIL:管理员邮件地址;

【建议】:三项都需要根据自己的情况进行修改;这里如果不设置,就需要用命令行去单独创建管理员;

  • 数据库设置
    • INVENTREE_DB_ENGINE:数据库类型,除了 postgresql 外,还支持 mysql
    • INVENTREE_DB_NAME:数据库库名;
    • INVENTREE_DB_HOST:数据库主机;
    • INVENTREE_DB_PORT:数据库端口;
    • INVENTREE_DB_USER:数据库用户;
    • INVENTREE_DB_PASSWORD:数据库密码;

【建议】:只要修改密码就可以的,其他的不建议修改;

  • Redis 设置
    • INVENTREE_CACHE_HOSTRedis 主机,默认本行被注释,在数据库初始化之前,一定不要取消注释;
    • INVENTREE_CACHE_PORTRedis 端口,默认本行被注释,在数据库初始化之前,一定不要取消注释;

【强烈建议】:不管你后续是否要使用Redis在数据库初始化之前,一定不要取消注释,否则会报错的,切记!切记!

在这里插入图片描述

  • 其他
    • INVENTREE_GUNICORN_TIMEOUT:服务器超时设置;
    • INVENTREE_PLUGINS_ENABLED:是否启用自定义插件;
    • INVENTREE_TAG:镜像的 tag 的版本,不建议修改;
    • COMPOSE_PROJECT_NAME:默认就可以;

【建议】:保持默认就可以了;

更多的参数说明,请看官方文档:https://docs.inventree.org/en/stable/start/config/

以上建议是给和老苏一样的小白用户的,高手请忽略

命令行安装

上传文件

文件准备好之后,依次执行下面的命令

# 新建文件夹 inventree 和 子目录
mkdir -p /volume1/docker/inventree/data

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

# 将 docker-compose.yml 、.env 、 nginx.prod.conf 放入当前目录

现在的目录

在这里插入图片描述

初始化

# 初始化数据库
docker-compose run inventree-server invoke update

这行初始化命令执行了以下步骤:

  • 确保安装了所需的 python
  • 创建一个新的(空)数据库
  • 执行所需的架构更新以创建所需的数据库表
  • 更新翻译文件
  • 将所有必需的静态文件收集到可由 nginx 提供服务的目录中

在这里插入图片描述

一定不要先注释 .env 中的 redis 设置,否则最后 Running InvenTree database migrations... 时会有错误

redis.exceptions.ConnectionError: Error -2 connecting to inventree-cache:6379. Name or service not known.

在这里插入图片描述

正常应该是下面这样的

在这里插入图片描述

创建管理员

  1. 已在 .env 中指定管理员帐户详细信息,可以跳过这一步;
  2. 为了安全起见,请确保在首次运行后从 .env 文件中删除管理员帐户凭据;
# 创建管理员账号
docker-compose run inventree-server invoke superuser

启动 Docker 容器

现在可以开始启动了

# 一键启动(不带 redis)
docker-compose up -d

如果需要 Redis 服务 ,首先修改 .env 中的 redis 设置,取消 INVENTREE_CACHE_HOSTINVENTREE_CACHE_PORT 前面的注释

如果你取消了 redis 注释,但是执行的又是不带 redis 的一键启动,也是会存在错误的,或导致容器不断重启;

在这里插入图片描述

然后再执行下面的启动命令

# 一键启动(带 redis)
docker-compose --profile redis up -d

不出意外的话,我们在 Docker 管理器中应该看到下面这样

在这里插入图片描述

inventree-production_inventree-server_run_2a703d49eef5 是初始化数据库的时候生成的,看着不爽的话,可以删掉

运行

在浏览器中输入 http://群晖IP:1337 就能看到登录界面

用我们前面设置的管理员账号、密码登录

在这里插入图片描述

主界面默认有部分中文显示,显然翻译程度还不高

不知道初始化时最一行显示的 InvenTree translation coverage: 27% 是不是指的中文翻译;

在这里插入图片描述

如果看到下面的提示,只要重启 inventree-server 容器即可

Server Restart Required
A configuration option has been changed which requires a server restart. Contact your system administrator for further information

在这里插入图片描述

其他

一些其他可能会用到的命令

# 一键删除
docker-compose down

# 将数据库导出为 JSON
docker-compose run inventree-server invoke export-records -f /volume1/docker/inventree/data/data.json

# 删除卷
docker volume rm -f inventree_data

参考文档

InvenTree
地址:https://github.com/inventree

InvenTree
地址:https://inventree.org

InvenTree - InvenTree Documentation
地址:https://docs.inventree.org

Docker Production Server - InvenTree Documentation
地址:https://docs.inventree.org/en/stable/start/docker_prod/

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

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

相关文章

Mac 上免费的网络Folx Mac 下载器

Mac最好的下载工具Folx Pro 5 for Mac 是由兔八哥爱分享整理发布 。 Folx Pro 5 for Mac是目前Mac平台上数一数二的下载工具,功能强大,几乎可以满足您的所有下载需求。folx pro for mac完整版不但可以下载网上任何文件,而且支持断点续传&…

大数据之LibrA数据库系统告警处理(ALM-12001 审计日志转储失败)

告警解释 根据本地历史数据备份策略,集群的审计日志需要转储到第三方服务器上。如果转储服务器满足配置条件,审计日志可以成功转储。审计日志转储失败,系统产生此告警。如果第三方服务器的转储目录磁盘空间不足,或者用户修改了转…

【JavaSE】逻辑控制:顺序、分支和循环结构

目录 一、概述与顺序结构 1.逻辑控制的概述 2.顺序结构 二、分支结构 1.if语句 2.switch语句 3.switch语句与if语句的对比 三、循环结构 1.while语句 2.for语句 3.do…while循环(选学) 四、循环的跳转 1.break语句 2.continue语句 五、总…

【设计模式】第20节:行为型模式之“备忘录模式”

一、简介 备忘录模式也叫快照模式,具体来说,就是在不违背封装原则的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象为先前的状态。这个模式的定义表达了两部分内容:一部分是…

git重装后如何连接以前项目

git重装后如何连接以前项目 1、配置秘钥 点击 Git Bash Here,进入命令操作窗口 生成本地git仓库秘钥: 1、填写自己邮箱 2、一直回车 ssh-keygen -t rsa -C “xxxxxqq.com”3、使用cat查看生成的秘钥,粘贴并设置到gitee上 cat ~/.ssh/id_r…

3.2、Linux开发工具之gcc/g++

个人主页:Lei宝啊 愿所有美好如期而遇 目录 背景知识 gcc如何完成 预处理 编译 汇编 链接 函数库 gcc选项 g和gcc的区别 背景知识 二进制-->汇编-->C-->C,java,php等 刚开始,工程师和科学家们是通过二进制指…

Flutter PopupMenuButton下拉菜单

下拉菜单是移动应用交互中一种常见的交互方式,可以使用下拉列表来展示多个内容标签,实现页面引导的作用。在Flutter开发中,实现下拉弹框主要有两种方式,一种是继承Dialog组件使用自定义布局的方式实现,另一种则是使用官方的PopupMenuButton组件进行实现。 如果没有特殊的…

Apache Doris (四十八): Doris表结构变更-替换表

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录

浅析智慧水务平台在城市发展中的应用

贾丽丽 安科瑞电气股份有限公司 上海嘉定 201801 摘要:当下,以数字孪生为主的数字技术愈发成熟,为使得长江水环境治理能够“长治久安”,上海院在长江大保护先行先试城市九江城中水环境治理中启用了智慧水务先进理念,搭…

使用requests库进行HTTP爬虫编程

目录 一、安装requests库 二、发送HTTP请求 三、解析HTML页面 四、处理HTTP响应和异常 五、使用代理和会话管理 六、使用多线程或多进程提高效率 七、数据存储和处理 八、注意事项和总结 在当今的数字化世界中,数据已经成为了一种宝贵的资源。而网络爬虫程序…

众和策略可靠吗?退市股票重组成功多久能上市?

可靠 跟着资本商场的不断发展,股市上出资的热情愈发高涨。在出资行为中,许多出资者挑选在较低价位上购买退市股票,借此实现获利。但当一只退市股票宣告成功进行重组并将从头上市,许多出资者会关心一个问题:这只退市股…

HTTPS协议与WordPress升级后网站不兼容的解决方法

茹莱神兽个人博客之前上线装了一个WordPress缓存插件WP Super Cache,这个WordPress插件安装是有一些条件的;茹莱神兽没有注意这些,直接按照常规插件的方法装的,结果插件出现了后台不兼容问题,不过还是能勉强用&#xf…

微信小程序的学生宿舍门禁签到请假管理系统

宿舍门禁管理系统具有通知公告、宿舍规则等功能。宿舍门禁管理系统采用Java语言,Springboot框架,基于mysql数据开发,实现了学生、辅导员、问题学生、通知公告、系统管理等内容进行管理,本小程序具有良好的兼容性和适应性&#xff…

众和策略:暖市场提信心 逾30家公司加入回购增持队伍

A股公司回购增持热潮仍在持续。据不完全统计,10月29日晚,有逾越30家上市公司会集发表了回购计划及重要股东、董监高增持计划,用实践举动为商场注入暖意,以真金白银传递开展决计。其间,不少上市公司控股股东、实控人或董…

PHP判断get、post、put、patch、delete、ajax请求

PHP中&#xff0c;我们可以通过$_SERVER[REQUEST_METHOD]来判断当前的请求类型。下面是一个判断当前请求类型的示例代码&#xff1a; <?php function getRequestMethod() {$request_method $_SERVER[REQUEST_METHOD];switch ($request_method) {case GET:return get;case…

【mysql】数据库插入默认值defalut

1. 插入的默认值default drop table if exists test_default; create table test_default(id int primary key ,ts timestamp default CURRENT_TIMESTAMP ) ENGINEINNODB DEFAULT CHARSETutf8;truncate test_default; insert into test_default(id,ts) values(1,default); ins…

课题研究结硕果,行稳致远再启航——CASAIM与中国船级社在《三维扫描测量技术在新造船过程控制和检验》圆满结题

近期&#xff0c;中国船级社&#xff08;CCS&#xff09;组织召开了《三维扫描测量技术在新造船过程控制和检验》研究项目结题评审会&#xff0c;来自全国各地的船东、设计单位、船厂、科研院所、设备厂家等单位的多位专家和代表以线上视频会议方式对此项研究及其研究成果进行了…

python学习9

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

Python学习参考

文章目录 ⭐️写在前面的话⭐️一、Python的历史与发展1、历史2、发展Python 1.0时代&#xff1a;起源与诞生Python 2.0时代&#xff1a;崛起Django和Flask引领的WEB开发模式人人都能胜任的网络爬虫比shell更好用的自动化运维工具数据分析与科学计算三剑客 后Python2与Python3时…

【达梦数据库】数据更新、DM索引(超详细)

文章目录 一、数据更新1&#xff09;插入数据&#xff08;insert into&#xff09;1. 值插入&#xff08;insert into ... values...&#xff09;2. 查询插入&#xff08;insert into...select...&#xff09; 2&#xff09;修改数据&#xff08;update...set...&#xff09;3&…