Instal·lar Odoo

De castillowiki
Saltar a: navegación, buscar

Odoo pot ser instal·lat en qualsevol sistema operatiu. No obstant, es desenvolupa pensant en Ubuntu o Debian i és el sistema en el que anem a treballar.

Odoo, en esencia, és un servidor web fet en python que es connecta amb una base de dades postgreSQL. Hi ha moltes maneres d'instal·lar Odoo, de les més avançades que són descarregar per git el repositori i fer que arranque a l'inici a les més simples que són desplegar un docker amb tot funcionant.

Instal·lar en Debian

Abans de res, cal preparar un poc el sistema:

En el cas de Ubuntu o Debian, que és el que ens interessa, Odoo proporciona uns repositoris anomenats Nightly, que poden ser afegits al sources.list per instal·lar de manera automàtica tot. Aquests respositoris són actualitzats cada nit. Per tant, és possible que al llarg del temps, algunes funcions o arxius canvien si actualitzem.

En principi tot ha de funcionar com diuen en els manuals, però si tenim que utilitzar utf-8 per l'idioma, tenim que fer algunes coses abans.

Abans de res, es possible que Debian o ubuntu no tinga bé els locales. Es pot fer en:

 # dpkg-reconfigure locales

I seleccionar els de es_ES i el de UTF8 per defecte. Cal eixir de sessió i tornar a entrar.

Si dpkg-reconfigure no mostra un asistent, pots fer:

 # locale-gen "es_ES.UTF-8"
 # dpkg-reconfigure locales

Enllaç als repositoris: https://nightly.odoo.com/

I com en el propi manual diu, es pot fer tot en aquests comandaments (el primer si estem en Debian):

 # sudo apt-get install ca-certificates
 # 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
 # apt-get update && apt-get install odoo

Aquests comandaments el que fan és instal·lar els certificats que els navegadors o, en aquest cas, wget necessiten per admetre HTTPS, a continuació, descarrega el certificat, afegeix el repositori i instal·la l'Odoo.

A continuació, cal anar a la direcció en el navegador:

http://<ip o url>:8069

Asciinema del procés.

Creació de una base de dades

En general no cal fer aquest pas i és recomanable fer la base de dades per la interfície web.

En l'usuari de odoo, creem una base de dades i li apliquem l'esquema de dades de Odoo:

 $ createdb --encoding=UTF-8 --template=template0 testdb
 $ odoo.py -d testdb

Aixó crea una base de dades amb les dades de prova per començar a treballar.

Per defecte, l'usuari serà admin amb contrasenya admin.

Comandaments bàsics de postgreSQL

Configuració de la ruta dels mòduls

La configuració del servidor Odoo té una opció que es diu addons-path. Nosaltres poden afegir més rutes per als nostres addons personalitzats. Es pot deixar de manera definitiva en el fitxer de configuració o iniciar el servidor indicant quina és la ruta dels addons:

 $ odoo -d demodb --addons-path="<ruta>"

Si volem que quede guardat de manera definitiva, cal afegit --save al comandament.

 $ odoo -d demodb --addons-path="/var/lib/odoo/modules,./addons" --save

El comandament anterior es deu fer des del directori d'instal·lació d'Odoo.

Exemple en cas de que el home de odoo estiga en un altre lloc i amb rutes absolutes:

 $ odoo --addons-path="/home/odoo/modules,/usr/lib/python2.7/dist-packages/odoo/addons" --save

La, provablement, millor solució:

 $ odoo --addons-path="/var/lib/odoo/modules,/usr/lib/python2.7/dist-packages/odoo/addons" --save
L'opció --save guarda la configuració en $HOME/.openerp_serverrc, que és un fitxer per a l'usuari odoo. Si volem que siga per a tots els usuaris que puguen executar el servidor odoo, es pot ficar en el fixter de /etc/odoo

Depurar Odoo

Per crear mòduls o vorer els problemes que estan passant, cal llegir els fitxers de log, però hi ha una manera més eficient de fer-ho. Si observem el comandament que, realment, està executant odoo:

/usr/bin/python /usr/bin/odoo.py --config /etc/odoo/openerp-server.conf --logfile /var/log/odoo/odoo-server.log

Podem observar que diu que --logofile va a un fitxer. Si parem el servici amb:

 # systemctl stop odoo
o
 # /etc/init.d/odoo stop

Podem iniciar sessió amb l'usuari odoo (cal fer que puga iniciar sessió en Linux) i executar:

 /usr/bin/python /usr/bin/odoo.py --config /etc/odoo/openerp-server.conf

D'aquesta manera, en temps real, va apareguent els missatges que dona el servidor.

