Docker Odoo 部署:生产就绪容器设置

在 Docker 容器中部署 Odoo 以进行生产。涵盖 Docker Compose 配置、PostgreSQL 设置、Nginx 反向代理、SSL、备份和扩展的完整指南。

E

ECOSIRE Research and Development Team

ECOSIRE 团队

2026年3月5日3 分钟阅读477 字数

Docker Odoo 部署:生产就绪容器设置

Docker 已成为 Odoo 在生产环境中的标准部署方法,在 Docker Hub 上拉取了超过 1000 万个 Odoo Docker 镜像。 容器化部署提供了可重复的环境、轻松扩展、简化的备份以及 Odoo 实例之间的清晰分离。本指南涵盖了完整的生产就绪 Docker Odoo 设置。

要点

  • Docker Compose 将 Odoo、PostgreSQL 和 Nginx 编排为连接服务
  • 持久卷确保数据在容器重新启动和更新后仍然存在
  • Nginx 反向代理处理 SSL 终止、静态文件缓存和负载平衡
  • 自动备份以最少的手动干预防止数据丢失

架构概述

生产 Odoo Docker 部署由三个核心服务组成:

  1. Odoo应用程序服务器:运行Web服务器和应用程序逻辑的Odoo容器
  2. PostgreSQL数据库:存储所有Odoo数据的专用数据库容器
  3. Nginx 反向代理:处理 SSL、提供静态文件并将请求代理到 Odoo

可选服务包括 Redis(用于缓存和会话存储)、备份容器(自动数据库转储)和监控(Prometheus + Grafana)。


Docker Compose 配置

部署的基础是定义所有服务的 docker-compose.yml 文件:

version: "3.8"

services:
  odoo:
    image: odoo:17.0
    depends_on:
      - db
    ports:
      - "8069:8069"
      - "8072:8072"
    volumes:
      - odoo-data:/var/lib/odoo
      - ./config:/etc/odoo
      - ./addons:/mnt/extra-addons
    environment:
      - HOST=db
      - PORT=5432
      - USER=odoo
      - PASSWORD=odoo_db_password
    restart: unless-stopped

  db:
    image: postgres:16
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=odoo
      - POSTGRES_PASSWORD=odoo_db_password
      - PGDATA=/var/lib/postgresql/data/pgdata
    volumes:
      - postgres-data:/var/lib/postgresql/data/pgdata
    restart: unless-stopped

  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf
      - ./certbot/conf:/etc/letsencrypt
      - ./certbot/www:/var/www/certbot
    depends_on:
      - odoo
    restart: unless-stopped

volumes:
  odoo-data:
  postgres-data:

Odoo 配置文件

使用生产优化设置创建 config/odoo.conf

[options]
addons_path = /mnt/extra-addons,/usr/lib/python3/dist-packages/odoo/addons
admin_passwd = your_strong_admin_password
db_host = db
db_port = 5432
db_user = odoo
db_password = odoo_db_password
db_name = production_db
dbfilter = ^production_db$
list_db = False
proxy_mode = True
workers = 4
max_cron_threads = 2
limit_memory_hard = 2684354560
limit_memory_soft = 2147483648
limit_time_cpu = 600
limit_time_real = 1200
log_level = warn

关键设置说明:

  • proxy_mode = True:在 Nginx 后面运行时需要正确处理转发的标头
  • workers = 4:工作进程数量(经验法则:每个 CPU 核心 2 个工作进程)
  • max_cron_threads = 2:用于计划操作的专用线程
  • list_db = False:防止登录页面上列出数据库(安全)
  • dbfilter:限制对单个数据库的访问

Nginx 反向代理配置

upstream odoo {
    server odoo:8069;
}
upstream odoochat {
    server odoo:8072;
}

server {
    listen 80;
    server_name your-domain.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name your-domain.com;

    ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;

    client_max_body_size 200m;
    proxy_read_timeout 720s;
    proxy_connect_timeout 720s;
    proxy_send_timeout 720s;

    location /websocket {
        proxy_pass http://odoochat;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    location / {
        proxy_pass http://odoo;
        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;
    }

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

备份策略

自动数据库备份

创建一个每天通过 cron 运行的备份脚本:

#!/bin/bash
BACKUP_DIR=/backups/odoo
DATE=$(date +%Y%m%d_%H%M%S)
docker exec odoo-db pg_dump -U odoo production_db | gzip > $BACKUP_DIR/odoo_$DATE.sql.gz
find $BACKUP_DIR -name "*.sql.gz" -mtime +30 -delete

文件存储备份

Odoo 文件存储(上传的文档、附件)位于 odoo-data 卷中。将其与数据库一起备份:

docker run --rm -v odoo-data:/data -v /backups:/backup alpine \
  tar czf /backup/odoo-filestore_$DATE.tar.gz /data

安全加固

  • 将 odoo.conf 中的默认 admin_passwd 更改为强随机密码
  • 设置 list_db = False 以防止数据库枚举
  • 使用 dbfilter 限制对单个数据库的数据库访问
  • 尽可能以非 root 用户身份运行容器
  • 使用安全补丁更新 Docker 镜像
  • 使用 Docker 机密或环境变量文件(不是内联密码)
  • 使用 Docker 网络限制容器网络访问

常见问题

问:单个 Odoo 容器可以处理多少个并发用户?

一个 Odoo 容器有 4 名工作人员,可以轻松处理大约 20-30 个并发用户。为了获得更高的并发性,请增加工作线程(受 CPU/RAM 限制)或在负载均衡器后面部署多个 Odoo 容器。

问:如何在 Docker 中更新 Odoo?

拉取新映像,停止当前容器,使用现有卷运行新映像。持久卷在映像更新期间保留您的数据和文件存储。

问:我应该使用官方 Odoo Docker 镜像还是构建自己的镜像?

官方映像适用于标准部署。当您需要特定的 Python 包、自定义模块的系统依赖项或预安装的社区模块时,构建自定义映像。

问:如何在 Docker 中处理 Odoo Enterprise?

Odoo Enterprise 不作为公共 Docker 映像提供。将企业插件目录挂载为卷并在 addons_path 配置中引用它。您需要有效的 Odoo Enterprise 订阅。


下一步是什么

Docker 部署为您提供可重复、可扩展且可维护的 Odoo 生产环境。从此配置开始,并根据您的使用模式调整工作线程计数、内存限制和缓存。

联系 ECOSIRE 获取 Odoo 部署帮助,或探索我们的 Odoo 支持服务 进行托管。


由 ECOSIRE 发布——帮助企业利用企业软件解决方案进行扩展。

E

作者

ECOSIRE Research and Development Team

在 ECOSIRE 构建企业级数字产品。分享关于 Odoo 集成、电商自动化和 AI 驱动商业解决方案的洞见。

通过 WhatsApp 聊天