Odoo prod

Purtroppo questa sezione non è stata ancora tradotta in inglese a causa della mancanza di tempo, ogni contributo è ben accetto! :)

Questa sezione copre i concetti riguardanti le procedure per l’installazione e la configurazione degli ambienti di odoo di produzione. Per favore leggere prima l’introduzione sulla pagina Odoo.

Per maggiori informazioni riguardanti l’architettura consultare lo schema sulla pagina Odoo e in caso di dubbi rivolgersi al BOFH.

Introduzione

L’ambiente di prod gira su 4 nodi su cui è installato podman. Podman è un tool demonless quasi completamente identico a Docker (molti comandi sono identici) che si occupa di gestire le immagini e i container OCI. La maggior parte delle operazioni viene gestira da due script: service_podman e service_scaffold. Entrambi sono reperibili presso la repo https://git.webmonks.org/odoo/server-utils/odoo-service-utilities. Di seguito le procedure per installare odoo nell’ambiente di produzione.

Gitlab

  • Taggare la release del branch interessato su https://git.webmonks.org/odoo/odoo-docker-compose-recipe Solitamente la nomenclatura del tag segue la regola r.<nomebranch>.<numero release> quindi ad esempio la release 8 del branch monk13 sarà taggata con r.monk13.8.

  • Dopo aver taggato il commit corrispondente alla release che si vuole pubblicare, buildare l’immagine della release per la produzione dal pannello CI/CD di gitlab.

Postgres

  • Creare il database su dbcl01:

    ~$ sudo -i
    ~$ su - postgres-odoo
    ~$ psql
    
  • Creare utente e database rispettando la nomenclatura odoo<nome> per l’utente e odoo<nome>prod per il database:

    postgres=# CREATE USER odoomonk13 WITH PASSWORD 'asdasdasd';
    postgres=# CREATE DATABASE odoomonk13prod OWNER odoomonk13;
    

Creazione Servizio

Per questa procedura si consiglia l’uso di un Terminal multiplexer (Tmux) per sincronizzazione i comandi su tutti e 4 i nodi del cluster di odoo.

Caution

Le azioni di seguito andranno effettuate su tutti e 4 i nodi.

  • entrare nel nodo, ad es. odoo-be-prod01 e diventare utente odoo:

    ~$ sudo -i
    ~$ su - odoo
    
  • Creare il servizio utilizzando lo script service_scaffold, ricordarsi di rispettare la nomenclatura per la creazione del servizio (all’inizio vanno messi i primi 2 digit delle porte usate da quell’odoo) <digit>-odoo-<nome>-prod. Quindi se vogliamo creare un nuovo servizio chiamato monk13 e tale servizio sarà in ascolto sulle porte 5900 e 5901 (longpolling), allora faremo così:

    ~$ cd /var/lib/odoo
    ~$ service_scaffold -n 59-odoo-monk13-prod -i docker.repo.localmonks.net/odoo/monk13:r8
    
  • Entrare nella directory che è stata creata dallo script:

    ~$ cd /var/lib/odoo/59-odoo-monk13-prod
    

    controllare che i parametri in service_conf.sh siano corretti ed editare il file odoo.conf:

    • aggiungere db

    • controllare che siano configurati e aggiunti i moduli: redis_session_store, syslog_logger

      • prima di aggiungere i moduli accertarsi di aver fatto il checkout del tag corrispondente alla versione di odoo che si sta utilizzando (ad es. se si usa odoo12 il tag è 12.0)

    • che sia impostata la porta di longpolling

    • che sia impostata l’ admin_passwd

  • Dare i permessi corretti a odoo.conf

    ~$ chmod 644 odoo.conf
    

Caution