Si volem, amés, actualizar un mòdul al arrancar, podem especificar quina base de dades i quin mòdul a actualitzar:

 /usr/bin/python /usr/bin/odoo.py --config /etc/odoo/openerp-server.conf -u mòdul -d empresa

Pot ser que el nostre usuari odoo tinga una configració personalitzada. En aquest cas, cal fer, per exemple:

 $ /usr/bin/python /usr/bin/odoo.py --config /var/lib/odoo/.openerp_serverrc -d empresa -u modul

Amés, podem modificar el nivell de log amb l'opció --log-level, per exemple: --log-level=debug

Asccinema amb tots els passos per depurar.

Per saber més, pots anar a l'ajuda:

 $ odoo.py --help

O a aquesta web: https://www.odoo.com/documentation/8.0/reference/cmdline.html

Per afegir als nostres mètodes una eixida de log i facilitar la depuració, es pot utilitzar el api de Odoo:

Al principi del fitxer .py:

from openerp import models, fields, api
import logging
 
_logger = logging.getLogger(__name__)

Per dins de les funcions:

	_logger.debug("Use _logger.debug for debugging purposes, nothing else.")
	_logger.info("Use _logger.info for information messages. This is used for notifying about something important.")
	_logger.warning("Use _logger.warning for minor issues, which will not crash your module.")
	_logger.error("Use _logger.error to report a failed operation.")
	_logger.critical("Use _logger.critical for critical message: when this goes off the module will not work anymore.")
	#Want to include data from your field? Pass it along in the context, get it from the pool or from the dict.
	_logger.critical("The name '" + str(record.get('name')) + "' is not okay for us!")
Podem directament entrar en una terminal afegint shell al comandament.


Preparar l'entorn de treball per a SGE

Aquesta ajuda és per que, com a alumnes, vos prepareu correctament per poder programar de manera cómoda en Odoo. No obstant, es poden traure idees per al treball professional o en altres entorns
  • Instal·lar el contenidor amb Debian 8.0.
  • Crear un usuari via consola del Proxmox per poder accedir fàcilment per SSH les primeres vegades i que no siga Odoo.
  • Accedir amb eixe usuari per SSH, fer-se root i instal·lar Odoo segons els manuals anteriors.
  • Crear una empresa amb dades de demo en la web d'Odoo.
  • Fer que l'usuari Odoo tinga shell i fer que es puga accedir a ell per SSH sense contrasenya des del vostre equip.
  • Fer-se un compte i un projecte en Github.
  • Crear el directori modules i configurar Odoo per utilitzar aquest quant s'inicie en 'mode depuració'.
  • Sincronitzar el directori modules en el Github personal.
  • Instal·lar ngrok per poder accedir des de casa al contenidor.
  • Instal·lar i configurar vim i tmux per poder editar per SSH.
  • Configurar el navegador d'arxius per accedir per SSH i editar amb el teu editor preferit.

Accedir des de casa

Aquesta part del manual sols està orientada als alumnes del curs, encara que pot ser útil per a qualsevol que vulga en sa casa tindre un contenidor o una màquina virtual amb Odoo i no vulga obrir els ports del router.
  • Donar-se d'alta en https://ngrok.com
  • Dins del contenidor, descarregar en wget l'enllaç que dona ngrok per al seu programa. En el cas nostre és aquest comandament:
 $ wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip
 $ unzip ngrok-stable-linux-amd64.zip
  • Dins del contenidor executar ngrok de forma que no es tanque quant tanques la connexió ssh. Per a que funcione cal iniciar-lo dins d'un screen o tmux o nohup:
 $ nohup ./ngrok tcp 22
  • Això ha obert una connexió al port 22 per a l'ssh.
  • Per connectar des de casa:
 $ ssh -L 8069:10.20.250.1:8069 lliurex@0.tcp.ngrok.io -p 18489
  • Cadascun ha de modificar la IP 10.20.250.1 per la del contenidor propi, l'usuari i el port que diguen en la web de ngrok en l'apartat status.
  • Ara tens una terminal SSH i un accés per localhost:8069 a la web d'Odoo.

Asciinema amb el procés

Accedir amb el navegador d'arxius

Si tens ubuntu, el navegador d'arxius pot acceptar una connexió SSH en el menú ir>lugar i escribint ssh://<url o ip>:<port>

Accedir de forma més còmoda

Si creem un fitxer ~/.ssh/authorized_keys amb la clau pública del nostre client SSH, per exemple: .ssh/id_rsa.pub podem entrar sense escriure contrasenya.

Si accedim i escrivim tmux o screen podem tindre una terminal subdividida i que no es tanca quant tanques la terminal SSH.

