在 CentOS 8 上安装 Odoo 14

2023-10-27

Odoo 是世界上最受欢迎的一体化商业软件。它提供一系列业务应用程序,包括 CRM、网站、电子商务、计费、会计、制造、仓库、项目管理、库存等等,全部无缝集成。

Odoo根据使用案例和可用技术,可以以不同的方式安装。安装 Odoo 最简单快捷的方法是使用官方Odoo APT存储库。

在虚拟环境中安装 Odoo,或部署为Docker容器,让您可以更好地控制应用程序,并允许您在同一系统上运行多个 Odoo 实例。

本文介绍了如何在 CentOS 8 上的 Python 虚拟环境中安装和部署 Odoo 14。我们将从官方 GitHub 存储库下载 Odoo 并使用 Nginx 作为反向代理。

安装先决条件#

Odoo 是用 Python 编写的。第一步是安装Python 3 , Git, pip,以及从源代码构建 Odoo 所需的所有库和工具:

sudo dnf install python3 python3-devel git gcc sassc redhat-rpm-config libxslt-devel  \    bzip2-devel openldap-devel libjpeg-devel freetype-devel

创建系统用户#

不允许在 root 用户下运行 Odoo,因为这是一个安全风险。使用主目录创建新的系统用户和组/opt/odoo将运行 Odoo 服务:

sudo useradd -m -U -r -d /opt/odoo14 -s /bin/bash odoo14

您可以随意命名用户;只需确保您创建一个具有相同名称的 PostgreSQL 用户即可。

安装和配置 PostgreSQL#

Odoo 使用 PostgreSQL 作为数据库后端。出色地安装 PostgreSQL12 个来自标准 CentOS 8 存储库:

sudo dnf install @postgresql:12

安装完成后,创建一个新的 PostgreSQL 数据库集群:

sudo postgresql-setup initdb

启用并启动 PostgreSQL 服务:

sudo systemctl enable --now postgresql

创建一个与之前创建的系统用户同名的 PostgreSQL 用户。在这个例子中,即odoo14:

sudo su - postgres -c "createuser -s odoo14"

安装Wkhtmltopdf#

wkhtmltopdf 是一组开源命令行工具,用于将 HTML 页面渲染为 PDF 和各种图像格式。要在 Odoo 中打印 PDF 报告,您需要安装wkhtmltox包裹。 Odoo 的推荐版本是 版本0.12.5,可以从Github下载并安装:

sudo dnf install https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.5/wkhtmltox-0.12.5-1.centos8.x86_64.rpm

安装和配置 Odoo 14#

我们将从隔离的 Python 虚拟环境中的源代码安装 Odoo。

First, 更改为用户“odoo14”:

sudo su - odoo14

从 Odoo GitHub 存储库克隆 Odoo 14 源代码:

git clone https://www.github.com/odoo/odoo --depth 1 --branch 14.0 /opt/odoo14/odoo

导航至/opt/odoo14目录并为 Odoo 安装创建一个新的 Python 虚拟环境:

cd /opt/odoo14python3 -m venv venv

使用以下命令激活环境source命令:

source venv/bin/activate

安装所需的 Python 模块:

pip3 install -r odoo/requirements.txt
如果在安装过程中遇到任何编译错误,请确保列出了所有必需的依赖项Installing Prerequisites部分已安装。

完成后,输入以下命令停用环境:

deactivate

创建一个新目录对于自定义插件:

mkdir /opt/odoo14/odoo-custom-addons

我们将此目录添加到addons_path范围。此参数定义 Odoo 搜索模块的目录列表。

切换回您的 sudo 用户:

exit

创建一个包含以下内容的配置文件:

sudo nano /etc/odoo14.conf
/etc/odoo14.conf
[options]
admin_passwd = superadmin_passwd
db_host = False
db_port = False
db_user = odoo14
db_password = False
addons_path = /opt/odoo14/odoo/addons, /opt/odoo14/odoo-custom-addons

保存并关闭文件。

不要忘记更改superadmin_passwd到更安全的东西。

创建 Systemd 单元文件#

打开你的文本编辑器并创建一个名为的服务单元文件odoo14.service包含以下内容:

