Docker 部署 Odoo 18
本指南面向希望自己动手部署 Odoo 18 的开发者。通过 Docker + 宿主机 PostgreSQL 的方式,你可以在一台 Ubuntu 服务器上快速跑起一个可长期维护的 Odoo 实例。
方案概述
- Odoo:运行在 Docker 容器中,使用官方镜像。
- PostgreSQL:运行在宿主机,方便备份、调优和多个 Odoo 实例共享。
- 代码:通过 Git 克隆到宿主机,以 volume 形式挂载进容器。
- 网络:容器通过
host.docker.internal连接宿主机 PostgreSQL。
环境要求
- Ubuntu 22.04 LTS 或更新版本(推荐服务器版)。
- 至少 2 核 CPU、4 GB 内存、40 GB 磁盘。
- 拥有 sudo 权限的普通用户(示例使用
ubuntu)。 - 一个固定公网 IP 或域名(可选,用于外网访问)。
1. 安装 Docker 与 PostgreSQL
先更新系统并安装 Docker:
sudo apt-get update
sudo apt-get install -y docker.io docker-compose-plugin
把当前用户加入 docker 组,避免每次用 sudo:
sudo usermod -aG docker $USER
newgrp docker
安装并启动 PostgreSQL:
sudo apt-get install -y postgresql postgresql-contrib
sudo systemctl enable --now postgresql
2. 配置 PostgreSQL
创建 odoo 数据库用户并设置密码:
sudo -u postgres createuser -s odoo
sudo -u postgres psql -c "ALTER USER odoo WITH PASSWORD '你的强密码';"
让 PostgreSQL 监听所有地址(容器需要访问):
sudo sed -i "s/#listen_addresses = 'localhost'/listen_addresses = '*'/" /etc/postgresql/14/main/postgresql.conf
sudo bash -c 'echo "host all all 172.16.0.0/12 scram-sha-256" >> /etc/postgresql/14/main/pg_hba.conf'
sudo systemctl restart postgresql
放行 Docker 网段访问 PostgreSQL:
sudo ufw allow from 172.16.0.0/12 to any port 5432 proto tcp
3. 准备 Odoo 代码
创建工作目录并克隆 Odoo 源码与你的自定义模块:
mkdir -p /opt/odoo/myinstance/addons
cd /opt/odoo/myinstance
git clone -b 18.0 --depth 1 https://github.com/odoo/odoo.git ./addons/odoo-core
git clone https://你的仓库地址 ./addons/my-custom-module
4. 创建 odoo.conf
创建 /opt/odoo/myinstance/config/odoo.conf:
[options]
admin_passwd = 你的强密码
db_host = host.docker.internal
db_port = 5432
db_user = odoo
db_password = 你的强密码
db_name = myinstance
db_filter = ^myinstance$
addons_path = /mnt/odoo-core/addons,/mnt/extra-addons
proxy_mode = True
workers = 4
limit_memory_soft = 0
limit_memory_hard = 0
5. 创建 docker-compose.yml
创建 /opt/odoo/myinstance/docker-compose.yml:
services:
odoo:
image: odoo:18.0
container_name: odoo_myinstance
restart: unless-stopped
ports:
- "8069:8069"
extra_hosts:
- "host.docker.internal:host-gateway"
environment:
- HOST=host.docker.internal
- USER=odoo
- PASSWORD=你的强密码
volumes:
- odoo_web_data:/var/lib/odoo
- ./config:/etc/odoo
- ./addons/odoo-core:/mnt/odoo-core
- ./addons:/mnt/extra-addons
- /usr/share/fonts:/usr/share/fonts:ro
command: odoo --config /etc/odoo/odoo.conf
volumes:
odoo_web_data:
name: odoo_myinstance_web_data
6. 启动 Odoo
cd /opt/odoo/myinstance
docker compose up -d
等待 10-30 秒后访问:
http://服务器IP:8069
如果 PostgreSQL 连接正常,Odoo 会自动创建空数据库并跳转到登录页。
7. 从备份恢复数据库(可选)
如果你有一个 Odoo 备份 zip 文件,先临时开启数据库管理器:
docker exec -i odoo_myinstance odoo --config /etc/odoo/odoo.conf --stop-after-init --no-http --init base
更推荐的做法是:在 odoo.conf 中先注释掉 db_name 和 db_filter,设置 list_db = True,重启容器,然后通过 Web 界面的 Manage Databases → Restore 上传 zip 恢复。恢复完成后再改回最终配置。
另一种命令行方式(适合自动化脚本):
curl -X POST \
-F "master_pwd=你的强密码" \
-F "backup_file=@/path/to/backup.zip" \
-F "copy=true" \
-F "name=myinstance" \
http://localhost:8069/web/database/restore
成功后 Odoo 会返回 303 重定向。
8. 查看日志
docker logs -f --tail 100 odoo_myinstance
常见问题
容器连不上 PostgreSQL
检查 listen_addresses、pg_hba.conf 和 ufw 规则。在容器内测试:
docker exec -it odoo_myinstance bash
apt-get update && apt-get install -y postgresql-client
PGPASSWORD=你的强密码 psql -h host.docker.internal -U odoo -d postgres
字体警告 Can't find .pfb for face 'Courier'
在宿主机安装字体并挂载进容器:
sudo apt-get install -y gsfonts fonts-dejavu
cd /opt/odoo/myinstance && docker compose restart
端口被占用
sudo docker ps --filter "publish=8069"
sudo docker rm -f 容器ID