Dockerize Odoo ERP: PostgreSQLとNginxによる本番環境へのデプロイ

Docker tutorial - IT technology blog
Docker tutorial - IT technology blog

従来のOdooインストール:「依存関係の地獄(Dependency Hell)」という悪夢

UbuntuにOdooを直接インストールしたことがあるなら、ライブラリの競合で徹夜した経験があるはずです。Odooはlibxml2libxsltなど、多くのシステムパッケージを必要とします。Pythonのバージョンが少し違うだけで、ERPシステム全体が即座に停止してしまいます。

サーバーのアップグレード時にwkhtmltopdfのエラー解決だけで8時間近く費やしたこともあります。Dockerを使えば、状況は一変します。たった1つの設定ファイルだけで、5分足らずでどのサーバーにもシステムをデプロイでき、コンテナを本格的なサービスとして運用することが可能になります。

なぜ1つのコンテナでは不十分なのか?

初心者の多くは、OdooとPostgreSQLを1つのイメージに詰め込みがちです(オールインワン)。これは本番環境では致命的なミスであり、Dockerホストの脆弱性を放置することにも繋がりかねません。データが数十GBに膨れ上がったとき、バックアップやスケーリングは悪夢と化します。

マルチコンテナモデルで各コンポーネントを分離することで、システムの柔軟性が大幅に向上します。以下は実務的な比較表です。

評価項目 オールインワン(テスト用) マルチコンテナ(本番用)
拡張性 ほぼゼロ DBのRAMアップグレードやAppのレプリカ追加が容易
データの安全性 リスクが高い データベースが内部ネットワークにあり、完全に分離されている
デプロイ速度 速いが修正が困難 標準化されており、CI/CDへの統合が容易

合理的なディレクトリ構造の構築

コマンドを入力する前に、明確なディレクトリ構造を準備しましょう。これにより、システムが成長してもカスタムモジュールやデータを混同せずに管理できます。

mkdir odoo-deployment && cd odoo-deployment
mkdir -p ./config ./addons ./data/postgres ./data/odoo
touch docker-compose.yml ./config/odoo.conf ./config/nginx.conf
  • addons/: カスタムモジュールやストアで購入したモジュールを保存する場所。
  • data/: コンテナを削除しても、すべての請求書や書類を保持します。
  • config/: すべての運用パラメータを制御する心臓部。

標準的なDocker Composeファイルの作成

以下は、db (PostgreSQL 15)、odoo (v17)、webserver (Nginx) の3つのサービスの設定です。これらを専用のネットワークで接続する方法に注目してください。

version: '3.8'
services:
  db:
    image: postgres:15
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_PASSWORD=odoo_password_secret
      - POSTGRES_USER=odoo
    volumes:
      - ./data/postgres:/var/lib/postgresql/data
    networks:
      - odoo-nw

  odoo:
    image: odoo:17.0
    depends_on:
      - db
    ports:
      - "8069:8069"
    volumes:
      - ./data/odoo:/var/lib/odoo
      - ./config:/etc/odoo
      - ./addons:/mnt/extra-addons
    environment:
      - HOST=db
      - USER=odoo
      - PASSWORD=odoo_password_secret
    networks:
      - odoo-nw

  nginx:
    image: nginx:latest
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./config/nginx.conf:/etc/nginx/conf.d/default.conf:ro
    depends_on:
      - odoo
    networks:
      - odoo-nw

networks:
  odoo-nw:
    driver: bridge

ヒント: depends_on パラメータは非常に重要です。これにより、データベースが完全に起動してからOdooが開始されることが保証され、起動直後の接続エラーを回避できます。

Nginxの設定:HTTPSをスムーズに動作させる鍵

OdooがユーザーのIPアドレスを正しく認識するためには、./config/odoo.conf ファイルで proxy_mode = True を有効にする必要があります。この行を忘れると、HTTPS使用時にセッションエラーが頻発します。

[options]
admin_passwd = my_admin_password
db_host = db
db_port = 5432
db_user = odoo
db_password = odoo_password_secret
proxy_mode = True

Nginx側では、proxy_read_timeout の設定に注意してください。重いOdooのレポート処理には60秒以上かかることがよくあります。デフォルトのままだと、Nginxが接続を遮断し、504エラーを返してしまいます。より高度な管理を求めるなら、WebUIで管理するリバースプロキシの導入も検討に値します。

upstream odoo {
    server odoo:8069;
}

server {
    listen 80;
    server_name your-domain.com;

    proxy_read_timeout 720s;
    proxy_connect_timeout 720s;

    location / {
        proxy_pass http://odoo;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

運用とテスト

たった1つのコマンドでシステム全体を起動します:

docker-compose up -d

docker-compose ps を使用してステータスを確認します。すべてが Up と表示されていれば成功です。ターミナル上でより直感的にDockerをプロフェッショナルに管理するには、LazyDockerのようなツールが非常に便利です。長いJSON設定ファイルをデバッグする必要がある場合は、ブラウザで構文エラーを素早くチェックできる JSON Formatter をよく使います。

「眠れない夜」を避けるための実務経験

多くのクライアントプロジェクトを経験した結果、システムを24時間365日安定稼働させ、サーバーのディスク容量不足を防ぐための3つの黄金律をまとめました:

  • Workerの計算式: デフォルトのままにしないでください。(CPUコア数 * 2) + 1 という式を使いましょう。例えば4コアのサーバーなら、パフォーマンスを最適化するために9つのワーカーを設定すべきです。
  • バックアップ戦略: Docker Volumeだけに頼るのは絶対にやめてください。docker exec を使用して毎晩SQLファイルをダンプし、S3やGoogle Driveにアップロードしましょう。
  • リアルタイム処理: マルチワーカーで実行する場合、ポート8072(Longpolling)を追加で開放する必要があります。これがないと、Odoo内のチャット通知などがリアルタイムで表示されません。

OdooのDocker化は難しくありません。難しいのは、本番環境に適した設定を行うことです。このガイドが、強力で管理しやすいERPシステムの構築に役立つことを願っています。

Share: