Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save nnps255/ca4aea8590e00ac1bb9fa0becd55da40 to your computer and use it in GitHub Desktop.

Select an option

Save nnps255/ca4aea8590e00ac1bb9fa0becd55da40 to your computer and use it in GitHub Desktop.
ODOO PERFORMANCE TRAINING

A. Infrastruktur

IP OS Info CPU RAM PURPOSE
34.87.143.81 Ubuntu 18.04.6 LTS 4 CORE 8GB Postgres Instance
34.124.179.57 Ubuntu 18.04.6 LTS 2 CORE 4GB Odoo Instance
34.124.251.112 Debian bullseye 2 CORE 4GB Nginx Instance
34.126.139.122 Debian bullseye 2 CORE 4GB PgBouncer Instance

B. Install Postgresql

Install postgresql

sudo apt update
sudo apt -y install vim bash-completion wget
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
echo "deb http://apt.postgresql.org/pub/repos/apt/ `lsb_release -cs`-pgdg main" |sudo tee  /etc/apt/sources.list.d/pgdg.list
sudo apt update
sudo apt -y install postgresql-12 postgresql-client-12

Check postgresql service

systemctl status postgresql.service 

Konek ke postgres

sudo su - postgres

Ganti user postgres

psql -c "alter user postgres with password 'postgres'"

Create user untuk odoo

createuser -s -i -d -r -l -w odoo
psql -c "ALTER ROLE odoo WITH PASSWORD 'odoo'"

Mengizinkan akses remote untuk postgres, buka pg_hba.conf

sudo nano /etc/postgresql/12/main/pg_hba.conf

Ganti bagian # IPv4 local connections menjadi

host    all             all             0.0.0.0/0               md5

Setting postgresql config

sudo nano /etc/postgresql/12/main/postgresql.conf 

Uncomment bagian

listen_addresses = ‘*’

Kemudian restart postgres

sudo systemctl restart postgresql 

C. Install Odoo with Docker

Install Docker Ubuntu

sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin docker-compose

Cek Docker dan Docker Compose version untuk memastikan installasi sudah berhasil

docker --version
docker-compose --version

Buat folder docker di directory /home di dalam folder docker buat folder odoo1

sudo mkdir /home/dokcer
cd docker
sudo mkdir /odoo1
cd odoo1

Buat file docker-compose.yml untuk menjalankan Odoo

version: "2"
services:
    odoo12:
      image: odoo:12
      ports:
        - "8169:8069" # port mapping betwen host & container -> host_port:container_port
        - "8172:8072" # port mapping betwen host & container -> host_port:container_port
      tty: true # to keep container running, when docker start the container
      volumes: # volume mapping between host & container -> host_volumen:container_volume
        - ./addons:/mnt/extra-addons
        - ./etc:/etc/odoo
      restart: always  # run as a service

Buat folder addons dan etc di dalam folder odoo1

sudo mkdir etc addons
sudo chmod -R 777 etc

Buat file odoo.conf dan simpan kedalam folder etc. Pastikan db_host, db_port, db_user, db_password sudah mengarah ke postgres instance

[options]
addons_path = /mnt/extra-addons
data_dir = /etc/odoo
logfile = /etc/odoo/odoo-server.log
; admin_passwd = admin
; csv_internal_sep =
db_host = 34.87.143.81
db_port = 5432
db_user = odoo
db_password = odoo
; db_maxconn = 64
; db_name = False
; db_template = template1
; dbfilter = .*
debug_mode = True
; email_from = False
; limit_memory_hard = 2684354560
; limit_memory_soft = 2147483648
; limit_request = 8192
limit_time_cpu = 600
limit_time_real = 1200
; list_db = True
; log_db = False
; log_handler = [':INFO']
log_level = error
; logfile = None
; longpolling_port = 8072
; max_cron_threads = 2
; osv_memory_age_limit = 1.0
; osv_memory_count_limit = False
; smtp_password = False
; smtp_port = 25
; smtp_server = localhost
; smtp_ssl = False
; smtp_user = False
; workers = 0
; xmlrpc = True
; xmlrpc_interface = 
; xmlrpc_port = 8069
; xmlrpcs = True
; xmlrpcs_interface = 
; xmlrpcs_port = 8071

Kemudian deploy odoo dengan menjalankan

sudo docker-compose up

Akses dari browser ke port 8169 untuk memastikan odoo sudah berjalan dengan baik. Jika odoo sudah running dengan baik tekan CTRL + C, dan untuk menjalankan kembali bisa menggunakan perintah

sudo docker-compose restart

Untuk melihat container yang running

sudo docker ps

Untuk melihat log container odoo yang running

sudo docker logs -f --tail 20 odoo1_odoo12_1

Untuk membuat instance odoo yang kedua, ulangi step diatas, kemudian atur port mappingnya di docker-compose.yml agar tidak bentrok dengan instance odoo pertama

D. Install NFS (Odoo Instance)

Agar semua file filestore dan session di semua instance odoo yang berjalan bisa sama, kita perlu install NFS server.

Stop semua instance odoo

sudo docker-compose stop

Install NFS Server

sudo apt install nfs-kernel-server

Export directory etc pada odoo instance pertama, kita jadikan sumber data NFS

sudo chown -R nobody:nogroup /home/docker/odoo1/etc
sudo chmod 777 /home/docker/odoo1/etc

Set Client yang di izinkan untuk mengakses file di NFS

sudo vi /etc/exports
/home/docker/odoo1/etc  34.124.179.57/24(rw,sync,no_subtree_check)

Export NFS directory

sudo exportfs -a
sudo systemctl restart nfs-kernel-server

Instal NFS Common

sudo apt install nfs-common

Mount NFS Share ke instance odoo2 dan seterusnya

sudo mount 34.124.179.57:/home/docker/odoo1/etc  /home/docker/odoo2/etc

Cek dengan membuat file/folder baru di /home/docker/odoo1/etc, jika berhasil maka file tersebut akan ada juga di /home/docker/odoo2/etc

Untuk unmount directory bisa menggunakan

sudo unmount -f -l /home/docker/odoo2/etc

Jalankan masing-masing odoo instance

Jika saat odoo sudah running, tapi blank kita perlu clear web assetnya terlebih dahulu. Masuk ke database, lalu jalankan perintah berikut

DELETE FROM ir_attachment WHERE url LIKE '/web/content/%';

restart Odoo

E. Install Nginx Odoo Load Balancer

sudo apt update
sudo apt-get install nginx
cd /etc/nginx/sites-available/
vi odoo

Untuk setting nginxnya seperti berikut

##Odoo Backend##

upstream odooerp {
    server 34.124.179.57:8169;
    server 34.124.179.57:8269;
}
upstream odooerp-im {
    server 34.124.179.57:8172;
    server 34.124.179.57:8272;
}

server {
    listen      80 default_server;
    server_name 34.124.251.112;
    root        /usr/share/nginx/html;
    index       index.html index.htm;

    # log files
    access_log  /var/log/nginx/odoo.access.log;
    error_log   /var/log/nginx/odoo.error.log;

    # proxy buffers
    proxy_buffers 16 64k;
    proxy_buffer_size 128k;

    # timeouts
    proxy_read_timeout 720s;
    proxy_connect_timeout 720s;
    proxy_send_timeout 720s;
    
    ## odoo proxypass with https ##
    location / {
        proxy_pass  http://odooerp;
        # force timeouts if the backend dies
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_redirect off;

        # set headers
        proxy_set_header    Host            $host;
        proxy_set_header    X-Real-IP       $remote_addr;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header    X-Forwarded-Proto https;
    }
    
    location /longpolling/ {
        proxy_pass  http://odooerp-im;
        
        # force timeouts if the backend dies
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_redirect off;
        
        # set headers
        proxy_set_header    Host            $host;
        proxy_set_header    X-Real-IP       $remote_addr;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header    X-Forwarded-Proto https;
    }    


    # cache some static data in memory for 60mins
    location ~* /web/static/ {
        proxy_cache_valid 200 60m;
        proxy_buffering on;
        expires 864000;
        proxy_pass http://odooerp;
    }
    # gzip    
    gzip_types text/css text/less text/plain text/xml application/xml application/json application/javascript;
    gzip on;
}

