
关于
生产级 Docker 和 docker-compose 配置,用于部署 Odoo 与 PostgreSQL,包含持久卷、基于环境的配置和 Nginx 反向代理。
name: odoo-docker-deployment description: "用于 Odoo 的生产就绪 Docker 和 docker-compose 设置,包含 PostgreSQL、持久卷、基于环境变量的配置和 Nginx 反向代理。" risk: safe source: "self"
Odoo Docker 部署
概述
此技能提供完整的、生产就绪的 Odoo Docker 设置,包括 PostgreSQL、持久文件存储、环境变量配置和可选的带 SSL 的 Nginx 反向代理。涵盖开发和生产配置。
适用场景
- 使用 Docker 搭建本地 Odoo 开发环境。
- 将 Odoo 部署到 VPS 或云服务器(AWS、DigitalOcean 等)。
- 排查 Odoo 容器启动失败或数据库连接错误。
- 为现有 Odoo Docker 设置添加带 SSL 的反向代理。
工作原理
- 激活:提及
@odoo-docker-deployment并描述你的部署场景。 - 生成:获得完整的
docker-compose.yml和odoo.conf,可直接运行。 - 调试:描述你的容器错误,获得诊断和修复方案。
示例
示例 1:生产环境 docker-compose.yml
# 注意:顶层 'version' 键在 Docker Compose v2+ 中已弃用
# 可以安全省略。移除它以避免警告。
services:
db:
image: postgres:15
restart: always
environment:
POSTGRES_DB: odoo
POSTGRES_USER: odoo
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- postgres-data:/var/lib/postgresql/data
networks:
- odoo-net
odoo:
image: odoo:17.0
restart: always
depends_on:
db:
condition: service_healthy
ports:
- "8069:8069"
- "8072:8072" # Longpolling for live chat / bus
environment:
HOST: db
USER: odoo
PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- odoo-web-data:/var/lib/odoo
- ./addons:/mnt/extra-addons # Custom modules
- ./odoo.conf:/etc/odoo/odoo.conf
networks:
- odoo-net
volumes:
postgres-data:
odoo-web-data:
networks:
odoo-net:
示例 2:odoo.conf
[options]
admin_passwd = ${ODOO_MASTER_PASSWORD} ; set via env or .env file
db_host = db
db_port = 5432
db_user = odoo
db_password = ${POSTGRES_PASSWORD} ; set via env or .env file
; addons_path inside the official Odoo Docker image (Debian-based)
addons_path = /mnt/extra-addons,/usr/lib/python3/dist-packages/odoo/addons
logfile = /var/log/odoo/odoo.log
log_level = warn
; Worker tuning for a 4-core / 8GB server:
workers = 9 ; (CPU cores × 2) + 1
max_cron_threads = 2
limit_memory_soft = 1610612736 ; 1.5 GB — soft kill threshold
limit_memory_hard = 2147483648 ; 2.0 GB — hard kill threshold
limit_time_cpu = 600
limit_time_real = 1200
limit_request = 8192
示例 3:常用命令
# Start all services in background
docker compose up -d
# Stream Odoo logs in real time
docker compose logs -f odoo
# Restart Odoo only (not DB — avoids data risk)
docker compose restart odoo
# Stop all services
docker compose down
# Backup the database to a local SQL dump
docker compose exec db pg_dump -U odoo odoo > backup_$(date +%Y%m%d).sql
# Update a custom module without restarting the server
docker compose exec odoo odoo -d odoo --update my_module --stop-after-init
最佳实践
- ✅ 应该: 将所有密钥存储在
.env文件中并使用${VAR}引用 — 绝不在docker-compose.yml中硬编码密码。 - ✅ 应该: 使用
depends_on: condition: service_healthy配合 PostgreSQL 健康检查,防止 Odoo 在数据库就绪前启动。 - ✅ 应该: 在 Odoo 前放置 Nginx 进行 SSL 终止(Let's Encrypt / Certbot)— 绝不直接在 80/443 端口暴露 Odoo。
- ✅ 应该: 在
odoo.conf中设置workers = (CPU 核心数 × 2) + 1—workers = 0使用单线程模式会阻塞所有用户。 - ❌ 不要: 将 5432 端口(PostgreSQL)暴露到公网 — 仅保留在内部 Docker 网络中。
- ❌ 不要: 在生产环境使用
latest或17Docker 镜像标签 — 始终固定到特定补丁级别标签(如odoo:17.0)。 - ❌ 不要: 在 CI/CD 中挂载
odoo.conf并依赖它存储密钥 — 改用 Docker secrets 或环境变量。
限制
- 此技能涵盖自托管 Docker 部署 — Odoo.sh(云托管)有完全不同的部署模型。
- 水平扩展(多个 Odoo 容器在负载均衡器后面)需要此处未涵盖的共享文件存储(NFS 或 S3 兼容存储)。
- 不包含 Nginx 配置模板 — 请参阅 Odoo 官方 Nginx 文档 获取完整反向代理配置。
- Docker 镜像内的
addons_path可能随新基础镜像版本变化 — 升级 Odoo 镜像后务必验证。
兼容工具
Claude CodeCursor
标签
运维部署

