В данной статье я постараюсь описать как можно запустить Odoo на нескольких серверах, какие проблемы могут встретиться и как их решить. Все работы проводятся на виртуальных машинах VirtualBox, с установленной ОС Debian 8.7.

Настройка VirtualBox

Для экспериментов была настроена сеть NAT в VirtualBox, со статическими ip адресами.

Для настройки адреса у конткретного сервера в файлике /etc/network/interfaces надо задать следующие параметры:

iface <interface> inet static
    address <static IP> (e.g. 10.0.2.7)
    netmask 255.255.255.0
    network 10.0.2.0
    broadcast 10.0.2.255
    gateway 10.0.2.2

Итак мои IP серверов:

Для удобной настройки из родительской ОС был проброшен ssh у сервера балансировщика, что бы настройки можно было производить из родной консоли.

Установка odoo на ноду

Для установки Odoo согласно официальной документации, нужно выполнить следующие действия:

# wget -O - https://nightly.odoo.com/odoo.key | apt-key add -
# echo "deb http://nightly.odoo.com/10.0/nightly/deb/ ./" >> /etc/apt/sources.list.d/odoo.list
# apt-get update && apt-get install odoo

После установки останавливаем PostgreSQL и отключчаем его сервис, т.к. БД у на будет крутиться на отдельном сервере:

systemctl stop postgres
systemctl disable postgres

Настройка Postgres

Итак, после того как мы настроили ноду с Odoo, пришло время настроить мастер сервер с БД. Для этого на нем изменим настройки конфига, чтобы он смог принимать соединения внутри нашей сети.

Сначала разрешим соединения из подсети 10.0.2.0/24. Для этого в файле /etc/postgresql/9.4/main/pg_hba.conf заменим следующие строки:

# IPv4 local connections:
host    all             all             0.0.0.0/0            md5

на

# IPv4 local connections:
host    all             all             10.0.2.0/24            md5

Таким образом говорим, что все из подсети 10.0.2.0/24 могут подсоединяться в нашему сервер.

Теперь нам необходимо сказать postgres какой адрес слушать для соедиения. Для этого в файле /etc/postgresql/9.4/main/postgresql.conf, надо установить параметр listen_addresses = '*', также можно просто прописать адреса интерфейсов, которые будут прослушиваться: listen_addresses = '10.0.2.7'

Итак, когда сервер настроен осталось подключить к нему нашу Odoo ноду.

Для этого в файле /etc/odoo/odoo.conf. Нужно задать следующие параметры:

db_host = 10.0.2.7
db_port = False
db_user = odoo
db_password = odoo

Теперь, если у вас настроен проброс портов, можно зайти на адрес localhost:8000 и увидеть, что odoo заработала корректно.

Создание БД и настройка хранения файлов в ней

После основых настроек можно зайти через браузер на сервер с настроеной Odoo. Если это превый запуск то появится форма создания БД. Заполняем все параметры и Odoo создаст базу данных для работы.

По умолчанию все файлы оформоления Odoo хранит на диске в папке хранилища. Это один из моментов, который мешает масштабированию, поэтому необходимо перенести все файлы в БД.

Для переноса данных в БД следует установить модуль ir_attachment_force_storage из репозитория imiktech_addons.

git clone https://github.com/imiktech-llc/imiktech_addons
cd imiktech_addons 
cp -r . /usr/lib/python2.7/dist-packages/odoo/addons

После этого обновляем список модулей в web-интерфейсе и устанавливаем ir_attachment_force_storage

После его утановки вся статика будет хранится в БД, что позволит отвязаться от диска для хранения файлов. И для корректного масштабирования нужно будет только отвязать хранилище сессий (об этом ниже).

После того, как модуль установлен вся статика будет в базе и можно будет запускать Odoo на других нодах. Следует обратить внимание, что список модулей на нодах должен быть одинаковый

Настройка хранения сессий в Redis

Еще одна проблема масштабирования это то, что Odoo по умолчанию хранит сессионные данные на диске. Поэтому для корректной обработки сессий их надо вынести во внешние хранилище (БД или иное хранилище).

В качестве хранилища сессий выбран redis, как наиболее быстрое.

Для работы Odoo с Redis, необходимо установить модуль redis_session_store из репозитория imiktech_addons. Для его установки понадобится пакет redis для python.

Порядок его установки находится в описании к модулю. Действия следующие:

Также необходимо убедиться, что сервер Redis открыт для внешних подключений. Проверить это можно посмотрев в redis.conf параметр bind, там должен быть параметр, типа такого:

bind 127.0.0.1 10.0.2.7

Примечание: у меня сервер Redis ноходится на 10.0.2.7, там же где и БД.

Настройка nginx

Для балансировки нагрузки будет использоваться nginx. Конфигурация для него будет следующая:

upstream openerp_servers {
	server 10.0.2.5:8069 max_fails=3 fail_timeout=30s; 
	server 10.0.2.6:8069 max_fails=3 fail_timeout=30s; 
}

server { 
	listen 80;
	
	location / {
            proxy_pass http://openerp_servers;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            client_max_body_size 200M;
    }
}

Примечание: настройки для SSL делаются аналогичным образом согласно официальной документации Odoo[2]. Кроме того рекомендуется использовать proxy_mode в конфиге Odoo.

Заключение

Описан только один вариант масштабирования системы Odoo, есть еще варианты с NFS, для хранения в ней файлов и сессий. А также возможен вариант с настройкой кластера. Кроме это не описана тонкая настройка PostgresSQL и Redis для большей производительности и надежности. В следующей статье я постораюсь описать настройку репликации PostgresSQL для Odoo.

Используемы материалы:

  1. High availability OpenERP Documentation
  2. Deploying Odoo