Instalacja i konfiguracja

Najprostszą jest instalacja z paczek Debiana (lub Ubuntu). Jeśli jednak chcemy uzyskać instalację ułatwiającą prace rozwojowe, lepiej pobrać odpowiednią wersję z repozytorium.

Zobacz też:

Przykładowe - procedury instalacji

W katalogu /srv/odoo - dla użytkownika odoo, w systemie Linux z Pythonem 2.7:

mkdir /srv
cd /srv
wget https://github.com/odoo/odoo/archive/10.0.zip
unzip 10.0.zip
mv odoo-10.0 odoo
rm *.zip
cd odoo
apt-get install python-lxml python-decorator python-pil \
        python-dateutil python-psycopg2 python-yaml \
        python-pychart python-reportlab python-mako \
        python-psutil python-jinja2 python-gevent \
        python-dev python-simplejson python-oauthlib wkhtmltopdf
pip install -r requirements.txt
chown -R odoo /srv/odoo

W otoczeniu wirtualnym Python 2.7 pod systemem Debian (Odoo 11 wymaga Python 3) - dla użytkownika zalogowanego:

sudo apt-get install git python2.7 postgresql python-virtualenv
sudo apt-get install gcc python2.7-dev libxml2-dev libxslt1-dev \
          libevent-dev libsasl2-dev libldap2-dev libpq-dev \
          libpng12-dev libjpeg-dev
virtualenv ~/odoo10
source ~/odoo10/bin/activate
cd ~/odoo10
# zamiast ściągać archiwum zip - robimy git clone gałęzi 10.0
git clone -b 10.0 https://github.com/odoo/odoo.git

cd odoo
pip install -r requirements.txt