Es recomana tindre una terminal per a controlar el servidor amb lletra més menuda i una altra per a la gestió dels fitxers.

Odoo per HTTPS

El servidor Odoo per defecte dona la seua web pel port 8069 i en HTTP sense capa de seguretat SSL.

Per fer que tinga eixa seguretat, necessitem utilitzar un servidor web que faça de proxy i proporcione la connectivitat per HTTPS.

Situació inicial:

  ------------             ------------
  |          |         8069|          |
  |  Client  |<----------->| Server   | 
  |          |             | Odoo     |
  ------------             ------------

Situació que busquem:

  ------------             --------------------
  |          |         443 |                  |
  |  Client  |<----------->| Nginx <--┐       |
  |          |             |          |       |
  ------------             |          |8069   |
                           |          v       |
                           |        ------    |
                           |        |Odoo|    |
                           |        ------    |
                           --------------------

Tots els servicis que utilitzen SSL necessiten un certificat. En una situació ideal, tenim un certificat signat per una entitat certificadora. Si no, tenim que crear en nostre autosignat.

tutorial del certificat

# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/odoo-selfsigned.key -out /etc/ssl/certs/odoo-selfsigned.crt
Generating a 2048 bit RSA private key
...........................................................................................................+++
...........................................................................................+++
writing new private key to '/etc/ssl/private/odoo-selfsigned.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:ES
State or Province Name (full name) [Some-State]:Valencia
Locality Name (eg, city) []: Xàtiva
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []: nom o domini
Email Address []: correu@servidor.com

A continuació cal configurar el https en Nginx per a fer de proxy en Odoo. manual oficial

En /etc/odoo.conf:

 proxy_mode = True 

En /etc/nginx/sites-enabled/odoo.conf:

#odoo server
upstream odoo {
 server 127.0.0.1:8069;
}
upstream odoochat {
 server 127.0.0.1:8072;
}
# S'han definit els upstream a localhost i als port determinats

# http -> https (totes les peticions per HTTP se reformulen a HTTPS)
server {
   listen 80;
   server_name _;                            
   # Si tinguerem nom de domini el ficariem, en altre cas: _
   rewrite ^(.*) https://$host$1 permanent;
}

server {
 listen 443;
 server_name _;
 # La _ perquè en l'exemple no tenim domini, com dalt
 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/certs/odoo-selfsigned.crt;
 ssl_certificate_key /etc/ssl/private/odoo-selfsigned.key ;
 # IMPORTANT: ficar bé les rutes dels certificats
 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;
}

També cal esborrar el default de sites-enables de nginx o modificar-lo per a que no afecte al port 80 d'Odoo.

Ara es reinicien tanmt Odoo com nginx

En Docker

Aquest manual està originalment escrit per a Ubuntu 18.04

Documentació oficial Article sobre Docker i Odoo

En Docker és molt sencill desplegar Odoo, tan sols fa falta aquests comandaments:

# apt install docker.io
# docker run -d --restart="always" -e POSTGRES_USER=odoo -e POSTGRES_PASSWORD=odoo --name db postgres:9.4
# docker run --restart="always" -p 8069:8069 --name odoo --link db:db -t odoo
# docker stop odoo
# docker start -a odoo

El primer comandament instal·la el servei Docker. El segon instal·la un docker PostgreSQL amb una base de dades anomenada odoo i de contrasenya odoo. El tercer crea un docker Odoo vinculat a l'anterior base de dades. Per entrar sols cal anar a la direcció de l'amfitrió:8069 ja que el comandament indica que es redireccione per [Iptables] el port 8069 al del contenidor.

Resultat d'iptables:

# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
DOCKER-USER  all  --  anywhere             anywhere            
DOCKER-ISOLATION  all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain DOCKER (1 references)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             172.17.0.3           tcp dpt:8069

