| 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 |
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
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
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
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
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
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