Enable konfigurasi nginx

sudo ln -s /etc/nginx/sites-available/odoo /etc/nginx/sites-enabled/odoo
sudo nginx -t
sudo systemctl restart nginx

F. Install PgBouncer untuk Connection Pooling

sudo apt update
sudo apt install pgbouncer

Edit pgbouncer configuration file /etc/pgbouncer/pgbouncer.ini

[databases]
* = host=34.87.143.81 port=5432

[pgbouncer]
auth_type = md5
auth_file = /etc/pgbouncer/userlist.txt
logfile = /var/log/postgresql/pgbouncer.log
pidfile = /var/run/postgresql/pgbouncer.pid
listen_addr = *
listen_port = 6432
unix_socket_dir = /var/run/pgbouncer
auth_query = SELECT usename, passwd FROM pg_shadow WHERE usename=$1
pool_mode = transaction
server_reset_query = DISCARD ALL
max_client_conn = 400
default_pool_size = 80
min_pool_size = 20
reserve_pool_size = 20

jika lebih besar dari 1000 maka perlu setting max open file untuk merubah max openfile bisa tambahkan ulimit -n 10000 di dalam daemon service pgbouncer /etc/init.d/pgbouncer

sudo vi /etc/init.d/pgbouncer
sisipkan ulimit -n 10000 pada bagian saat pgbouncer start

jalankan query dibawah di postgres server

COPY ( SELECT '"' || rolname || '" "' ||  CASE WHEN
rolpassword IS null THEN '' ELSE rolpassword END || '"'
FROM pg_authid ) TO '/etc/pgbouncer/userlist.txt';

copy file hasil generate di postgres ke /etc/pgbouncer/userlist.txt

kemudian restart pgbouncer

sudo systemctl restart pgbouncer

Selanjutnya kita ganti port dan host database di odoo.conf arahkan ke port dan host pgbouncer. Kemudian restart odoo

G. Postgresql Tunning dan Tunning Kernel Server

Untuk setting konfigurasi postgresql kita bisa cek di

https://pgtune.leopard.in.ua/

Untuk detail konfigurasi

shared_buffers = 25% RAM
effective_cache_size = 75% RAM
max_worker_processes = Max jumlah CPU
max_connections = jumlah default pool pgbouncer + jumlah reserver pool pgbouncer

Kemudian untuk tunning kernel database

Check Huge Page

cat /proc/meminfo | grep -i huge

Buat satu buah file untuk melihat berapa jumlah hugepage yang dibutuhkan

vi check-huge
#!/bin/bash
# sesuaikan dengan lokasi folder PG masing-masing
PGDATA=/var/lib/postgresql/12/main
pid=`head -1 $PGDATA/postmaster.pid`
echo "Pid:            $pid"
peak=`grep ^VmPeak /proc/$pid/status | awk '{ print $2 }'`
echo "VmPeak:            $peak kB"
hps=`grep ^Hugepagesize /proc/meminfo | awk '{ print $2 }'`
echo "Hugepagesize:   $hps kB"
hp=$((peak/hps))
echo Set Huge Pages:     $hp
chmod +x check-huge
./check-huge

Set nilai hugepages yg didapat, kemudian restart server

sudo sysctl -w vm.nr_hugepages=nilai_hugepage
sudo reboot

set huge_pages = on di postgresql.conf

set huge_pages = on

Jika sudah tidak ada masalah, kita set nilai hugepage pada /etc/sysctl.conf

vm.nr_hugepages = nilai_hugepage
vm.swappiness = 1
vm.overcommit_memory = 2
vm.overcommit_ratio = 25
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10

lalu restart server

sudo reboot
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment