Odoo学習8日目

先日、開発環境をDockerで構築したのですが、本日はその構成の中に、nginxをリバースプロキシとして組み込みました。本番環境でサーバーをHTTPS化するためには、Webサーバーが必要になると思います。そのため、開発環境からこの構成にしました。また、Websiteモジュールで公開している画面へのアクセスと管理画面へのアクセス可能なユーザーをそれぞれ制御するためにも、Webサーバーが役立つと考えています。具体的には、/webのパスにIP制限を設けることを考えています。ただし、これを本番環境で実装するには工夫が必要で、例えば、Webサーバー内にSSHサーバーを設置し、ホストマシンからSSHでポートフォワードして/webのパスにアクセスするといった方法が考えられます。まあ、そんなことも追々、検証するためにリバースプロキシを組み込みました。

リバースプロキシの設定について、生成系AIを使ってdocker-compose.ymlファイルやnginx.confファイルのOdooに最適なリバースプロキシの設定をして貰いましたが、一部問題がありました。nginx.confの中で、nginxからOdooへのプロキシ時のヘッダー情報にHostを指定している部分で、$hostと記載すると、ポート番号なしのホスト名でプロキシされます。その結果、Odoo側ではリダイレクト(最初のDB初期設定、ログインやログアウト等)する際にこの$hostを使用してしまい、Dockerのホスト側ポートが80以外の場合に問題が発生しました。$http_hostにすれば、ポート番号も含めたホスト名でプロキシしてくれるので、これで問題解決出来ました。

開発環境を整えている時に、Odooの管理画面上で、Websiteモジュールの設定を行う際に、どのようにバージョン管理を行うのが最適なのかについて考えていました。基本的に、設定情報はデータベース(DB)に保存されるため、ソースコードの管理よりもDB情報のバージョン管理が適していると考えています。しかし、複数人で開発を行う場合、DB情報のバージョン管理は難しいと感じ、このアイデアは断念しました。その代わり、各モジュールでデータをエクスポートできるので、そのエクスポートデータをgitやSubversionで管理するのが最善の方法ではないかと考えています。昨日聞いた話を進めるために、Websiteモジュールでこっそり開発を進めちゃいます!

設定ファイル参考

nginx.conf

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    server {
        listen 80;
        server_name localhost;

        location / {
            proxy_pass http://app:8069;
            proxy_set_header Host $http_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;
        }

        location /longpolling {
            proxy_pass http://app:8072;
            proxy_set_header Host $http_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;
        }
    }

    include /etc/nginx/conf.d/*.conf;
}

docker-compose.yml

version: "3.1"
services:
  web:
    image: nginx:1.26.1
    volumes:
      - ./web/nginx.conf:/etc/nginx/nginx.conf
    ports:
      - "8080:80"
    depends_on:
      - app
  app:
    image: odoo:17.0
    depends_on:
      - db
    expose:
      - "8069"
      - "8072"
    volumes:
      - odoo-web-data:/var/lib/odoo
      - ./app/config:/etc/odoo
      - ./app/addons:/mnt/extra-addons
  db:
    image: postgres:15
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_PASSWORD=odoo
      - POSTGRES_USER=odoo
      - PGDATA=/var/lib/postgresql/data/pgdata
    volumes:
      - odoo-db-data:/var/lib/postgresql/data/pgdata
volumes:
  odoo-web-data:
  odoo-db-data:


この記事が気に入ったらサポートをしてみませんか?