Thursday, December 26, 2024
Google search engine
HomeGuest BlogsHow To Install Odoo 16 on Ubuntu 22.04/20.04/18.04

How To Install Odoo 16 on Ubuntu 22.04/20.04/18.04

.tdi_3.td-a-rec{text-align:center}.tdi_3 .td-element-style{z-index:-1}.tdi_3.td-a-rec-img{text-align:left}.tdi_3.td-a-rec-img img{margin:0 auto 0 0}@media(max-width:767px){.tdi_3.td-a-rec-img{text-align:center}}

Odoo is an open source suite of web based business applications managed from a single console. There is a range of business applications available on Odoo which includes Open Source CRM, Website Builder, eCommerce, Warehouse Management, Project Management, Billing & Accounting, Point of Sale, Human Resources, Marketing, Manufacturing, Purchase Management, among others. In this article we will dive into the installation and configuration of Odoo on Ubuntu Linux with Let’s Encrypt SSL Certificates.

Odoo business applications can be installed and used as stand-alone applications, but they also integrate seamlessly so you get a full-featured Open Source ERP when you install several Apps. This guide will also cover how you configure Nginx Proxy with Let’s Encrypt SSL certificate but any other custom SSL certificate, self-signed or signed by a known CA can be used.

Step 1: Update Ubuntu system

We always begin our installations with system update and upgrade of all installed packages.

.tdi_2.td-a-rec{text-align:center}.tdi_2 .td-element-style{z-index:-1}.tdi_2.td-a-rec-img{text-align:left}.tdi_2.td-a-rec-img img{margin:0 auto 0 0}@media(max-width:767px){.tdi_2.td-a-rec-img{text-align:center}}

sudo apt update && sudo apt upgrade -y

Wait for all packages to be updated then reboot the system. This is necessary when there are kernel updates.

[ -f /var/run/reboot-required ] && sudo reboot -f

Step 2: Install PostgreSQL Database Server

Odoo requires a database server where data is stored. We will install the default version of PostgreSQL server available on Ubuntu upstream repositories.

To install the default version available in Ubuntu repositories. run:

sudo apt install postgresql postgresql-client -y

After installation the database service is started.

$ systemctl status postgresql*
● postgresql.service - PostgreSQL RDBMS
     Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
     Active: active (exited) since Tue 2023-08-22 16:58:28 UTC; 1min 53s ago
    Process: 2862 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
   Main PID: 2862 (code=exited, status=0/SUCCESS)
        CPU: 3ms

Aug 22 16:58:28 jammy systemd[1]: Starting PostgreSQL RDBMS...
Aug 22 16:58:28 jammy systemd[1]: Finished PostgreSQL RDBMS.

● [email protected] - PostgreSQL Cluster 14-main
     Loaded: loaded (/lib/systemd/system/[email protected]; enabled-runtime; vendor preset: enabled)
     Active: active (running) since Tue 2023-08-22 16:58:28 UTC; 1min 53s ago
    Process: 2839 ExecStart=/usr/bin/pg_ctlcluster --skip-systemctl-redirect 14-main start (code=exited, status=0/SUCCESS)
   Main PID: 2844 (postgres)
      Tasks: 7 (limit: 18678)
     Memory: 18.0M
        CPU: 370ms
     CGroup: /system.slice/system-postgresql.slice/[email protected]
             ├─2844 /usr/lib/postgresql/14/bin/postgres -D /var/lib/postgresql/14/main -c config_file=/etc/postgresql/14/main/postgresql.conf
             ├─2846 "postgres: 14/main: checkpointer " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "">
             ├─2847 "postgres: 14/main: background writer " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" >
             ├─2848 "postgres: 14/main: walwriter " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "">
             ├─2849 "postgres: 14/main: autovacuum launcher " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ">
             ├─2850 "postgres: 14/main: stats collector " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "">
             └─2851 "postgres: 14/main: logical replication launcher " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ">

Aug 22 16:58:26 jammy systemd[1]: Starting PostgreSQL Cluster 14-main...
Aug 22 16:58:28 jammy systemd[1]: Started PostgreSQL Cluster 14-main.

