従来のOdooインストール:「依存関係の地獄(Dependency Hell)」という悪夢
UbuntuにOdooを直接インストールしたことがあるなら、ライブラリの競合で徹夜した経験があるはずです。Odooはlibxml2やlibxsltなど、多くのシステムパッケージを必要とします。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システムの構築に役立つことを願っています。

