В данной статье я постараюсь описать как можно запустить 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 серверов:
- 10.0.2.4 - балансировщик
- 10.0.2.5 - первая odoo нода
- 10.0.2.6 - вторая odoo нода
- 10.0.2.7 - сервер БД master
- 10.0.2.8 - сервер БД slave
Для удобной настройки из родительской ОС был проброшен 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.
Порядок его установки находится в описании к модулю. Действия следующие:
- Скопировать модуль в папку с модулями Odoo;
- Задать в конфиге необходимы параметры;
- Установить модуль из web интерфейса Odoo;
Также необходимо убедиться, что сервер 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.
Используемы материалы:
- High availability OpenERP Documentation
- Deploying Odoo