Step 3: Install wkhtmltopdf on Ubuntu

wkhtmltopdf is required for printing reports as it does the conversion of html to pdf. The version of wkhtmltopdf available in Ubuntu repositories does not support headers and footers so it is not used as a direct dependency.

Step 4: Install Odoo 16 on Ubuntu

Import APT repo GPG key

curl  -fsSL https://nightly.odoo.com/odoo.key|sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/odoo.gpg

Add Odoo deb repository so that you can install Odoo on Ubuntu Linux system.

echo "deb http://nightly.odoo.com/16.0/nightly/deb/ ./" | sudo tee /etc/apt/sources.list.d/odoo.list

Update Apt cache and install Odoo on Ubuntu system.

sudo apt update && sudo apt install odoo

Agree to start installation:

...
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  bzip2 docutils-common file fonts-font-awesome fonts-inconsolata fonts-liberation fonts-roboto-unhinted fonts-urw-base35 graphviz gsfonts javascript-common libann0 libc-ares2
  libcairo2 libcdt5 libcgraph6 libdatrie1 libdeflate0 libev4 libgd3 libgomp1 libgraphite2-3 libgts-0.7-5 libgts-bin libgvc6 libgvpr2 libharfbuzz0b libice6 libimagequant0
  libjbig0 libjpeg8 libjs-jquery libjs-underscore liblab-gamut1 liblcms2-2 libltdl7 libopenjp2-7 libpango-1.0-0 libpangocairo-1.0-0 libpangoft2-1.0-0 libpaper-utils libpaper1
  libpathplan4 libpixman-1-0 libraqm0 libsass1 libsm6 libthai-data libthai0 libtiff5 libwebp7 libwebpdemux2 libwebpmux3 libxaw7 libxcb-render0 libxcb-shm0 libxmu6 libxpm4
  libxt6 mailcap mime-support python3-appdirs python3-bs4 python3-cached-property python3-dateutil python3-decorator python3-defusedxml python3-docopt python3-docutils
  python3-freezegun python3-gevent python3-greenlet python3-html5lib python3-isodate python3-ldap python3-libsass python3-lxml python3-num2words python3-ofxparse
  python3-olefile python3-passlib python3-pil python3-polib python3-psutil python3-psycopg2 python3-pydot python3-pygments python3-pyinotify python3-pypdf2 python3-qrcode
  python3-renderpm python3-reportlab python3-reportlab-accel python3-requests-file python3-requests-toolbelt python3-roman python3-soupsieve python3-stdnum python3-usb
  python3-vobject python3-webencodings python3-werkzeug python3-xlrd python3-xlsxwriter python3-xlwt python3-zeep python3-zope.event sgml-base xml-core
Suggested packages:
  bzip2-doc fonts-freefont-otf | fonts-freefont-ttf fonts-texgyre graphviz-doc apache2 | lighttpd | httpd libgd-tools liblcms2-utils docutils-doc fonts-linuxlibertine
  | ttf-linux-libertine texlive-lang-french texlive-latex-base texlive-latex-recommended python-gevent-doc python-greenlet-dev python-greenlet-doc python3-genshi
  python-lxml-doc python-pil-doc python-polib-doc python-psutil-doc python-psycopg2-doc python-pygments-doc ttf-bitstream-vera python-pyinotify-doc pdf-viewer
  python3-egenix-mxtexttools python-reportlab-doc python-stdnum-doc ipython3 python-werkzeug-doc python3-watchdog python-xlrt-doc sgml-base-doc debhelper
