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ż:
- https://www.odoo.yenthevg.com/installing-configuring-odoo-digitalocean/
- https://linode.com/docs/websites/cms/install-odoo-10-on-ubuntu-16-04/
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