Docker Odoo デプロイメント: 本番環境に対応したコンテナーのセットアップ

Odoo を実稼働用の Docker コンテナにデプロイします。 Docker Compose 構成、PostgreSQL セットアップ、Nginx リバース プロキシ、SSL、バックアップ、スケーリングをカバーする完全なガイド。

E

ECOSIRE Research and Development Team

ECOSIREチーム

2026年3月5日3 分で読める529 語数

Docker Odoo デプロイメント: 実稼働対応のコンテナーのセットアップ

Docker は実稼働環境における Odoo の標準的なデプロイ方法となっており、Docker Hub では 1,000 万を超える Odoo Docker イメージがプルされています。 コンテナ化されたデプロイメントにより、再現可能な環境、簡単なスケーリング、簡素化されたバックアップ、および Odoo インスタンス間の明確な分離が実現します。このガイドでは、本番環境に対応した完全な Docker Odoo セットアップについて説明します。

重要なポイント

  • Docker Compose は、接続されたサービスとして Odoo、PostgreSQL、Nginx を調整します
  • 永続ボリュームにより、コンテナの再起動や更新後もデータが存続することが保証されます
  • Nginx リバース プロキシが SSL 終了、静的ファイル キャッシュ、ロード バランシングを処理します
  • 自動バックアップにより、手動介入を最小限に抑えてデータ損失を防ぎます。

アーキテクチャの概要

運用環境の Odoo Docker デプロイメントは、次の 3 つのコア サービスで構成されます。

  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 ネットワークを使用したコンテナ ネットワーク アクセスを制限する

よくある質問

Q: 1 つの Odoo コンテナで同時に処理できるユーザーの数は何人ですか?

ワーカーが 4 人の場合、Odoo コンテナは約 20 ~ 30 人の同時ユーザーを快適に処理します。同時実行性を高めるには、ワーカー (CPU/RAM によって制限される) を増やすか、ロード バランサーの背後に複数の Odoo コンテナーをデプロイします。

Q: Docker で Odoo を更新するにはどうすればよいですか?

新しいイメージをプルし、現在のコンテナを停止し、既存のボリュームで新しいイメージを実行します。永続ボリュームは、イメージの更新後もデータとファイルストアを保持します。

Q: 公式の Odoo Docker イメージを使用する必要がありますか、それとも独自のイメージを構築する必要がありますか?

公式イメージは標準的な展開で機能します。特定の Python パッケージ、カスタム モジュールのシステム依存関係、またはプレインストールされたコミュニティ モジュールが必要な場合は、カスタム イメージを構築します。

Q: Docker で Odoo Enterprise を処理するにはどうすればよいですか?

Odoo Enterprise は、パブリック Docker イメージとしては利用できません。エンタープライズ アドオン ディレクトリをボリュームとしてマウントし、addons_path 構成で参照します。有効な Odoo Enterprise サブスクリプションが必要です。


次は何ですか

Docker のデプロイメントにより、再現可能、スケーラブル、保守可能な Odoo 運用環境が得られます。この構成から始めて、使用パターンに基づいてワーカー数、メモリ制限、キャッシュを調整します。

Odoo 導入に関するサポートについては ECOSIRE にお問い合わせ、マネージド ホスティングについては Odoo サポート サービス をご覧ください。


ECOSIRE が発行 -- エンタープライズ ソフトウェア ソリューションによるビジネスの拡大を支援します。

E

執筆者

ECOSIRE Research and Development Team

ECOSIREでエンタープライズグレードのデジタル製品を開発。Odoo統合、eコマース自動化、AI搭載ビジネスソリューションに関するインサイトを共有しています。

WhatsAppでチャット