Le azioni di seguito andranno effettuate solo su un nodo.

  • Creazione directory su filestore:

  • Loggarsi in uno dei quattro nodi, ad es. odoo-be-prod01 e diventare root:

    ~$ sudo -i
    
  • Creare delle directory con la stessa struttura e i permessi dell’esempio di sotto in /var/lib/odoo/data. La directory principale dovrà avere lo stesso nome del servizio che andremo a creare successivamente:

    permessi    utente  gruppo   directory
    drwxr-x---  624388  odoo     59-odoo-monk13-prod
    drwxr-x---  624388  odoo     └── volumes
    drwxr-xr-x  624388  odoo         └── odoodata
    
  • Creare le directory base di odoo nel volume:

    mkdir -p /var/lib/odoo/data/xx-odoo-blabla-prod/volumes/odoodata/{addons,filestore}
    

    Dare i permessi adatti alle directory filestore e addons:

    chown -R 624388:624388 /var/lib/odoo/data/x-odoo-blabla-prod/volumes/odoodata/filestore
    
    chown -R 624388:624388 /var/lib/odoo/data/x-odoo-blabla-prod/volumes/odoodata/addons
    

Caution

Le azioni di seguito andranno effettuate su tutti e 4 i nodi.

  • Una volta creato e configurato il sevizio e il datastore, lanciare il servizio usando lo script service_podman che si occupa di gestire i containers (aggiornamento, start e stop, up e down):

    ~$ service_podman /var/lib/odoo/59-odoo-monk13-prod up
    

Caution

Le azioni di seguito andranno effettuate solo su un nodo.

  • entrare nel nodo, ad es. odoo-be-prod01 e diventare utente odoo:

    ~$ sudo -i
    ~$ su - odoo
    
  • Inizializzare il database creato in precedenza entrando nel container. È possibile vedere i container attivi con il comando podman ps. Una volta identificato il container aprire una bash all’interno di esso con il comando:

    ~$ podman exec -it 59-odoo-monk13-prod.r8 bash
    

    e lanciare il comando per odoo > 11.0

    ~$ ./entrypoint.sh --no-http --stop-after-init --workers=0 -i base
    

    altrimenti

    ~$ ./entrypoint.sh --no-xmlrpc --stop-after-init --workers=0 -i base
    

Aggiornamento servizio

Caution

Le azioni di seguito andranno effettuate su tutti e 4 i nodi.

  • Per aggiornare un servizio a una nuova release baste modificare la versione dell’immagine all’interno del file service_conf.sh. Quindi ad esempio modificare il file in /var/lib/odoo/59-odoo-monk13-prod/service_conf.sh.

  • Lanciare poi l’aggiornamento automatico del servizio con il comando:

    ~$ service_podman /var/lib/odoo/59-odoo-monk13-prod update
    

    Il comando andrà lanciato come utente odoo

Configurazione Nginx

Caution

Le azioni di seguito andranno effettuate su tutti e 4 i nodi.

  • entrare nel nodo, ad es. nginx-fe01 e diventare utente root:

    ~$ newgrp admins
    ~$ sudo -i
    
  • entrare nella directory /etc/nginx/ ed editare il file ./conf.d/upstream-odoo.conf e creare un nuovo upstream sia per la porta http (odoo-<nome>-prod), che per la porta usata per il longpolling (odoo-<nome>-prod-im) usando lo stesso bilanciamento degli altri upstream di odoo.

  • una volta modificata la configurazione degli upstream testarla con il comando

    ~$ nginx -t
    

Caution

Le azioni di seguito andranno effettuate solo su un nodo.

  • entrare nella directory /etc/nginx/sites-available e creare un file con nome <nome>.odoo.monksoftware.it

    esempio di configurazione nginx per affiancamento.odoo.monksoftware.it:

    server {
        listen    443 ssl;
        ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers         HIGH:!aNULL:!MD5;
    
        server_name   affiancamento.odoo.monksoftware.it;
        access_log /var/log/nginx/affiancamento.odoo.monksoftware.it.log timing;
        error_log /var/log/nginx/affiancamento.odoo.monksoftware.it_error.log;
    
        # You can keep this SSL section as the same for every .odoo.monksoftware.it backend
        ssl on;
        ssl_prefer_server_ciphers    on;
        ssl_certificate    /etc/nginx/certs/*.odoo.monksoftware.it.cer;
        ssl_certificate_key    /etc/nginx/certs/*.odoo.monksoftware.it.key;
    
        proxy_connect_timeout    300;
        proxy_send_timeout    300;
        proxy_read_timeout    300;
        send_timeout        300;
        client_max_body_size    10m;
    
        proxy_set_header    Host $host;
        proxy_set_header    X-Forwarded-Host    $host;
        proxy_set_header    X-Forwarded-Server    $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;
        proxy_set_header    If-None-Match   $http_if_none_match;
    
        gzip    on;
        gzip_types    text/plain text/xml text/css application/xml application/json application/x-javascript application/javascript;
    
        location / {
            proxy_pass    http://odoo-affiancamento-prod;
        }
    
        location /longpolling {
            proxy_pass http://odoo-affiancamento-prod-im;
            proxy_connect_timeout    600;
            proxy_send_timeout    600;
            proxy_read_timeout    600;
            send_timeout    600;
        }
    }
    
  • una volta scritta la configurazione linkarla dentro /etc/nginx/sites-enabled e controllare che sia stata scritta correttamente

    ~$ cd /etc/nginx/sites-enabled
    ~$ ln -s ../sites-available
    ~$ nginx -t
    

Caution

Le azioni di seguito andranno effettuate su tutti e 4 i nodi.

  • una volta testata la config lanciare su tutti quanti i nodi il comando:

    ~$ nginx -s reload
    

Procedura messa in produzione Odoo da preprod

Copia del database da preproduzione a produzione

Fare il dump del db di test in formato plain (non custom):
pg_dump -d dbname > dbname.dmp

(almeno finchè non verranno nuovamente allineate le versioni di postgres su preprod)

Copiarlo su uno dei server del cluster postgres di produzione.

Creare il database e l’utenza su produzione

create user yyyy with encrypted password 'yyyyxxxx'
create database xxxxxxxx owner yyyyy
grant all privileges on database xxxxxx to yyyyy

Effettuare il restore sul db di produzione

psql -d xxxxx < dbname.dmp

Lanciare lo script utility per sistemare le utenze:

fixdbPermissions dbowner dbname (ad esempio: fixdbPermissions odoosimica odoosimicaprod).

Non possiamo usare REASSIGN OWNED in quanto l’import è stato fatto con l’utenza postgres.

Entrare sul db di produzione e cancellare gli asset per fare in modo che vengano rigenerati

psql -d xxxxxx
delete from ir_attachment where res_model='ir.ui.view' and name like '%assets_%';

Copiare il filestore da preproduzione a produzione:

Entrare sulla macchina di preproduzione e spostarsi nella directory relativa al container dove gira l’Odoo da migrare, all’interno dei volumi, ad esempio:

/var/lib/docker/volumes/odoosimica-demo_odoodata/_data/filestore/odoosimicatest

Dove odoosimica-demo_odoodata è il nome del container, e la parte “odoosimicatest” è il nome dell’Odoo

Quindi: Sulla macchina di produzione, come utente root, spostarsi dentro

/var/lib/odoo/data/xx-odoo-blabla-prod/volumes/odoodata/filestore

Lanciare:

nc -l -w 10 -p 8080 | tar -vxf -

Sulla macchina di preeproduzione, dalla directory in cui ci eravamo già spostati prima, lanciare:

tar -cvf - * | nc -q 10 odoo-be-prod01 8080

In questo modo copieremo i file su produzione.

Dare i permessi adatti al contenuto del filestore:

chown -R 624388:624388 /var/lib/odoo/data/x-odoo-blabla-prod/volumes/odoodata/filestore

Fare partire il container:

service_podman <nomecontainer> up

Controllare il log su storage:/var/log/odoo/logname-prod

Aggiunta syslog su storage

Per far loggare correttamente odoo all’interno di storage.localmonks.net bisogna editare la config (all’interno di storage) /etc/syslog-ng/syslog-ng.conf

Per maggiori informazioni chiedere aiuto al BOFH.

Comandi utili

I comandi di podman sono praticamente gli stessi di docker: solitamente i log di odoo vengono inviati a storage.localmonks.net, ma eventualmente è possibile vedere il log del container con il comando:

podman logs -f 59-odoo-monk13-prod.r8