Chain DOCKER-ISOLATION (1 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             anywhere            

Chain DOCKER-USER (1 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             anywhere           

Si fem ctrl-C eixim sense parar el contenidor. si volem tornar a entrar per veure els errors:

# docker attach odoo

Creació de mòduls

Per a fer els nostres mòduls podem crear-los en un directori fora del docker i executar-lo d'aquesta manera:

# docker run -v /path/to/addons:/mnt/extra-addons -p 8069:8069 --name odoo --link db:db -t odoo

Mentre estem fent nous mòduls, necessitem reiniciar el servici i arrancar-lo actualitzant un mòdul. Primer deguem parar el docker, després iniciar-lo indicant que vols entrar a la consola i finalment actualitzar el mòdul.

# docker stop odoo
# docker start -a odoo
# docker exec odoo odoo --config /etc/odoo/odoo.conf -u nommodul -d nombasededades -r odoo -w odoo --db_host 172.17.0.2 --db_port 5432

Creació de mòduls, mètode 1

Com es veu, el últim comandament és un poc complicat. Per tant, anem a fer les coses totalment bé. Per a aixó necessitem un fitxer propi de configuració d'Odoo al que anomenarem odoo.conf. Podem utilitzar aquesta plantilla:

# docker exec odoo cat /etc/odoo/odoo.conf > odoo.conf

El que s'ha fet és copiar el fitxer que té el docker per defecte. Si l'analitzem, no diu bé on està la base de dades, ja que aquesta informació la passem amb el paràmetre --link del docker run. Nosaltres tenim que crear un directori i ficar dins el fitxer, editar-lo i afegir aquesta informació:

db_user = odoo
db_password = odoo
db_host = 172.17.0.2
db_port = 5432

Ara ja podem arrancar el contenidor amb tot:

# docker stop odoo
# docker run --volumes-from odoo -v /home/jose/modules/:/mnt/extra-addons -v /home/jose/config/:/etc/odoo -p 8069:8069 --name odoo2 --link db:db -t odoo

Observem que tenim un directori per als nostres mòduls, un altre amb el fitxer de configuració, la redirecció del port, el nom del nou mòdul, l'enllaç a la base de dades i el tipus de container.

Per últim, mentre tenim en marxa el servei, en una altra terminal podem executar:

# docker exec odoo odoo -u nommodul -d nombasededades


Creació de mòduls, mètode 2

El mètode anterior suposa l'execució d'un docker run molt complex. Per evitar equivocar-nos, podem per un docker compose com aquest:

version: '2'
services:
  db:
    container_name: db
    image: postgres:9.4
    network_mode: bridge
    environment:
      - POSTGRES_PASSWORD=odoo
      - POSTGRES_USER=odoo
      - PGDATA=/var/lib/postgresql/data/pgdata
    volumes:
      - odoo-db-data:/var/lib/postgresql/data/pgdata
  odoo:
    container_name: odoo
    image: odoo
    network_mode: bridge
    depends_on:
      - db
    ports:
      - "8069:8069"
    volumes:
      - odoo-web-data:/var/lib/odoo
      - /home/jose/config:/etc/odoo
      - /home/jose/modules:/mnt/extra-addons

volumes:
  odoo-web-data:
  odoo-db-data:

Observem que declarem dos servicis i el odoo depen del db. També cal dir quina xarxa utilitzen i la resta de dades que posem normalment en el run.

Això ha d'estar en un directori dins d'un fitxer anomenat docker-compose.yml i sols cal executar cada vegada:

# docker-compose up

Cal dir que. d'aquesta manera, el servici es para quan fem ctrl+c, per tant, per a actualitzar un mòdul podem executar el docker exec en una alta terminal.

Altres coses

Per a llançar més dockers amb odoo:

# docker run -p 8070:8069 --name odoo2 --link db:db -t odoo
# docker run -p 8071:8069 --name odoo3 --link db:db -t odoo

Si volem entrar en la base de dades postgreSQL per a fer coses manualment, podem executar:

# docker exec -ti db psql -U odoo
# docker exec -ti db psql -U postgres

Executem el comandament psql de forma interactiva i amb l'usuari odoo. L'usuari postgres és l'administrador.

Errors documentats

Important

Abans de fer aquests comandaments, consulteu el final del fitxer de log, generalment en /var/log/odoo/odoo-server.log

Si apareix un error similar a:

OperationalError: FATAL:  no existe el rol «odoo»
OperationalError: FATAL:  role "odoo" does not exist

Cal fer el comandament:

 su - postgres -c "createuser -s odoo"

Això crea l'usuari odoo amb permís de superusuari (-s)


Moltes vegades, al instal·lar, no configura el template0 de la base de dades en utf-8. [1]

Es soluciona esborrant i tornant a crear la base de dades template1 utilitzant la codificació UTF8. [2]

 # su postgres
 $ psql
 postgres=# update pg_database set datallowconn = TRUE where datname = 'template0';
 postgres=# \c template0
 template0=# update pg_database set datistemplate = FALSE where datname = 'template1';
 template0=# drop database template1;
 template0=# create database template1 with template = template0 encoding = 'UTF8';
 template0=# update pg_database set datistemplate = TRUE where datname = 'template1';
 template0=# \c template1
 template1=# update pg_database set datallowconn = FALSE where datname = 'template0';

Pot ser que no es cree el cluster de postgresql. Primer cal reconfigurar els locales y després:

 pg_createcluster 9.4 main --start