Odoo korzysta z programów zewnętrznych, które musimy doinstalować w systemie operacyjnym. Przede wszystkim są to: Python, Postgresql, kompilator arkuszy style lessc i generator pdf o nazwie wkhtmltopdf (zamienia pliki html na pdf - zob. https://www.odoo.com/documentation/9.0/setup/install.html). Jeśli instalujemy Odoo z paczki (Debian/Ubuntu) - potrzebne programy zostaną zainstalowane i skonfigurowane. W przeciwnym przypadku musimy się upewnić, że mamy je w systemie dostępne.

Less

Odoo korzysta z dynamicznych arkuszy style Less. Należy się upewnić, że w systemie jest dostępny kompilator lessc. Przykładowa instalacja dla systemu Debian, w sytuacji, gdy mamy uprawnienia roota:

sudo apt-get install nodejs nodejs-legacy node-less
sudo apt-get install npm

Gdy nie ma powyższych paczek - możemy skorzystać z projektu https://github.com/nodesource/distributions. Na przykład:

apt install curl
curl -sL https://deb.nodesource.com/setup_10.x | bash -
apt-get install -y nodejs

Gdy nie mamy takich uprawnień - możemy zainstalować less w katalogu Odoo lub katalogu domowym:

npm install less
npm install less-plugin-clean-css

W takim przypadku musimy dodać katalog z lessc do ścieżki systemowej (PATH). W systemie Windows wykonujemy to w zmiennych otoczenia (Panel sterowania - system). W systemie Linux - w pliku .bashrc połozonym a katalogu domowym (komenda export). Na przykład:

export PATH=~/node_modules/.bin:$PATH

Upewnij się, że polecenie lessc wykonuje się z konsoli systemu. Jeśli nie, to sprawdź ścieżkę PATH (poleceniem echo) albo (mając w systemie typu Debian uprawnienia roota) - dodaj powiązania do katalogu programów (po upewnieniu się, gdzie jest lessc: whereis lessc):

sudo ln -s /usr/lib/node_modules/less/bin/lessc /usr/bin/lessc

Czasem musimy w analogiczny sposób zadbać o dostępność polecenia node (np.: sudo ln -s /usr/bin/nodejs /usr/bin/node).

Wydruki PDF

Pakiet wkhtmltopdf można pobrać ze strony: https://wkhtmltopdf.org/downloads.html

Przykład z aktualnym url pakietu:

apt-get install xvfb
apt install xfonts-75dpi
apt-get install wkhtmltopdf
# test: xvfb-run wkhtmltopdf
# aktualizacja do nowej wersji:
apt-get remove  wkhtmltopdf
wget https://downloads.wkhtmltopdf.org/0.12/0.12.5/wkhtmltox_0.12.5-1.stretch_amd64.deb
dpkg -i wkhtmltox_0.12.5-1.stretch_amd64.deb

Program wkhtmltopdf może nie działać w środowisku bez X. Dlatego potrzeba (zob. wyżej):

apt-get install xvfb

Program może być wywoływany komendą: xvfb-run wkhtmltopdf.

Przykładowa konfiguracja

# Konfiguracja Odoo (/opt/odoo.conf):
[options]
admin_passwd = xxxxxxxxxxxx
db_host = 127.0.0.1
db_port = 5432
db_user = odoo
db_password = xxxxxxxx
# tu podajemy gdzie są moduły - może być kilka ścieżek 
# rozdzielonych przecinkami; obowiązkowe jest addons
addons_path = /srv/odoo/addons,/srv/events/theme
log_level = info
logfile = /var/log/odoo-server.log
xmlrpc = True
xmlrpc_interface =.
xmlrpc_port = 8069
longpolling_port = 8070

Uruchamianie z terminala

Testowo możemy uruchomić Odoo z terminala poleceniem (uruchamianym w katalogu instalacji):

./odoo-bin

zob.: https://www.odoo.com/documentation/10.0/reference/cmdline.html

Przykładowy skrypt startowy

Odoo możemy uruchomić przy pomocy skryptu odoo-bin. Jeśli chcemy aby Odoo uruchamiało się jako demon (tak jak po instalacji z paczek Debiana) - musimy przygotować odpowiedni skrypt (można go później wrzucić do /etc/init.d i kazać systemowi uruchamiać na starcie przez update-rc.d, rcconf albo innym tego typu programem:

#!/bin/sh
. /lib/lsb/init-functions
ODOO_DIR=/srv/odoo
NAME=odoo
DESC=odoo
PORT=8069
export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
SCRIPT=$ODOO_DIR/odoo-bin
CONFIG=$ODOO_DIR/odoo.conf
LOGFILE=/var/log/odoo.log
PIDFILE=/run/${NAME}.pid
USER=odoo
export LOGNAME=$USER
test -x $SCRIPT || exit 0
set -e
odoo_start () {
     echo "start_events"
       cd $ODD_DIR
     export PATH=$PATH.
     sudo start-stop-daemon --start --quiet --pidfile $PIDFILE \
          --chuid $USER:$USER --background --make-pidfile \
          --exec $SCRIPT --  --config $CONFIG --logfile $LOGFILE \
          --xmlrpc-port $PORT --proxy-mode
}
odoo_script () {
    $SCRIPT  --pidfile $PIDFILE --config $CONFIG --xmlrpc-port $PORT
}
odoo_stop() {
    echo "stop_events"
     sudo start-stop-daemon --stop --quiet --pidfile $PIDFILE \
          --oknodo --retry 3
    rm -f $PIDFILE
}
case "$1" in
  script)
    odoo_script
   ;;
  start|"")
    odoo_start
    ;;
  restart)
    odoo_stop
    odoo_start
  ;;
  stop)
    odoo_stop
    ;;
  status)
   # No-op
   ;;
  *)
    echo "Usage: motd [start|stop|status]" >&2
    exit 3
   ;;
esac
exit 0

Tworzenie bazy danych

Przede wszystkim powinniśmy mieć użytkownika bazy (gdy instalujemy Odoo z paczek - tworzy się użytkownik odoo). Można go stworzyć przy pomocy interfejsu psql (z Postgresql). Najpierw tworzymy użytkownika odoo w systemie i bazie danych:

sudo adduser odoo
sudo -u postgres psql template1

Po uruchomieniu psql wykonaj:

CREATE USER odoo WITH PASSWORD '.......'
ALTER USER odoo CREATEDB;
\q

UAGA!

W nowych wersjach Postgressa (>9.6) trzeba powiązać użytkownika z rolą. Przed wykonaniem APTER USER wykonaj:

CREATE ROLE odoo WITH PASSWORD '.....';
ALTER ROLE odoo CREATEDB;
ALTER ROLE odoo LOGIN;

Utworzenie bazy można zrealizować na kilka sposobów

1) Funkcją menadżera Odoo. Uruchamiamy aplikację z URL: : /web/database/manager

2) Przy pomocy skryptu odoo-bin z katalogu aplikacji:

./odoo-bin --db_port 5432 --db_user odoo -d nazwa_nowej_bazy

albo:

./odoo-bin --config edu.conf -d nazwa_nowej_bazy

3) Przy pomocy psql (lub interfejsu webowego gdy mamy serwer w hostingu):

sudo -u odoo psql template1 -c 'create database nazwa_bazy_danych;'

Ten sposób jest szczególnie użyteczny przy tworzeniu kopii / odtwarzaniu bazy.

4) Uruchomienie aplikacji z pustą bazą. Zostaną utworzone struktury i użytkownik (administrator) admin/admin. Zaletą jest łatwość instalacji w hostingu (gdy bazę mamy daną z góry). Z takim sposobem instalacji wiążą się dwie niedogodności: instaluje się wersja angielska, na dodatek z danymi testowymi.

Aby uniknąć instalacji danych testowych, trzeba uruchomić demon odoo z parametrem --without-demo=all i/lub wpisać do parametrów: without_demo=all.

Kopia bazy danych

Skrypt tworzący kopię (pamiętaj by wcześniej zatrzymać aplikację serwera Odoo):

#!/bin/sh

db_name="nazwa_bazy"
db_host="127.0.0.1"
db_port=5432
db_user="odoo"
db_password="hasło bazy danych"

date=`date +"%Y%m%d_%H%M%N"`
filename="${db_name}_${date}.sql"
export PGPASSWORD=$db_password
pg_dump -U $db_user -h $db_host -p $db_port -E UTF-8 -F p -b -f $filename $db_name
gzip $filename

exit 0

Pamiętaj, że tworząc kopię nie wystarczy skopiować bazę danych, ale także zawartość katalogu ~/.local/share/Odoo/filestore/<nazwa-bazy-danych>

Do odtworzenia można użyć skryptu (parametrem jest nazwa pliku z kopią SQL):

#!/bin/sh

db_name="nazwa_bazy_danych"
db_host="127.0.0.1"
db_port=5432
db_user="odoo"
db_password="hasło bazy danych"

export PGPASSWORD=$db_password
psql -U $db_user -h $db_host -p $db_port $db_name < $1

exit 0

Alternatywne sposoby kopiowania / odtwarzania bazy jako archiwum (tar):

# kopia jako tar:
sudo -u odoo pg_dump  --no-owner --dbname "nazwa_bazy" --no-password  --verbose -Ft -f "~/nazwa.dump.tar"
# odtworzenie:
sudo -u odoo pg_restore  --no-owner --dbname=nazwa_bazy --no-password -Ft nazwa.dump.tar

Konfiguracja

Po zainstalowaniu oprogramowania uruchamiamy je skryptem startowym (odoo-bin, albo stworzonym według powyższego wzoru) i otwieramy w przeglądarce (zakładamy, że IP = 127.0.0.1):

http://127.0.0.1:8069

Otwieramy/tworzymy bazę danych a następnie instalujemy potrzebne moduły.

Konfiguracja Nginx

Poniższe informacje dotycące konfiguracji serwera można znaleźć zebrane w prezentacji: https://antiun.github.io/odoo-reverse-proxy-howto/

Odoo to gotowy serwer www. Jeśli jednak nie chcemy go otwierać na nietypowym porcie (standardowo 8069), najlepiej użyć serwera Nginx i skorzystać z jego opcji proxy. Zobacz: https://gist.github.com/pcuci/32b6179f724a13ef9e5f745581011f75

upstream odoo { server 127.0.0.1:8069; } 
upstream odoo-lp { server 127.0.0.1:8070; } 

server { 
 listen 443; 
 server_name 
 odoo.localhost; ← do zmiany
 access_log  /var/log
 ginx/odoo.access.log;
 error_log   /var/log
 ginx/odoo.error.log;
 ssl on
 ssl_ciphers ALL:!ADH:!MD5:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM;
 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
 ssl_prefer_server_ciphers on;
 ssl_certificate /etc/ssl/nginx/<klucz>.pem;  ← do zmiany
 ssl_certificate_key /etc/ssl/nginx/<klucz>.key; ← do zmiany
 keepalive_timeout   90;
 proxy_buffers 16 64k;
 proxy_buffer_size 128k;
 location /longpolling {
   proxy_pass http://odoo-lp;
 }
 location / {
   proxy_pass  http://odoo;
   proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
   proxy_redirect off;
   proxy_set_header    X-Forwarded-Host $host;
   proxy_set_header    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 https;
 }
 location ~* /web/static/ {
   proxy_cache_valid 100 30m;
   proxy_buffering on;
   expires 864000;
   proxy_pass http://odoo;
 }
}

