Odoo & Docker

Howto

Openworx, Mario Gielissen

Odoo installeren binnen Docker


Docker wordt steeds meer gebruikt voor ontwikkeling en uitrollen van applicaties, verpakt in een Docker container. In dit artikel wordt uitgelegd hoe je Odoo en Postgres kunt installeren met Docker in combinatie met een NGINX proxy en virtual hosts op een shared IP adres. Meer over Odoo en Docker vind je op de dockerhub.
 

Ubuntu Server

Voor Docker hebben we een linux server nodig, dit kan basis Ubuntu 14.04 Server zijn (64 bits).

Installeer Docker:

sudo wget -qO- https://get.docker.com/ | sh

Docker containers aanmaken

Maak een docker container aan met Postgres en naam db-odoo1. Normaal wordt Postgres 9.5 geïnstalleerd als je alleen postgres kiest. Voor Odoo backup & restore hebben we versie 9.4 nodig:
 
sudo docker run -d -e POSTGRES_USER=odoo -e POSTGRES_PASSWORD=whatever --name db-odoo1 postgres:9.4
We willen de Odoo configuratie en custom addons kunnen gebruiken binnen de Odoo container. Op de server maken we hiervoor directories aan
 
sudo mkdir /opt/odoo1
sudo cd /opt/odoo1
sudo mkdir config addons
Plaats het openerp-server.conf bestand onder /opt/odoo1/config. Een voorbeeld kun je hier vinden.
 
sudo vim /opt/odoo1/config/openerp-server.conf

Custom addons plaats je onder /opt/odoo1/addons. Ga je meerdere Odoo docker containers gebruiken? Gebruik dan bijvoorbeeld /opt/odoo2 etc...


In het artikel op dockerhub wordt uitgelegd hoe je een Odoo container op poort 8069 laat luisteren voor de buitenwereld. Wil je echter meerdere Odoo containers op dezelfde server plaatsen? Dan moeten deze allemaal een aparte poort krijgen. Met een NGINX reverse proxy kun je meerdere Odoo containers, op basis van hostname, laten luisteren op poort 80. De poort voor de Odoo container hoeft niet voor de buitenwereld bereikbaar te zijn, hiervoor kunnen we VIRTUAL_PORT gebruiken. De hostnaam geven we op via VIRTUAL_HOST. Als je meerdere hostnamen wilt gebruiken, dan splits je deze via een comma. In ons voorbeeld willen we www.domein.nl en domein.nl gebruiken.

De containernaam is odoo1 en we linken de odoo container met de postgres container via --link db-odoo1:db
 
sudo docker run -e VIRTUAL_HOST=domein.nl,www.domein.nl -e VIRTUAL_PORT=8069 -v /opt/odoo1/config:/etc/odoo -v /opt/odoo1/addons:/mnt/extra-addons --name odoo1 --link db-odoo1:db -t odoo

Om binnen een docker container een shell op te roepen:

docker exec -it --user root odoo1 bash

NGINX Proxy

Als laatste zetten we de NGINX proxy container op. Hiervoor wordt jwilders/nginx-proxy gebruikt. Normaliter is er geen custom nginx configuratie nodig, maar bij het restoren van een Odoo backup via /web/database/manager krijgen we een 431 error omdat de standaard uploadsize 2MB is binnen NGINX. SSL certificaten kunnen ook gebruikt worden overigens.

Voor NGINX maken we een config en certs directory aan:

sudo mkdir /opt/nginx
sudo cd /opt/nginx
sudo mkdir certs conf

Maak een nginx config bestand aan en uploadsize=500M (dit kun je zelf aanpassen naar wens):

sudo vim /opt/nginx/conf/proxy.conf
client_max_body_size 500m;

Nu maken we de NGINX container aan en laten deze luisteren op poort 80 (http) voor de buitenwereld.

sudo docker run -d -p 80:80 -p 443:443 --name nginx-proxy -v /opt/nginx/certs:/etc/nginx/certs -v /opt/nginx/conf/proxy.conf:/etc/nginx/conf.d/my_proxy.conf:ro -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy
sudo docker run -d --name letsencrypt-nginx -v /opt/nginx/certs:/etc/nginx/certs:rw --volumes-from nginx-proxy -v /var/run/docker.sock:/var/run/docker.sock:ro jrcs/letsencrypt-nginx-proxy-companion

Nu kunnen we de Odoo omgeving bereiken via http://www.domein.nl. Om SSL (https) te gebruiken, plaats de www.domein.nl.key en www.domein.nl.crt onder /opt/nginx/certs.

Om Let's Encrypt SSL certificaten te gebruiken:

sudo docker run -e VIRTUAL_HOST=domein.nl,www.domein.nl -e "LETSENCRYPT_HOST=domein.nl,www.domein.nl" -e "LETSENCRYPT_EMAIL=info@domein.nl" -e VIRTUAL_PORT=8069 -v /opt/odoo1/config:/etc/odoo -v /opt/odoo1/addons:/mnt/extra-addons --name odoo1 --link db-odoo1:db -t odoo

Om een tweede Odoo omgeving te gebruiken via een andere hostnaam, bijvoorbeeld http://erp.bedrijf.nl, maak een 2e postgres en odoo container aan:

sudo docker run -d -e POSTGRES_USER=odoo -e POSTGRES_PASSWORD=whatever --name db-odoo2 postgres:9.4
sudo docker run -e VIRTUAL_HOST=erp.bedrijf.nl -e VIRTUAL_PORT=8069 -v /opt/odoo2/config:/etc/odoo -v /opt/odoo2/addons:/mnt/extra-addons --name odoo2 --link db-odoo2:db -t odoo

Firewall

Op de Ubuntu server kunnen we UFW gebruiken voor firewalling. We willen alleen ssh, http en https openzetten voor de buitenwereld:

sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
sudo ufw enable