========= 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 :doc:`index`. Per maggiori informazioni riguardanti l'architettura consultare lo schema sulla pagina :doc:`index` 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..`` 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: .. code:: sh ~$ sudo -i ~$ su - postgres-odoo ~$ psql - Creare utente e database rispettando la nomenclatura ``odoo`` per l’utente e ``odooprod`` per il database: .. code:: sql 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**: .. code:: sh ~$ 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**) ``-odoo--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ì: .. code:: sh ~$ 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: .. code:: sh ~$ 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`` .. code:: sh ~$ 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: .. code:: sh ~$ 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: .. code:: sh 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): .. code:: sh ~$ 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**: .. code:: sh ~$ 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: .. code:: sh ~$ podman exec -it 59-odoo-monk13-prod.r8 bash e lanciare il comando per odoo > 11.0 .. code:: sh ~$ ./entrypoint.sh --no-http --stop-after-init --workers=0 -i base altrimenti .. code:: sh ~$ ./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: .. code:: sh ~$ 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**: .. code:: sh ~$ 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--prod``), che per la porta usata per il longpolling (``odoo--prod-im``) usando lo stesso bilanciamento degli altri upstream di odoo. - una volta modificata la configurazione degli upstream testarla con il comando .. code:: sh ~$ 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 ``.odoo.monksoftware.it`` esempio di configurazione nginx per affiancamento.odoo.monksoftware.it: .. code:: nginx 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 .. code:: sh ~$ 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: .. code:: sh ~$ 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 .. code:: sql 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: .. code:: sh nc -l -w 10 -p 8080 | tar -vxf - Sulla macchina di preeproduzione, dalla directory in cui ci eravamo già spostati prima, lanciare: .. code:: sh 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: .. code:: sh chown -R 624388:624388 /var/lib/odoo/data/x-odoo-blabla-prod/volumes/odoodata/filestore Fare partire il container: :: service_podman 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: .. code:: sh podman logs -f 59-odoo-monk13-prod.r8