Administrator
发布于 2026-04-06 / 23 阅读
0
0

部署 全链路自动化发布 ERP 系统

前言

随着企业信息化发展,越来越多的公司使用 ERP 系统来统一管理客户、销售、库存、财务等日常业务,Odoo 作为一款常用的 ERP 管理软件,能够帮助企业规范流程、提高工作效率,为了实现系统快速、稳定、安全地部署与运行,本次实践搭建全链路自动化发布环境,完成 Odoo ERP 系统的自动化部署,减少人工操作,提升系统可靠性,为企业信息化管理提供技术支撑

Odoo ERP需要用到镜像有什么用

1. Odoo 管理什么?

公司想象成一个大超市

  • 客户:谁来买东西、会员是谁、喜欢买什么

  • 卖货:卖了多少、收了多少钱、开小票

  • 仓库:还有多少货、缺不缺货、什么时候补货

  • 记账:今天赚多少、花多少、对账

  • 采购:向批发商进货、下单、收货

  • 员工:谁上班、谁负责哪块、做得怎么样

所以:Odoo = 超市里全能的大总管什么都管,什么都记,不乱套。


2. PostgreSQL 是什么?

PostgreSQL = 总管的笔记本

所有客户、货物、钱的记录,全都记在这个本子上

没有本子,总管啥也记不住


3. HAProxy 是什么?

HAProxy = 超市门口的引导员

顾客一进来,他负责把人带到正确的地方

不让大家乱撞,保证秩序。


4. 我们做的 “全链路自动化发布” 是什么?

以前要人工一步步装系统,就像:

  • 亲自去招聘总管

  • 亲自给他买本子

  • 亲自教他怎么干活

  • 亲自带顾客进门

    麻烦、容易错、还慢。

现在我们做的是:一套全自动流程电脑自己把总管请来、装好、上岗、运行,不用人守着,一键启动,全部自动搞定

流程图

一、前期准备

1.学习重点

这一步是确认你的服务器系统是 Ubuntu 24.04 版本,打比方说就像我们安装手机APP,必须先确认手机系统是安卓还是苹果、版本够不够,否则APP会安装失败,所以这里也一样,后续所有部署命令、配置文件,都是专门为 Ubuntu 24.04 做的,系统版本不对,后面再努力也会报错,这样样的目的是为了避免因系统不兼容,导致后续安装 Docker、启动容器等操作失败,节省排查问题的时间

2.操作命令

登录服务器终端执行就行

lsb_release -a

3.结果图

4.常见问题

若执行以后出现命令提示是command not found,说明系统未安装 lsb-release 工具,那么我们只需要执行 sudo apt install lsb-release -y 安装后,再重新执行查看命令,就会出现以上结果。


二、环境搭建

1.学习重点

这一步我们需要安装dockerdocker compose,打比方来说 Docker 就像一个万能容器,可以把 Odoo、MySQL、HAProxy 这三个软件,分别装在独立的小盒子里,互不干扰,还能一键启动、停止,不用手动配置每个软件的依赖;而Docker Compose 就是 容器管理器,能一次性管理这三个 小盒子 ,不用一个个去操作,直接一次性启动、停止,简化部署的流程。

2.操作命令

# 1. 更新系统软件包(确保依赖最新,避免安装失败)
sudo apt update && sudo apt upgrade -y

# 2. 安装 Docker
sudo apt install docker.io -y

# 3. 启动 Docker 服务,并设置开机自启
sudo systemctl enable --now docker

# 4. 验证安装结果
docker --version
docker compose version

3.结果图

4.常见问题

执行 docker 命令提示 Permission denied ,原因是当前用户无 Docker 权限,执行sudo usermod -aG docker +用户名,然女退出终端重新登录即可解决


三、目录规划

1.学习重点

这一步是为了学会创建一个专门的部署目录,把 Odoo 相关的所有配置文件、数据都放在这个目录里,养成规范管理的习惯,打比方来说就像整理桌面,把所有学习资料放在 学习文件夹里面,然后所有工作文件放在这个工作文件夹里,方便我们避免文件乱堆,后续找文件、改配置、排查问题时,能快速找到对应的内容,不用在乱七八糟的翻找,这里的部署目录,就是 Odoo 部署的专属文件夹, 我们这么做的目的就是避免后续配置文件、数据文件混乱,方便后续查看、修改配置,以及维护 Odoo 系统

2.操作命令

# 创建 Odoo 部署专用目录
sudo mkdir -p /opt/odoo-erp

# 进入部署目录(后续所有操作均在此目录下进行)
cd /opt/odoo-erp

3.结果图

无报错,并且终端提示符路径变为/opt/odoo-erp,表示成功,如图

四、核心配置

1.学习重点

现在我们需要创建两个文件,一个是compose.yml 一个是 haproxy.cfg 文件,现在我们需要理解这两个文件有什么意义

a.compose.yml 文件:相当于给 Docker Compose 写的 指令清单 ,里面明确告诉 Docker Compose:要启动三个容器MySQL、Odoo、HAProxy,每个容器用什么版本、设置什么密码、数据存在哪里、怎么和其他容器通信,Docker Compose 会按照这个清单,一键启动所有服务,不用我们一个个配置

b.haproxy.cfg 文件:相当于给 HAProxy 写的 代理规则,告诉 HAProxy:把用户访问服务器 80 端口的请求,转发到 Odoo 服务的 8069 端口,这样用户不用输入端口号,直接访问服务器 IP 就能打开 Odoo,很方便

那么我们这做的目的是什么呢,其实就是为了生成部署 Odoo 全链路系统的指令,确保后续启动服务时,MySQL、Odoo、HAProxy 能正常配合工作,同时掌握生成配置文件的基础命令,理解配置文件和服务启动的关联

2.操作命令

  • 首先是compose.yml,这个文件包含定义三个容器的镜像、环境变量、数据持久化、网络等配置

sudo tee compose.yml > /dev/null << 'EOF'
services:
  db:
    image: postgres:15
    container_name: odoo-db
    restart: always
    environment:
      POSTGRES_USER: yxwa
      POSTGRES_PASSWORD: yxwa@2023
      POSTGRES_DB: odoo
    networks:
      - odoo-net

  odoo:
    image: odoo:16
    container_name: odoo-erp
    restart: always
    depends_on:
      - db
    command: >
      bash -c "sleep 10 && /entrypoint.sh odoo"
    environment:
      HOST: db
      USER: yxwa
      PASSWORD: yxwa@2023
    networks:
      - odoo-net

  haproxy:
    image: haproxy:2.8
    container_name: odoo-haproxy
    restart: always
    ports:
      - "80:80"
    volumes:
      - ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg
    networks:
      - odoo-net

networks:
  odoo-net:

volumes:
  postgres-data:
  odoo-data:
EOF
  • 其次是生成haproxy.cfg 配置文件,HAProxy 的作用是将 Odoo 默认的 8069 端口,代理到服务器的 80 端口,实现业务网直接访问,并且无需输入端口号

sudo tee haproxy.cfg > /dev/null << 'EOF'
global
    log /dev/log local0
    user root
    group root
    daemon

defaults
    mode http
    timeout connect 5000
    timeout client 50000
    timeout server 50000

frontend http-front
    bind *:80
    default_backend odoo-backend

backend odoo-backend
    server odoo1 odoo:8069 check
EOF

3.结果图

命令执行后无报错,执行 ls 命令,终端显示 compose.yml haproxy.cfg,说明两个核心配置文件均生成完成

4.提示

若需自定义密码,可修改 compose.yml 中 MYSQL_ROOT_PASSWORDMYSQL_PASSWORD 的值,注意两个密码需保持一致,否则 Odoo 无法对接 MySQL


五、启动服务

1.学习重点

我们在这一步重点掌握 docker compose up -d 这条核心命令的用法,理解它的作用,能看懂启动结果,知道启动过程中需要等待什么,就是镜像拉取。 这条命令相当于 一键启动 按钮,执行后,Docker Compose 会按照我们之前生成的 compose.yml 配置文件,自动完成三件事:第一件拉取需要的三个镜像MySQL、Odoo、HAProxy;第二件就是创建三个容器;第三件就是启动三个容器,让它们后台运行,这样不用我们手动一个个启动,非常便捷,我们这么做的目的就是一键启动 Odoo 全链路系统MySQL、Odoo、HAProxy,掌握 启动服务 的核心命令,能识别启动成功的状态,同时了解 镜像拉取 的过程,避免因等待时间长而误以为操作失败

2.操作命令

  • 确保当前处于 /opt/odoo-erp 目录下,执行以下命令

# 启动
sudo docker compose up -d

# 查看结果
docker compose ps

3.结果图

  • 镜像拉取完成后,自动创建并启动容器,终端输出如下内容,显示三个容器均启动成功

4.常见问题

如果出现一只重启状态,可以使用sudo lsof -i 加端口号然后改掉文件的端口号,或者pikll掉端口号就好,看看是不是端口被占用,或者使用sudo docker compose logs --tail=50 容器名 查看崩溃日志,定位报错

如果以上方式定位报错原因出现这两点

  • KeyError: 'ir.http' + relation "ir_module_module" does not exist

  • Tried to poll an undefined table on database odoo

那就说明数据库是空的Odoo 核心表没初始化,一访问就报错这只说明我们的 Odoo 服务虽然启动了,但数据库里没有任何表结构,所以查询失败,于是我们解决方法是手动强制初始化数据库:sudo docker exec -it odoo-erp odoo -d odoo \ --db_host=db \ --db_user=odoo \ --db_password=odoo \ --init base \ --stop-after-init告诉它位置

然后我们单独吧Odoo 容器,加载初始化后的数据库:sudo docker compose restart odoo,再次查看日志sudo docker compose logs odoo --tail=20,看到如下图最后一条,running...:8069这样的关键词,说明成功了

但手动初始化不方便的是,登录进入就不是初始化界面了,而是让我们直接输入邮箱和密码进行登录,这个时候我们只能手动强制性写入邮件和密码,再登录进去

# 用命令创建管理员
sudo docker exec -it odoo-erp odoo -d odoo \
--db_host=db \
--db_user=odoo \
--db_password=odoo \
--create-admin=admin@example.com,admin,123456

# 重启 Odoo 容器,让配置生效
sudo docker compose restart odoo

六、成功部署

除了我们使用docker compose ps ,容器的正常启动,我们还可以使用浏览器访问

1.确认 HAProxy 代理生效、Odoo 可正常访问,真正实现 全链路自动化部署成功

2.打开本地电脑浏览器,直接输入服务器 IP

3.查看访问结果:

若出现 Odoo 登录界面,说明全链路部署成功(MySQL 正常提供存储、Odoo 正常运行、HAProxy 代理生效)


评论