server { 
  listen 80; 
  server_name odoo.localhost; ← do zmiany
  add_header Strict-Transport-Security max-age=2592000; 
  rewrite ^/.*$ https://$host$request_uri? permanent; 
}

Konfiguracja ta zakłada, że oprogramowanie Odoo działa na bazie danych nazwa_bazy oraz portach 8069 i 8070. Musi się to zgadzać z konfiguracją Odoo (plik konfiguracyjny i skrypt uruchamiający demona).

Jak powiązać bazę danych z adresem URL

Odoo sprawdza przy starcie ile baz danych jest dostępnych dla użytkownika wpisanego w konfiguracji (db_user). Gdy jest to więcej niż jedna baza - pojawia się okno wyboru. Aby tego uniknąć możemy dla każdego URL uruchamiać system z innymi parametrami - w tym innym użytkownikiem bazy danych (standardowo odoo). Istnieje jednak sposób, aby jedna instalacja Odoo obsłużyła wiele adresów URL (wiele firm) - z różnymi bazami danych.

W tym celu dopisujemy do konfiguracji Nginx'a przekazywanie nazwy bazy danych do Odoo. W poniższym przykładzie jest to baza o nazwie "nazwa_bazy":

proxy_set_header X-ODOO_DBFILTER "nazwa_bazy";

Ten zapis powoduje przekazanie wzorca nazwy bazy danych W Odoo natomiast trzeba zainstalować moduł zmieniający filtrowanie nazw bazy: https://github.com/OCA/server-tools/tree/10.0/dbfilter_from_header

Apache

Oczywiście analogiczna konfiguracja jest możliwa dla serwera Apache2:

<VirtualHost *:80>
# w miejsce odoo.localhost wpisz własny URL
    ServerName odoo.localhost
    ServerAlias www.odoo.localhost
# w miejsce /srv/odoo można podać inną ścieżkę do instalacji Odoo
    DocumentRoot "/srv/odoo"
    DirectoryIndex index.html
# zabezpieczamy serwer przed przeglądaniem katalogów
  <Directory "/srv/odoo">
    Options -Indexes +FollowSymLinks
    AllowOverride All
    Order allow,deny
    Allow from all
  </Directory>

# alternatywa z modułem zmiany adresów
#    RewriteEngine On
#    RewriteRule "^/(.*)" http://localhost:8069/$1 [P,QSA,L]
# lubL
#    RewriteRule "^/(.*)" http://localhost:8069/?db=nazwa_bazy/$1 [P,QSA,L]

  ProxyPass / http://localhost:8069/
  Header add X-ODOO_DBFILTER "nazwa_bazy"
  RequestHeader add X-ODOO_DBFILTER "nazwa_bazy"

  LogLevel warn

</VirtualHost>

Przed restartem serwera www trzeba zadbać o to, aby odpowiednie moduły zostały zainstalowane:

a2enmod headers
a2enmod rewrite

Odoo z protokołem HTTPS

Powyżej opisana konfiguracja ma pewną wadę. Zakładamy, że użytkownik łączy się po protokole https (otwarcie http powoduje automatycznie przekierowanie). Jednak komunikacja między Nginx a Odoo (proxy) odbywa się protokołem http. Aby wymusić adresy https:// możemy wykonać następujące kroki:

1) Ustalenie parametru web.base.url. Parametr ten jest dostępny w Odoo / ustawienia po włączeniu trybu deweloperskiego (menu: Techniczne | Parametry systemu). Ustawia się on na adres z którego wywoływane jest Odoo. Jeśli są to zarówno http, jak i https - ten parametr się zmienia (co może stanowić problem dla niktórych modułów). Wyłączenie tych zmian można osiągnąć dodając parametr web.base.url.freeze i ustawiając go na wartość False.