The following NEW packages will be installed:
  bzip2 docutils-common file fonts-font-awesome fonts-inconsolata fonts-liberation fonts-roboto-unhinted fonts-urw-base35 graphviz gsfonts javascript-common libann0 libc-ares2
  libcairo2 libcdt5 libcgraph6 libdatrie1 libdeflate0 libev4 libgd3 libgomp1 libgraphite2-3 libgts-0.7-5 libgts-bin libgvc6 libgvpr2 libharfbuzz0b libice6 libimagequant0
  libjbig0 libjpeg8 libjs-jquery libjs-underscore liblab-gamut1 liblcms2-2 libltdl7 libopenjp2-7 libpango-1.0-0 libpangocairo-1.0-0 libpangoft2-1.0-0 libpaper-utils libpaper1
  libpathplan4 libpixman-1-0 libraqm0 libsass1 libsm6 libthai-data libthai0 libtiff5 libwebp7 libwebpdemux2 libwebpmux3 libxaw7 libxcb-render0 libxcb-shm0 libxmu6 libxpm4
  libxt6 mailcap mime-support odoo python3-appdirs python3-bs4 python3-cached-property python3-dateutil python3-decorator python3-defusedxml python3-docopt python3-docutils
  python3-freezegun python3-gevent python3-greenlet python3-html5lib python3-isodate python3-ldap python3-libsass python3-lxml python3-num2words python3-ofxparse
  python3-olefile python3-passlib python3-pil python3-polib python3-psutil python3-psycopg2 python3-pydot python3-pygments python3-pyinotify python3-pypdf2 python3-qrcode
  python3-renderpm python3-reportlab python3-reportlab-accel python3-requests-file python3-requests-toolbelt python3-roman python3-soupsieve python3-stdnum python3-usb
  python3-vobject python3-webencodings python3-werkzeug python3-xlrd python3-xlsxwriter python3-xlwt python3-zeep python3-zope.event sgml-base xml-core
0 upgraded, 110 newly installed, 0 to remove and 3 not upgraded.
Need to get 231 MB of archives.
After this operation, 1,065 MB of additional disk space will be used.
Do you want to continue? [Y/n] y

The service is started automatically after the installation of Odoo on Ubuntu:

$ systemctl status odoo
 odoo.service - Odoo Open Source ERP and CRM
     Loaded: loaded (/lib/systemd/system/odoo.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2023-08-22 17:06:40 UTC; 12s ago
   Main PID: 5798 (odoo)
      Tasks: 4 (limit: 18678)
     Memory: 75.8M
        CPU: 1.566s
     CGroup: /system.slice/odoo.service
             └─5798 /usr/bin/python3 /usr/bin/odoo --config /etc/odoo/odoo.conf --logfile /var/log/odoo/odoo-server.log

Aug 22 17:06:40 jammy systemd[1]: Started Odoo Open Source ERP and CRM.

Set the service to start on every system reboot.

$ sudo systemctl enable --now odoo
enabled

The service is started on port 8069. This can be confirmed using the command below.

$ ss -tunelp | grep 8069
tcp   LISTEN  0       128                  0.0.0.0:8069           0.0.0.0:*      uid:113 ino:1906251 sk:d <-> 

Step 5: Configure Nginx Proxy for Odoo

Install Nginx web server on your Ubuntu system:

sudo apt -y install vim nginx

There are two scenarios for Nginx proxy configuration – With HTTPS and when traffic is not served over secure connection. In this section, we’ll consider both setups.

Setup Nginx HTTP proxy for Odoo

Create a new configuration file for odoo.

sudo vim /etc/nginx/conf.d/odoo.conf

Modify this configuration snippet to fit your setup.

# Odoo Upstreams
upstream odooserver {
 server 127.0.0.1:8069;
}

server {
    listen 80;
    server_name erp.geeksforgeeks.org;
    access_log /var/log/nginx/odoo_access.log;
    error_log /var/log/nginx/odoo_error.log;


    # Proxy settings
    proxy_read_timeout 720s;
    proxy_connect_timeout 720s;
    proxy_send_timeout 720s;
    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;

    # Request for root domain
    location / {
       proxy_redirect off;
       proxy_pass http://odooserver;
    }

    # Cache static files
    location ~* /web/static/ {
        proxy_cache_valid 200 90m;
        proxy_buffering on;
        expires 864000;
        proxy_pass http://odooserver;
    }

    # Gzip
    gzip_types text/css text/less text/plain text/xml application/xml application/json application/javascript;
    gzip on;
}

My service domain in this example is erp.geeksforgeeks.org, replace it with your correct domain to be used with Odoo. A valid DNS record is required for external access as well.

Check your configuration syntax:

$ sudo nginx  -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

If the settings are deemed ok, restart nginx service.

sudo systemctl restart nginx

No error should be encountered on restart.

$ systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2023-08-22 17:07:55 UTC; 50s ago
       Docs: man:nginx(8)
    Process: 6270 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
    Process: 6271 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
   Main PID: 6364 (nginx)
      Tasks: 5 (limit: 18678)
     Memory: 4.8M
        CPU: 86ms
     CGroup: /system.slice/nginx.service
             ├─6364 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
             ├─6366 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
             ├─6367 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
             ├─6368 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
             └─6369 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""

Aug 22 17:07:54 jammy systemd[1]: Starting A high performance web server and a reverse proxy server...
Aug 22 17:07:55 jammy systemd[1]: Started A high performance web server and a reverse proxy server.

Using Let’s Encrypt SSL Certificate

It is always recommended to use SSL encryption for production deployments. Let’s Encrypt is a free SSL offering that you can use in your Setup.

Install certbot tool:

sudo apt install certbot

Get Let’s Encrypt SSL certificates for your domain.

 sudo certbot --nginx

If the execution went through, paths to the certificate and chain files will be printed out.

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/erp.geeksforgeeks.org/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/erp.geeksforgeeks.org/privkey.pem
   Your cert will expire on 2020-01-17. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot-auto
   again. To non-interactively renew *all* of your certificates, run
   "certbot-auto renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Create cron to renew certificate.

$ sudo crontab -e
15 3 * * * /usr/bin/certbot renew --pre-hook "systemctl stop nginx" --post-hook "systemctl start nginx"

After this, you will have the certificates automatically added to your Nginx config. If you had the certs already generated for your domain name, you can modify your config and add them as shown:

sudo vim /etc/nginx/conf.d/odoo.conf

Modify below and add to file.

# Odoo Upstreams
upstream odooserver {
 server 127.0.0.1:8069;
}

# http to https redirection
server {
    listen 80;
    server_name erp.geeksforgeeks.org;
    return 301 https://erp.geeksforgeeks.org$request_uri;
}

server {
    listen 443 ssl;
    server_name erp.geeksforgeeks.org;
    access_log /var/log/nginx/odoo_access.log;
    error_log /var/log/nginx/odoo_error.log;
   
   # SSL
    ssl_certificate /etc/letsencrypt/live/erp.geeksforgeeks.org/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/erp.geeksforgeeks.org/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/erp.geeksforgeeks.org/chain.pem;


    # Proxy settings
    proxy_read_timeout 720s;
    proxy_connect_timeout 720s;
    proxy_send_timeout 720s;
    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;

    # Request for root domain
    location / {
       proxy_redirect off;
       proxy_pass http://odooserver;
    }

    # Cache static files
    location ~* /web/static/ {
        proxy_cache_valid 200 90m;
        proxy_buffering on;
        expires 864000;
        proxy_pass http://odooserver;
    }

    # Gzip Compression
    gzip_types text/css text/less text/plain text/xml application/xml application/json application/javascript;
    gzip on;
}

Don’t forget to substitute erp.geeksforgeeks.org with your domain name.

Restart Nginx.

sudo systemctl restart nginx

Step 6: Access Odoo Web interface

Access Odoo Web page on your domain name from a web browser.

install odoo ubuntu 18.04 01

Input required details to create Database. After you click “Create Database”, you’ll be redirected to Administration page from where you can install Odoo business applications.

install odoo ubuntu 18.04 02

If you did configure https, the page should be loaded over a secure tunnel.

install odoo ubuntu 18.04 03

Visit Odoo documentation page for more reading.

Similar guides:

.tdi_4.td-a-rec{text-align:center}.tdi_4 .td-element-style{z-index:-1}.tdi_4.td-a-rec-img{text-align:left}.tdi_4.td-a-rec-img img{margin:0 auto 0 0}@media(max-width:767px){.tdi_4.td-a-rec-img{text-align:center}}

RELATED ARTICLES

Most Popular

Recent Comments