This document describes basic steps to set up Odoo in production. It follows installation, but should not be used for development systems.
dbfilter
Одна система Odoo может запускаться и обслуживать несколько экземпляров базы данных. Каждый из них имеет свои индивидуальные настройки (например установленные модули) в зависимости от базы данных, которая используется в данный момент.
Это не проблема при работе только с бэкэндом (веб-клиентом) в качестве зарегистрированного пользователя компании: при входе в систему можно выбрать базу данных и Odoo запомнит какую именно.
However it is an issue for non-logged users (portal, website) which aren't bound to a database: Odoo need to know which database should be used for the operations or to get the data. If multi-tenancy is not used that is not an issue, there's only one database to use, but if there are multiple databases accessible Odoo needs a rule to know which one it should use.
That is one of the purposes of --db-filter
:
it specifies the default database for the Odoo system. The value is a
regular expression, possibly including the dynamically injected hostname
or subdomain through which the Odoo system is accessed.
If an Odoo hosts multiple databases in production, especially if website
is used, it must use a dbfilter or a number of features will not work
correctly or not use at all.
Пример конфигурации
фильтрация баз данных с именем, начинающимся на 'mycompany'
в /etc/odoo/odoo.conf
установите:
[options]
dbfilter = ^mycompany.*$
- filtering only db with a name equal to hostname without domain
в /etc/odoo/odoo.conf
установите:
[options]
dbfilter = %d
PostgreSQL
По умолчанию PostgreSQL разрешает только подключение к UNIX-сокетам и loopback соединениям (из "localhost", той же машине, на которой установлен сервер PostgreSQL).
UNIX-сокет удобен, если вы хотите, чтобы Odoo и PostgreSQL выполнялись на одном компьютере, и по умолчанию не задаются адреса компьютеров, но если вы хотите, чтобы Odoo и PostgreSQL выполнялись на разных машинах 1, то необходимо listen to network interfaces 2, либо:
- only accept loopback connections and use an SSH tunnel between the machine on which Odoo runs and the one on which PostgreSQL runs, then configure Odoo to connect to its end of the tunnel
- accept connections to the machine on which Odoo is installed, possibly over ssl (see PostgreSQL connection settings for details), then configure Odoo to connect over the network
Пример конфигурации
- allow tcp connection on localhost
- allow tcp connection from 192.168.1.x network
в /etc/postgresql/9.5/main/pg_hba.conf
пропишите:
# IPv4 local connections:
host all all 127.0.0.1/32 md5
host all all 192.168.1.0/24 md5
в /etc/postgresql/9.5/main/postgresql.conf
пропишите:
listen_addresses = 'localhost,192.168.1.2'
port = 5432
max_connections = 80
Настройка Odoo
Из коробки Odoo подключается к локальному postgres через сокет UNIX и порт 5432. Эти параметры можно переопределить, используя параметры базы данных, если Postgres установлен не локально и/или не использует установки по умолчанию.
При установке с использовании инсталяторов автоматически создаст нового пользователя (odoo
) и установит его как пользователя базы данных.
Экран управления базами данных защищен паролем, который устанавливается настройкой
admin_passwd
. Этот параметр можно установить только в файле конфигурации, и он используется перед выполнением изменений базы данных. Он должен быть произвольно сгенерированным значением, чтобы гарантировать, что из вне никто не получит доступ к вашим базам данных.- all database operations use the database options, including the database management
screen. For the database management screen to work requires that the PostgreSQL user
have
createdb
right. users can always drop databases they own. For the database management screen to be completely non-functional, the PostgreSQL user needs to be created with
no-createdb
and the database must be owned by a different PostgreSQL user.Предупреждение
пользователь PostgreSQL не должен быть суперпользователем
Пример конфигурации
подключиться к серверу PostgreSQL по адресу 192.168.1.2
порт 5432
используется учетную запись 'odoo'
с 'pwd' в качестве пароля
фильтрация баз данных с именем, начинающимся на 'mycompany'
в /etc/odoo/odoo.conf
установите:
[options]
admin_passwd = mysupersecretpassword
db_host = 192.168.1.2
db_port = 5432
db_user = odoo
db_password = pwd
dbfilter = ^mycompany.*$
Встроенный сервер
Odoo включает в себя встроенный HTTP-сервер, который использует многопоточность и многопроцессорность.
Для использования на продакшене рекомендуется использовать многопроцессорность на сервере, поскольку это повышает стабильность, улучшает использование вычислительных ресурсов и может быть лучше контролироваться.
- Multiprocessing is enabled by configuring
a non-zero number of worker processes
, the number of workers should be based on the number of cores in the machine (possibly with some room for cron workers depending on how much cron work is predicted) Ограничения Worker настраиваются основываясь на конфигурации оборудования, чтобы избежать исчерпания ресурсов
Предупреждение
многопроцессорный режим в настоящее время недоступен в Windows
Расчет количества worker
Рассчитывается по формуле: (#CPU * 2) + 1
Cron Workers используют процессор
1 worker ~ 6 конкурентных пользователей
расчет размера необходимого ОЗУ
Мы считаем, что 20% запросов - это тяжелые запросы, а 80% - более простые
- A heavy worker, when all computed field are well designed, SQL requests are well designed, ... is estimated to consume around 1Go of RAM
"Более легкий" worker, в том же сценарии, по оценкам, потребляет около 150 МБ ОЗУ
Необходимое кол-во ОЗУ = #worker * ((light_worker_ratio * light_worker_ram_estimation) + (heavy_worker_ratio * heavy_worker_ram_estimation))
Живой чат
In multiprocessing, a dedicated LiveChat worker is automatically started and
listening on the longpolling port
but
the client will not connect to it.
Instead you must have a proxy redirecting requests whose URL starts with
/longpolling/
to the longpolling port. Other request should be proxied to
the normal HTTP port
Предупреждение
The livechat worker requires the psycogreen
Python module,
which is not always included with all installation packages.
It can be manually installed with pip install psycogreen
.
Пример конфигурации
Сервер с 4 процессорами, 8 потоков
60 одновременных пользователей
60 пользователей / 6 = 10 <- теоретическое число worker
(4 * 2) + 1 = 9 <- теоретическое максимальное число worker
Мы будем использовать 8 worker + 1 для cron. Мы также будем использовать систему мониторинга для измерения нагрузки процессора и проверим, составляет ли она от 7 до 7.5.
RAM = 9 * ((0,8 * 150) + (0,2 * 1024)) ~ 3Gb ОЗУ для Odoo
в /etc/odoo/odoo.conf
:
[options]
limit_memory_hard = 1677721600
limit_memory_soft = 629145600
limit_request = 8192
limit_time_cpu = 600
limit_time_real = 1200
max_cron_threads = 1
workers = 8
HTTPS
Whether it's accessed via website/web client or the webservice, Odoo transmits authentication information in cleartext. This means a secure deployment of Odoo must use HTTPS3. SSL termination can be implemented via just about any SSL termination proxy, but requires the following setup:
- enable Odoo's
proxy mode
. This should only be enabled when Odoo is behind a reverse proxy - set up the SSL termination proxy (Nginx termination example)
- set up the proxying itself (Nginx proxying example)
- your SSL termination proxy should also automatically redirect non-secure
connections to the secure port
Предупреждение
In case you are using the Point of Sale module in combination with a POSBox,
you must disable the HTTPS configuration for the route /pos/web
to avoid
mixed-content errors.
Пример конфигурации
- redirect http requests to https
- proxy requests to odoo
в /etc/odoo/odoo.conf
установите:
proxy_mode = True
в /etc/nginx/sites-enabled/odoo.conf
:
#odoo server
upstream odoo {
server 127.0.0.1:8069;
}
upstream odoochat {
server 127.0.0.1:8072;
}
# http -> https
server {
listen 80;
server_name odoo.mycompany.com;
rewrite ^(.*) https://$host$1 permanent;
}
server {
listen 443;
server_name odoo.mycompany.com;
proxy_read_timeout 720s;
proxy_connect_timeout 720s;
proxy_send_timeout 720s;
# Add Headers for odoo proxy mode
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
# SSL parameters
ssl on;
ssl_certificate /etc/ssl/nginx/server.crt;
ssl_certificate_key /etc/ssl/nginx/server.key;
ssl_session_timeout 30m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_prefer_server_ciphers on;
# log
access_log /var/log/nginx/odoo.access.log;
error_log /var/log/nginx/odoo.error.log;
# Redirect requests to odoo backend server
location / {
proxy_redirect off;
proxy_pass http://odoo;
}
location /longpolling {
proxy_pass http://odoochat;
}
# common gzip
gzip_types text/css text/less text/plain text/xml application/xml application/json application/javascript;
gzip on;
}
Odoo как приложение WSGI
It is also possible to mount Odoo as a standard WSGI application. Odoo
provides the base for a WSGI launcher script as openerp-wsgi.py
. That
script should be customized (possibly after copying it) to correctly set the
configuration directly in openerp.tools.config
rather than through the
command-line or a configuration file.
Сервер WSGI будет работать для веб-клиента, веб-сайта и API веб-сервиса, но Odoo не будет контролировать создание workers, он не сможет настроить workers cron или livechat workers
Задания Cron
Для выполнения заданий cron при развертывании Odoo в качестве приложения WSGI требуется
- a classical Odoo (run via
odoo.py
) - connected to the database in which cron jobs have to be run (via
odoo.py -d
) - which should not be exposed to the network. To ensure cron runners are not
network-accessible, it is possible to disable the built-in HTTP server
entirely with
odoo.py --no-xmlrpc
or settingxmlrpc = False
in the configuration file
Живой чат
Второй проблемной подсистемой при развертывании Odoo, как приложения WSGI, является LiveChat: где большинство HTTP-соединений относительно короткие и быстро освобождают рабочий процесс для следующего запроса, LiveChat требует долговременного подключения для каждого клиента, чтобы внедрять уведомления в режиме реального времени.
Это противоречит рабочей модели, основанной на процессах, поскольку она свяжет рабочие процессы и предотвращает доступ новых пользователей к системе. Тем не менее, эти долгоживущие соединения делают очень мало и в основном выполняют функцию ожидания уведомлений.
Решения для поддержки живого чата и уведомлений в приложении WSGI:
- deploy a threaded version of Odoo (instread of a process-based preforking
one) and redirect only requests to URLs starting with
/longpolling/
to that Odoo, this is the simplest and the longpolling URL can double up as the cron instance. - deploy an evented Odoo via
openerp-gevent
and proxy requests starting with/longpolling/
tothe longpolling port
.
Хранение статических файлов
Для удобства разработки Odoo хранит все статические файлы в своих модулях. Это не идеально с точки зрения производительности. Статические файлы обычно должны обслуживаться HTTP-сервером.
Статические файлы Odoo живут в папке static/
каждого модуля, поэтому статические файлы могут отдаваться веб-сервером путем перехвата всех запросов /MODULE/static/FILE
и поиска правильного модуля (и файла) по всем путям хранения аддонов.
Безопасность
"Super-admin" password
admin_passwd
мимоходом упоминается в Настройка Odoo
Этот параметр используется для всех действий над базами данных (для создания, удаления, сброса или восстановления баз данных).
If the management screens must not be accessible, or must only be accessible
from a selected set of machines, use the proxy server's features to block
access to all routes starting with /web/database
except (maybe)
/web/database/selector
which displays the database-selection screen.
Если экран управления базой данных должен быть доступен, параметр admin_passwd` должен быть изменен с ``admin
по умолчанию: этот пароль проверяется перед тем, как совершить операцию изменения базы данных.
Он должен храниться надежно и должен генерироваться случайным образом, например
$ python -c 'import base64, os; print(base64.b64encode(os.urandom(24)))'
этот код выведет 32-символьную псевдослучайную строку.
чтобы несколько установок Odoo использовали одну и ту же базу данных PostgreSQL или обеспечивали больше вычислительных ресурсов для обоих программ.
технически такой инструмент, как socat, может использоваться для прокси UNIX-сокетов по сетям, но это в основном для программного обеспечения, которое можно использовать только для UNIX сокетов
или быть доступным только через внутреннюю сеть с коммутацией пакетов, но для этого требуются защищенные коммутаторы, с защитой от [UNKNOWN NODE title_reference] и отключенным Wi-Fi. Даже над защищенными сетями с коммутацией пакетов рекомендуется развертывание по HTTPS, а возможные затраты снижаются, поскольку «самоподписанные» сертификаты легче развертывать в контролируемой среде, чем в Интернете.