前言
随着企业信息化发展,越来越多的公司使用 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 -a3.结果图

4.常见问题
若执行以后出现命令提示是command not found,说明系统未安装 lsb-release 工具,那么我们只需要执行 sudo apt install lsb-release -y 安装后,再重新执行查看命令,就会出现以上结果。
二、环境搭建
1.学习重点
这一步我们需要安装docker和docker 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 version3.结果图

4.常见问题
执行 docker 命令提示 Permission denied ,原因是当前用户无 Docker 权限,执行sudo usermod -aG docker +用户名,然女退出终端重新登录即可解决
三、目录规划
1.学习重点
这一步是为了学会创建一个专门的部署目录,把 Odoo 相关的所有配置文件、数据都放在这个目录里,养成规范管理的习惯,打比方来说就像整理桌面,把所有学习资料放在 学习文件夹里面,然后所有工作文件放在这个工作文件夹里,方便我们避免文件乱堆,后续找文件、改配置、排查问题时,能快速找到对应的内容,不用在乱七八糟的翻找,这里的部署目录,就是 Odoo 部署的专属文件夹, 我们这么做的目的就是避免后续配置文件、数据文件混乱,方便后续查看、修改配置,以及维护 Odoo 系统
2.操作命令
# 创建 Odoo 部署专用目录
sudo mkdir -p /opt/odoo-erp
# 进入部署目录(后续所有操作均在此目录下进行)
cd /opt/odoo-erp3.结果图
无报错,并且终端提示符路径变为/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
EOF3.结果图
命令执行后无报错,执行 ls 命令,终端显示 compose.yml haproxy.cfg,说明两个核心配置文件均生成完成

4.提示
若需自定义密码,可修改 compose.yml 中 MYSQL_ROOT_PASSWORD 和 MYSQL_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 ps3.结果图
镜像拉取完成后,自动创建并启动容器,终端输出如下内容,显示三个容器均启动成功

4.常见问题
如果出现一只重启状态,可以使用sudo lsof -i 加端口号然后改掉文件的端口号,或者pikll掉端口号就好了,看看是不是端口被占用,或者使用sudo docker compose logs --tail=50 容器名 查看崩溃日志,定位报错
如果以上方式定位报错原因出现这两点
KeyError: 'ir.http'+relation "ir_module_module" does not existTried 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 代理生效)