sudo nano /etc/systemd/system/odoo14.service

粘贴以下内容:

/etc/systemd/system/odoo14.service
[Unit]
Description=Odoo14
Requires=postgresql.service
After=network.target postgresql.service

[Service]
Type=simple
SyslogIdentifier=odoo14
PermissionsStartOnly=true
User=odoo14
Group=odoo14
ExecStart=/opt/odoo14/venv/bin/python3 /opt/odoo14/odoo/odoo-bin -c /etc/odoo14.conf
StandardOutput=journal+console

[Install]
WantedBy=multi-user.target

通知 systemd 有一个新的单元文件存在:

sudo systemctl daemon-reload

启动并启用 Odoo 服务:

sudo systemctl enable --now odoo14

使用以下命令验证 Odoo 是否正在运行:

sudo systemctl status odoo14

输出应如下所示,表明 Odoo 服务处于活动状态并正在运行:

● odoo14.service - Odoo14
   Loaded: loaded (/etc/systemd/system/odoo14.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2020-11-02 20:12:24 UTC; 3s ago
...

要查看 Odoo 服务记录的消息,请使用以下命令:

sudo journalctl -u odoo14

测试安装#

打开浏览器并输入:http://<your_domain_or_IP_address>:8069

假设安装成功,将出现类似以下的屏幕:

如果无法访问该页面,请检查端口8069已在您的firewall :

sudo firewall-cmd --permanent --zone=public --add-port=8069/tcpsudo firewall-cmd --reload

将 Nginx 配置为 SSL 终止代理#

默认的 Odoo Web 服务器通过 HTTP 提供流量。为了使 Odoo 实例更加安全,我们将 Nginx 配置为 SSL 终止代理,通过 HTTPS 提供流量服务。

SSL 终止代理是处理 SSL 加密/解密的代理服务器。这意味着终止代理 (Nginx) 将处理和解密传入的 TLS 连接 (HTTPS),并将未加密的请求传递给内部服务 (Odoo)。 Nginx 和 Odoo 之间的流量不会加密 (HTTP)。

Using a 反向代理为您带来许多好处,例如负载平衡、SSL 终止、缓存、压缩、提供静态内容等等。

在继续本部分之前,请确保您已满足以下先决条件:

  • 域名指向您的公共服务器IP。我们将使用example.com.
  • 已安装 Nginx .
  • 您的域的 SSL 证书。你可以安装免费的 Let’s Encrypt SSL 证书 .

打开文本编辑器并创建/编辑域服务器块:

sudo nano /etc/nginx/conf.d/example.com

以下配置设置 SSL 终止,HTTP 到 HTTPS 重定向,WWW到非WWW重定向,缓存静态文件,并启用GZip压缩。

/etc/nginx/conf.d/example.com
# Odoo servers
upstream odoo {
 server 127.0.0.1:8069;
}

upstream odoochat {
 server 127.0.0.1:8072;
}

# HTTP -> HTTPS
server {
    listen 80;
    server_name www.example.com example.com;

    include snippets/letsencrypt.conf;
    return 301 https://example.com$request_uri;
}

# WWW -> NON WWW
server {
    listen 443 ssl http2;
    server_name www.example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
    include snippets/ssl.conf;

    return 301 https://example.com$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example.com;

    proxy_read_timeout 720s;
    proxy_connect_timeout 720s;
    proxy_send_timeout 720s;

    # Proxy headers
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;

    # SSL parameters
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
    include snippets/ssl.conf;
    include snippets/letsencrypt.conf;

    # log files
    access_log /var/log/nginx/odoo.access.log;
    error_log /var/log/nginx/odoo.error.log;

    # Handle longpoll requests
    location /longpolling {
        proxy_pass http://odoochat;
    }

    # Handle / requests
    location / {
       proxy_redirect off;
       proxy_pass http://odoo;
    }

    # Cache static files
    location ~* /web/static/ {
        proxy_cache_valid 200 90m;
        proxy_buffering on;
        expires 864000;
        proxy_pass http://odoo;
    }

    # Gzip
    gzip_types text/css text/less text/plain text/xml application/xml application/json application/javascript;
    gzip on;
}
不要忘记将 example.com 替换为您的 Odoo 域,并设置 SSL 证书文件的正确路径。 此配置中使用的片段是在以下位置创建的本指南 .

完成后,重启 Nginx 服务 :

sudo systemctl restart nginx

接下来,我们需要告诉 Odoo 使用代理。为此,请打开配置文件并添加以下行:

/etc/odoo14.conf
proxy_mode = True

重新启动 Odoo 服务以使更改生效:

sudo systemctl restart odoo14

至此,反向代理已配置完毕,您可以通过以下地址访问您的 Odoo 实例:https://example.com.

更改绑定接口#

此步骤是可选的,但它是一个很好的安全实践。

默认情况下,Odoo服务器监听端口8069在所有接口上。要禁用对 Odoo 实例的直接访问,您可以阻止端口8069对于所有公共接口或强制 Odoo 仅侦听本地接口。

我们将 Odoo 配置为仅监听127.0.0.1。打开配置在文件末尾添加以下两行:

/etc/odoo14.conf
xmlrpc_interface = 127.0.0.1
netrpc_interface = 127.0.0.1

保存配置文件并重新启动 Odoo 服务器以使更改生效:

sudo systemctl restart odoo14

启用多重处理#

默认情况下,Odoo 以多线程模式工作。对于生产部署,建议更改为多处理服务器,因为它可以提高稳定性并更好地利用系统资源。

要启用多处理,您需要编辑 Odoo 配置并设置非零数量的工作进程。工作线程数根据 CPU 核心数和可用 RAM 计算。

据官方称Odoo 文档,计算工人数量和所需RAM内存大小,您可以使用以下公式和假设:

工人数量计算

  • 理论最大worker数量 = (system_cpus * 2) + 1
  • 1 个工作线程可以服务 ~= 6 个并发用户
  • Cron 工作线程也需要 CPU

RAM内存大小计算

  • 我们会认为所有请求中 20% 是重请求,80% 是轻请求。大量请求使用大约 1 GB RAM,而较轻请求则使用大约 150 MB RAM
  • 所需内存 =number_of_workers * ( (light_worker_ratio * light_worker_ram_estimation) + (heavy_worker_ratio * heavy_worker_ram_estimation) )

如果您不知道系统上有多少个 CPU,请使用以下命令grep命令:

grep -c ^processor /proc/cpuinfo

假设您的系统有 4 个 CPU 核心、8 GB RAM 内存和 30 个并发 Odoo 用户。

  • 30 users / 6 = **5**(5为理论所需工人数)
  • (4 * 2) + 1 = **9**(9为理论最大工人数)

根据上面的计算,可以使用5个worker + 1个cronworker,总共6个worker。

根据worker数量计算RAM消耗:

  • RAM = 6 * ((0.8*150) + (0.2*1024)) ~= 2 GB of RAM

计算表明,Odoo 安装将需要大约 2GB 的 RAM。

要切换到多处理模式,请打开配置文件并附加计算值:

/etc/odoo14.conf
limit_memory_hard = 2684354560
limit_memory_soft = 2147483648
limit_request = 8192
limit_time_cpu = 600
limit_time_real = 1200
max_cron_threads = 1
workers = 5

重新启动 Odoo 服务以使更改生效:

sudo systemctl restart odoo14

其余的系统资源将由该系统上运行的其他服务使用。在本指南中,我们在同一台服务器上安装了 Odoo 以及 PostgreSQL 和 Nginx。根据您的设置,您的服务器上可能还运行其他服务。

结论#

本文引导您在 Python 虚拟环境中使用 Nginx 作为反向代理在 CentOS 8 上安装 Odoo 14。我们还向您展示了如何为生产环境启用多处理和优化 Odoo。

您可能还想查看我们的教程如何创建 Odoo 数据库的每日自动备份 .

如果您有疑问,请随时在下面发表评论。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 CentOS 8 上安装 Odoo 14 的相关文章

  • 从正在运行的 python 脚本检测优化标志是否为 -O 或 -OO

    有时我想生成一个子进程 其优化标志与启动父进程时使用的优 化标志相同 我可以使用类似的东西 optimize not debug 但这样我就可以匹配两者 O and OO flags 是否有一些 python 内部状态包含该信息 经过一番深
  • 如何从 PyCharm 项目中获取我的“exe”[重复]

    这个问题在这里已经有答案了 通过 PyCharm 在 Python 上编写一些项目 我想从中获取一个exe文件 我尝试过 另存为 gt XXX exe 但是 当我尝试执行它时出现错误 此类操作系统不支持该文件 附注 我有win7 x64 它
  • 优化 Keras 以使用所有可用的 CPU 资源

    好吧 我真的不知道我在说什么 所以请耐心听我说 我正在使用 Theano 后端运行 Keras 以在 MNIST 图像上运行基本的神经网络 目前只是一个教程 过去 我一直使用我的旧 HP 笔记本电脑 因为我有 Windows 和 Ubunt
  • Python - 用逗号分割,跳过括号内的内容

    我需要用逗号分隔字符串 但我对这种情况有一个问题 TEXT EXAMPLE THIS IS A EXAMPLE BUT NOT WORKS FOR ME SECOND THIRD 我想拆分并得到 var 0 TEXT EXAMPLE THI
  • 带图像的简单 GUI [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我试图在简单的 GUI 上显示一些卡
  • 如何从 Dockerfile 安装 Python 3.7 和 Pip

    我正在尝试构建基于 Ubuntu 18 04 的自定义 Docker 映像 Ubuntu 预装了 Python 3 6 但我想 1 安装 Python 3 7 2 将其设置为默认 Python 版本 这样就可以使用python代替pytho
  • “char”/“character”类型的类型提示

    char 或 character 没有内置的原始类型 因此显然必须使用长度为 1 的字符串 但是为了暗示这一点并暗示它应该被视为一个字符 如何通过类型提示来实现这一点 grade chr A 一种方法可能是使用内置的 chr 函数来表示这一
  • Python Kivy - 在本机网络浏览器中打开 url 的应用程序

    我尝试制作一个简单的应用程序 在单击 Screen One 上的按钮后 在 Kivy 中打开一个网页 我使用了这个主题 Python 在应用程序中直接显示网络浏览器 iframe https stackoverflow com questi
  • 无法打开 Python。错误 0xc000007b

    我最近一直在学习 Python 3 我在我的上网本 32 位 Windows 7 上创建简单的小程序没有任何问题 当我将它安装在我的上网本上时 我没有遇到任何问题 但现在我已经开始使用它了 我想将它安装在我的台式机上 并且我有一个 我的桌面
  • 创建一个类似于 Tkinter 的表

    我希望创建类似于 Tkinter 中的表格的东西 但它不一定是这样的 例如 我想创建标题 Name1 Name2 Value 并在每个标题下面有几个空白行 然后 我希望稍后用我计算的值或名称的字符串值填充这些行 因此是标签 对于 Name2
  • spacy 如何使用词嵌入进行命名实体识别 (NER)?

    我正在尝试使用以下方法训练 NER 模型spaCy识别位置 人 名和组织 我试图理解如何spaCy识别文本中的实体 但我无法找到答案 从这个问题 https github com explosion spaCy issues 491在 Gi
  • 更改 pandas 中多个日期时间列的时区信息

    有没有一种简单的方法可以将数据帧中的所有时间戳列转换为本地 任何时区 不是逐列进行吗 您可以有选择地将转换应用于所有日期时间列 首先 选择它们select dtypes https pandas pydata org pandas docs
  • Python 中的 @staticmethod 与 @classmethod

    方法和方法有什么区别装饰的 https peps python org pep 0318 with staticmethod http docs python org library functions html staticmethod和
  • 如何在Python和Selenium中通过标签名称或id获取元素[重复]

    这个问题在这里已经有答案了 我正在尝试使用 Python 和 Selenium 获取输入 但它向我显示错误 我该如何解决这个错误 inputElement send keys getStock getStocklFunc 0 Error i
  • 在可编辑的QSqlQueryModel中实现setEditStrategy

    这是后续这个问题 https stackoverflow com questions 49752388 editable qtableview of complex sql query 在那里 我们创建了 QSqlQueryModel 的可
  • 导入错误:没有名为 google.auth 的模块

    当我尝试导入时firebase admin in python 2 7我收到错误 导入错误 没有名为 google auth 的模块 这是Docker文件 https github com ammaratef45 Attendance bl
  • 查找给定节点的最高权重边

    我在 NetworkX 中有一个有向图 边缘的权重从 0 到 1 表示它们发生的概率 网络连通性非常高 所以我想修剪每个节点的边缘 只保留最高概率的节点 我不确定如何迭代每个节点并仅保留最高权重in edges在图中 有没有一个networ
  • Flask WTForms 使用变量自动填充 StringField

    我有一个表格 我想用上一页收到的信息自动填充一些字段 但如果他们想调整它 它需要是可更改的 我正在为我的 SelectField 使用动态创建的列表 但添加 StringField 并不成功 请参阅下面的我的代码 forms py clas
  • Python - 如何查询定义方法的类?

    我的问题有点类似于this one https stackoverflow com questions 5520580 how do you get all classes defined in a module but not impor
  • Django South - 将 null=True 字段转换为 null=False 字段

    我的问题是 转变的最佳做法是什么null True场变成null False使用 Django South 的字段 具体来说 我正在与ForeignKey 你应该先写一个数据迁移 http south aeracode org docs t

随机推荐

  • 如何在 Python 中验证电子邮件地址(使用正则表达式)

    验证电子邮件地址是确保您的应用程序仅接受格式正确的电子邮件地址的关键步骤 格式正确的电子邮件地址不仅可以确保正确的通信 还有助于防止垃圾邮件和安全风险 在本文中 我们将探讨如何在 Python 中使用正则表达式 regex 验证电子邮件地址
  • 每天凌晨 2:00 运行 Cron 作业

    Cron 作业 或 cron 作业 是告诉计算机在指定时间自动运行程序或执行命令的计划 这称为 cron 作业 是一个在后台运行并按计划执行任务的守护进程 Cron 是一个在后台运行并定期执行程序或任务的进程 从设计上来说 cron 非常灵
  • 如何在 CentOS 和 RedHat 上使用 MySQL 设置 Pure-FTPD

    纯FTPd是一个免费且安全的 FTP 服务器 它不提供无用的花哨功能 而是注重效率和易用性 它为常见需求提供简单的答案 并为个人用户和托管提供商提供独特的有用功能 本指南将帮助您使用 MySQL 作为用户数据库来设置 Pure FTPD 还
  • 什么是暴力攻击?以及企业的缓解策略

    在不断发展的网络安全世界中 了解各种类型的威胁是保护您自己或您的企业的第一步 一种常见但重大的威胁是暴力攻击 让我们深入了解什么是暴力攻击 它的工作原理及其影响 什么是暴力攻击 暴力攻击是一种试错法用于获取个人识别码 PIN 用户名 密码或
  • 全球连通性如何塑造现代娱乐

    20世纪50年代 几十年来被视为电视的黄金时代 人们没有想到电视剧的复兴 并迎来了另一个受欢迎的高峰 说实话 仅在十年前这似乎也是不可能的 然而如今 从挪威到印度尼西亚 每个人都有自己最喜欢的连续剧和电视节目列表 并且他们在全球范围内关注相
  • 如何在 CentOS/RHEL 8 上安装 Tomcat 9

    Apache Tomcat 9 是可用于安装 Tomcat Web 服务器的最新版本 Tomcat 是由 Apache 基金会开发的用于基于 Java 的应用程序的开源 Web 服务器 我们使用 Tomcat 来部署 Java Servle
  • 如何在 Apache 中启用缓存

    缓存是增强 Web 服务器性能的一个重要方面 因为它可以通过存储和提供频繁请求的数据来显着缩短响应时间 这不仅提高了网站的速度 还减少了服务器的负载 本文将引导您完成在 Apache HTTP Server 一种流行且强大的开源 Web 服
  • 如何在 CentOS 8 上使用 Apache 安装 phpMyAdmin

    当前的 phpMyAdmin 版本与 PHP 7 1 及更高版本以及 MySQL 5 5 及更高版本兼容 本教程将帮助您在 CentOS 8 Linux 系统上安装和配置 phpMyAdmin 第 1 步 先决条件 我们假设您已经安装了Ce
  • 如何在 Fedora 上安装 phpMyAdmin

    phpMyAdmin是一个流行的基于 Web 的客户端 用于管理 MySQL 服务器 phpMyAdmin 是用 PHP 编程语言编写的 它提供了一个用户友好的 Web 界面来访问和管理 MySQL 服务器和数据库 它允许您创建数据库和用户
  • 如何在 Ubuntu 上安装最新的 Node.js

    如果您一直在探索前端和 JavaScript 的世界 您可能已经遇到过 Node js 它是一个服务器端框架 使用 Google 的 V8 引擎来执行 JavaScript 代码 开发人员可以使用 Node js 因为它为他们提供了一种使用
  • 如何在 Windows 上安装 NVM

    NVM 节点版本管理器 是用于在系统上安装 Node js 的命令行实用程序 它允许我们安装多个 Node js 版本并在它们之间切换 这对于运行需要不同 2 个节点版本的多个节点应用程序的系统很有帮助 本教程将帮助您使用 NVM 在 Wi
  • 如何在 Linux Mint 上安装 Apache Solr 21/20

    Apache Solr 是一个基于 Java 构建的强大的开源搜索平台 它广泛用于索引 搜索和分析大量文本内容 在 Linux Mint 上安装它非常简单 在本指南中 我们将逐步完成在 Linux Mint 21 20 或 19 上安装并运
  • 如何在 Ubuntu 20.04 上安装 Nagios

    Nagios 是一个流行的开源监控系统 Nagios 保留整个 IT 基础设施的清单 并确保您的网络 服务器 应用程序 服务和流程正常运行 如果发生故障或性能不佳 Nagios 将通过各种方法发送通知警报 本文介绍如何在 Ubuntu 20
  • 如何在 Ubuntu 20.04 上设置或更改时区

    使用正确的时区对于许多与系统相关的任务和流程至关重要 例如 cron 守护进程使用系统的时区来执行 cron 作业 并且日志文件中的时间戳基于同一系统的时区 在 Ubuntu 上 系统的时区是在安装过程中设置的 但以后可以轻松更改 本文介绍
  • Linux 中的粘贴命令(合并行)

    paste是一个允许您水平合并文件行的命令 它输出由指定为参数的每个文件的顺序对应行组成的行 并用制表符分隔 在本教程中 我们将解释如何使用paste命令 如何使用paste命令 paste是鲜为人知且较少使用的 Linux 和 Unix
  • 如何在 CentOS 7 上安装 Memcached

    Memcached 是一个免费开源的高性能内存键值数据存储 它主要用作缓存系统 通过缓存数据库调用结果中的各种对象来加速应用程序 在本教程中 我们将解释如何在 CentOS 7 上安装和配置 Memcached 先决条件 在继续本教程之前
  • 如何在 Ubuntu 18.04 上安装 Apache Maven

    Apache Maven 是一个免费的开源项目管理和理解工具 主要用于 Java 项目 Maven 使用项目对象模型 POM 它本质上是一个 XML 文件 其中包含有关项目 配置详细信息 项目依赖项等的信息 在本教程中 我们将向您展示在 U
  • 如何在 Ubuntu 18.04 上安装和使用 Wine

    Wine 是一个开源兼容层 允许您在类 Unix 操作系统 例如 Linux FreeBSD 和 macOS 上运行 Windows 应用程序 Wine代表 Wine 不是模拟器 它是一个将 Windows 系统调用转换为 Linux 和其
  • 如何在 Bash 中比较字符串

    在编写 Bash 脚本时 您经常需要比较两个字符串以检查它们是否相等 当两个字符串具有相同的长度并且包含相同的字符序列时 它们相等 本教程介绍如何在 Bash 中比较字符串 比较运算符 比较运算符是比较值并返回 true 或 false 的
  • 在 CentOS 8 上安装 Odoo 14

    Odoo 是世界上最受欢迎的一体化商业软件 它提供一系列业务应用程序 包括 CRM 网站 电子商务 计费 会计 制造 仓库 项目管理 库存等等 全部无缝集成 Odoo根据使用案例和可用技术 可以以不同的方式安装 安装 Odoo 最简单快捷的