2) Przekazanie nazwy (URL) przez Nginx w nagłówku proxy (zob reverse proxy: https://www.nginx.com/resources/admin-guide/reverse-proxy/):

proxy_set_header    X-Forwarded-Host $host;

Zwróć uwagę, aby skrypt uruchamiający demona Odoo koniecznie zawierał parametr --proxy-mode (zob. wyżej). Parametr ten uaktywnia obsługę proxy prze pythonową bibliotekę werkzeug (zob. werkzeug's proxying support).

Pełna lista parametrów

[options]

Podstawowe dane dotyczące dostępu do bazy danych:

admin_passwd = admin
db_host = False
db_port = False
db_user = postgres
db_password = admin

Dodatkowe:

[options]

## Parametry ogólne serwera

# hasło administratora, które pozwala zakładać, kopiować, odzyskiwać i archiwizować bazy danych
admin_passwd = admin
# ścieżka/i do dodatkowych modułów rozszerzeń (oddzielone przecinkami)
addons_path = /opt/odoo/addons
# kartoteka w której standardowo zapisywane są dane systemu Odoo
data_dir = /var/lib/odoo

## Dotyczące bazy danych

# czy wskazywać serwerowi tylko konkretną bazę danych
db_name = False
# maksymalna ilość fizycznych połączeń do posgresql
db_maxconn = 64
# szablonnazwybazy danych
db_template = template1
# ścieżka do katalogu bin programów bazy danych Postgresql (tam szukany jest na przykład pg_dump).
pg_path = False

## Konfiguracja XML-RPC / HTTP

# czy protokół XML-RPC jest wyłączony
xmlrpc = True
# Adres TCP IP dla protokołu XML-RPC. Pusty string łączy do wszystkich interfejsów.
xmlrpc_interface = 127.0.0.1
# port TCP dla operacji protokołu XML-RPC
xmlrpc_port = 8069
# włącza poprawne zachowanie kiedy komunikacja odbywa się poprzez proxy
proxy_mode = True

## Konfiguracja bezpiecznych połączeń XML-RPC / HTTPS

# wyłącza bezpieczny protokół XML-RPC
xmlrpcs = True
# Adres TCP IP dla bezpiecznego protokołu XML-RPC. Pusty string łaczy do wszystkich interfejsów.
xmlrpcs_interface =
# port TCP dla operacji bezpiecznego protokołu XML-RPC
xmlrpcs_port = 8071
# plik certyfikatu dla połączeń SSL
secure_cert_file = server.cert
# plik klucza prywatnego dla połączeń SSL
secure_pkey_file = server.pkey

## Konfiguracja NET-RPC

# wyłącza porotkół NETRPC
netrpc = False
# adres TCP IP dla portokołu NETRPC
netrpc_interface = 127.0.0.1
# port TCP dla protokołu NETRPC
netrpc_port = 8070

## Konfiguracja interfejsu WEB

# filtr REGEXP według którego listowane są dostępne bazy danych,
# można użyć także parametru %d lub %h oznaczającego odpowiednio przedrostek nazwy domeny lub cała nazwę
dbfilter = .*
# włącza mechanizm listy wyboru bazy danych
list_db = True

## Konfiguracja usług statycznych HTTP

# wyłacza usługę HTTP statycznego serwowania plików HTML
static_http_enable = False
# specyfikuje kartotekę zawierającą pliki statyczne HTML (np. '/var/www/')
static_http_document_root = None
# specyfikuje główny prefix URL informujący przeglądarkę gdzie szukać statycznych plików HTML (np. '/')
static_http_url_prefix = None

## Konfiguracja testowania

# uruchamia plik testowy YML.
test_file = False
# jeśli ustawiono katalog to w nim znajda się wszystkie raporty z testów
test_report_directory = False
# włącza testy YAML.
test_disable = False
# zapisuje zmiany w bazie wywołane testami YAML lub XML.
test_commit = False

## Konfiguracja logów

# główny plik loga dla serwera (standardowo = None)
logfile = /var/log/openerp/openerp-server.log
# czy włączyć rotacje pliku loga
logrotate = True
# czy logowanie prowadzić do systemowego syslog serwera
syslog = False
# ustawia handler poziomu logowania LEVEL dla określonego PREFIX. Pusty PREFIX wymusza logowanie root. Opcja powtarzalna.
# np: "openerp.orm:DEBUG" lub "werkzeug:CRITICAL" (standardowo: ":INFO")
log_handler = ["[':INFO']"]
# określa poziom logowania. Akceptowane wartości to: info, debug_rpc, warn, test, critical, debug_sql, error, debug, debug_rpc_answer, notset
# np. loglevel = debug
log_level = info

## Konfiguracja poczty

# adres e-mail nadawcy poczty
email_from = False
# użytkownik nadający pocztę
smtp_user = False
# hasło użytkownika nadającego pocztę
smtp_password = False
# pocztowy port serwera SMTP
smtp_port = 25
# serwer SMTP
smtp_server = localhost
# włącza bezpieczny protokół SSL dla serwera SMTP
smtp_ssl = False

## Konfiguracja zaawansowana
# z pełną lista zaawansowanych parametrów konfiguracyjnych można zapoznać się po uważnym przeanalizowaniu pliku tools/config.py