Lewati ke isi

Panduan Instalasi Odoo 10

Proses instalasi Odoo akan lebih banyak difokuskan dengan menggunakan metode paket instalasi untuk distro berbasis debian (.deb). Seperti yang dijelaskan pada laman instalasi Packaged installer, metode ini dipilih karena kemudahan dalam proses pembaruan, dan juga penggunaan dalam jangka waktu yang lama.

Proses instalasi Debian 8 (Jessie)

Kenapa Debian Jessie

Stabil, bla, bla, bla,…

Memulai server pertama kali

Setelah VPS dibuat, dan kita memiliki akses ke server jalankan perintah-perintah di bawah sercara berurutan. Rangkaian perintah ini dapat dikumpulkan dan dijadikan satu skrip bash yang dapat disimpan lalu dieksekusi dengan sudo bash postServerSetup.sh untuk menyederhanakan

Paket .deb

Versi yang digunakan adalah Community atau dalam dunia Open source sering kali disebut dengan Community Edition (CE)

#!/bin/bash
# instalasi
# jalankan perintah di bawah sebagai pengguna root `sudo su`
sudo -i
cd /tmp
wget -O - https://nightly.odoo.com/odoo.key | apt-key add -
echo "deb http://nightly.odoo.com/10.0/nightly/deb/ ./" >> /etc/apt/sources.list.d/odoo.list
apt update && apt install odoo npm

## menautkan nodejs ke node, agar dapat menjalankan dengan perintah node
ln -s /usr/bin/nodejs /usr/bin/node
## instalasi less via npm
npm install -g less less-plugin-clean-css

# membuka aplikasi odoo melalui peramban
ufw allow 8069
# setelah instalasi selesai silakan kunjungi domain atau alamat ip dengan port 8069 http://odoo2.proxsis.com

exit

#
sudo su - postgres -c "createuser -s odoo"

# memberikan akses bagi pengguna odoo agar dapat menjalankan perintah sudo
#sudo su
#echo 'odoo ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/odoo
#echo 'postgres ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/postgres
#exit

#--------------------------------------------------
# Install Wkhtmltopdf if needed
#--------------------------------------------------
# wkhtmltopdf
#wget -O- http://download.gna.org/wkhtmltopdf/0.12/0.12.3/wkhtmltox-0.12.3_linux-generic-amd64.tar.xz
wget https://nightly.odoo.com/extra/wkhtmltox-0.12.1.2_linux-jessie-amd64.deb
sudo apt update && sudo apt install gdebi unzip -y
sudo gdebi --n wkhtmltox-0.12.1.2_linux-jessie-amd64.deb
sudo ln -s /usr/local/bin/wkhtmltopdf /usr/bin
sudo ln -s /usr/local/bin/wkhtmltoimage /usr/bin

# lokasi berkas konfigurasi /etc/odoo/odoo.conf
# perintah restart layanan odoo
sudo service odoo restart
sudo service odoo status

Setelah proses instalasi selesai, secara otomatis ini akan membuat pengguna odoo dan postgres. Untuk mengakses masing-masing pengguna tersebut, jalankan perintah sudo su - odoo -s /bin/bash, ganti odoo dengan postgres untuk masuk dengan penggunan postgres

Lokasi odoo dan postgresql

/usr/lib/python2.7/dist-packages/odoo
/etc/odoo/odoo.conf #config
/usr/bin/odoo
/etc/postgresql/9.5/main #config
/var/lib/postgresql/9.5/main #data
/var/run/postgresql #socket

/etc/postgresql-common/createcluster.conf
/etc/logrotate.d/postgresql-common

# direktori data
/var/lib/odoo
/var/lib/postgresql

odoo.conf

[options]
; This is the password that allows database operations:

Kode sumber .git

#!/bin/bash
# klon dari sumber
adduser --system --home=/opt/odoo --group odoo
echo 'odoo ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/odoo
sudo su - odoo -s /bin/bash
git clone https://github.com/odoo/odoo --depth 1 --branch 10.0 --single-branch /opt/odoo/odoo-server
exit

# python
## memeriksa versi python yang ada, disarankan lebih dari 2.7.9. Versi 3.x tidak disarankan
python --version

#--------------------------------------------------
# postgresql
#--------------------------------------------------
apt install postgresql -y
# membuat pengguna odoo
#sudo su - odoo -s /bin/bash
#sudo su - postgres -c "createuser -s $USER"
sudo su - postgres -c "createuser --createdb --username $USER --no-createrole --no-superuser --pwprompt $USER"
# password=Proxsis@odoo
#createuser --createdb --username postgres --no-createrole --no-superuser --pwprompt odoo
exit

#--------------------------------------------------
# dependencies
#--------------------------------------------------
sudo apt install -y \
    python-dev \
    postgresql-contrib \
    postgresql-server-dev-9.4 \
    libxml2-dev \
    libxslt1-dev \
    libevent-dev \
    libsasl2-dev \
    libldap2-dev

#--------------------------------------------------
# pip
#--------------------------------------------------
sudo apt install python-pip -y
sudo easy_install pip
# pip install -r /opt/odoo/odoo-server/requirements.txt
pip install -r /usr/lib/python2.7/dist-packages/odoo-10.0_20170508.egg-info/requires.txt
pip install psycogreen

#--------------------------------------------------
# npm
#--------------------------------------------------
## menautkan nodejs ke node, agar dapat menjalankan perintah dengan node
apt install nodejs npm -y
ln -s /usr/bin/nodejs /usr/bin/node
npm install -g less less-plugin-clean-css

#--------------------------------------------------
# wkhtmltopdf
#--------------------------------------------------
wget https://nightly.odoo.com/extra/wkhtmltox-0.12.1.2_linux-jessie-amd64.deb
dpkg -i wkhtmltox-0.12.1.2_linux-jessie-amd64.deb
apt install -f -y
dpkg -i wkhtmltox-0.12.1.2_linux-jessie-amd64.deb
cp /usr/local/bin/wkhtmltopdf /usr/bin
ln -s /usr/local/bin/wkhtmltopdf /usr/bin
ln -s /usr/local/bin/wkhtmltoimage /usr/bin

Nginx frontend

Langkah ini untuk mengarahkan permintaan port 8069 ke port standar http (80) atau https (443).

sudo su

# GnuPG key
# dotdeb.org - nginx, php, redis, apache, mysql, zabbix
cd /tmp
wget https://dotdeb.org/dotdeb.gpg
apt-key add dotdeb.gpg
# repositori nginx 1.10.x
echo "deb https://packages.dotdeb.org/ jessie all" > /etc/apt/sources.list.d/nginx.list

# Repositori nginx
# apt install apt-transport-https lsb-release ca-certificates
# wget https://nginx.org/keys/nginx_signing.key
# apt-key add nginx_signing.key
# echo "deb https://nginx.org/packages/mainline/debian/ $(lsb_release -sc) nginx" > /etc/apt/sources.list.d/nginx.list
exit

## Install Nginx
sudo apt update && sudo apt install nginx -y
sudo /etc/init.d/nginx status
sudo ln -s /usr/sbin/nginx /usr/bin
nginx -v # menguji versi yang digunakan
sudo nginx -t # menguji konfigurasi nginx

Pengaturan Nginx dan FastCGI

nginx.conf

Buka berkas konfigurasi Nginx

sudo chown -Rv root:deploy /etc/nginx
sudo chmod -Rv g+w /etc/nginx
sudo mv /etc/nginx/nginx.conf{,.orig}
sudo nano /etc/nginx/nginx.conf

# masuk sebagai root
# menyunting berkas konfigurasi bawaan nginx
cd /etc/nginx/sites-available
sudo nano wow.proxsis.com.conf
# nano /etc/nginx/sites-available/odoo2-dev.proxsis.com
# lihat rujukan pada http://www.odoo.com/documentation/10.0/setup/deploy.html#id7

# membuat berkas log
touch /var/log/nginx/odoo2.access.log
touch /var/log/nginx/odoo2.error.log

#
sudo chmod g+w wow.proxsis.com.conf
sudo chown root:deploy wow.proxsis.com.conf

# aktifkan blok server dengan membuat tautan simbolik
sudo ln -s /etc/nginx/sites-available/wow.proxsis.com.conf /etc/nginx/sites-enabled/wow.proxsis.com

#
sudo nginx -t

Let’s Encrypt

#
echo 'deb http://ftp.debian.org/debian jessie-backports main' | sudo tee /etc/apt/sources.list.d/backports.list
#
sudo apt update
#
sudo apt-get install certbot -t jessie-backports
#
#
sudo nano /etc/nginx/sites-available/wow.proxsis.com.conf
#
    location ~ /.well-known {
        allow all;
    }
#
#
sudo /etc/init.d/nginx restart
#
sudo certbot certonly --agree-tos --email [email protected] --webroot --webroot-path=/var/www/html -d wow.proxsis.com -d www.wow.proxsis.com

#
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

# auto renew with crontab
sudo crontab -e
# tambahkan
15 3 * * * /usr/bin/certbot renew --quiet --renew-hook "/bin/systemctl reload nginx"
#
0 0 15 * * /usr/bin/certbot renew --no-self-upgrade --force-renewal --pre-hook "systemctl stop nginx" --post-hook "systemctl restart nginx && systemctl restart odoo"
#
sudo /etc/init.d/cron reload

# menguji jika konfigurasi memiliki kesalahan
sudo nginx -t
# jika sudah tidak ada
sudo /etc/init.d/nginx restart

Migrasi direktori filestore

# variable
dumpDB="sales-dev"
restoreDB="wow"
filestoreDir="/var/lib/odoo/.local/share/Odoo/filestore"
filestoreName="odoo-filestore"
filestoreOwner="odoo:deploy"
privateSSHKey="/home/deploy/.ssh/gcp-proxsis-odoo-deploy"
sshUser="deploy"
sshIP="130.211.240.49"
odooUser="odoo"
#
# server sumber
#
sudo ls -la $filestoreDir
sudo du -sh $filestoreDir
# sudo chown -Rv $filestoreOwner $filestoreDir
# sudo chmod -Rv g+w $filestoreDir
# compress
sudo tar czfv /tmp/$filestoreName.tar.gz $filestoreDir/$dumpDB

# server tujuan
privateSSHKey="/home/deploy/.ssh/gcp-proxsis-odoo-deploy"
sshUser="deploy"
sshIP="130.211.240.49"
filestoreDir="/var/lib/odoo/.local/share/Odoo/filestore"
filestoreName="odoo-filestore"
dumpDB="sales-dev"
restoreDB="wow"
#
scp -v -i $privateSSHKey $sshUser@$sshIP:/tmp/$filestoreName.tar.gz /tmp
#
cd /tmp
#
sudo tar xzfv $filestoreName.tar.gz
#
sudo mkdir -p $filestoreDir/$dumpDB
# Dryrun
sudo rsync -Phvrzin /tmp$filestoreDir/$dumpDB/ $filestoreDir/$restoreDB
sudo rsync -Phvrzi /tmp$filestoreDir/$dumpDB/ $filestoreDir/$restoreDB
#
sudo su
#
restoreDB="wow"
filestoreDir="/var/lib/odoo/.local/share/Odoo/filestore"
cd $filestoreDir
sudo chown -Rv odoo:odoo $filestoreDir/$restoreDB
# rsync -Phvrzi [email protected]:/var/lib/odoo/.local/share/Odoo/filestore/sales-dev /var/lib/odoo/.local/share/Odoo/filestore/sales-dev

Migrasi basis data

# server sumber
#
# variable
dumpDB="sales-dev"
privateSSHKey="~/.ssh/gcp-proxsis-odoo-deploy"
sshUser="deploy"
sshIP="130.211.240.49"
# sudo su - postgres
#
# sudo su - postgres -c "pg_dump -d $dumpDB -F c -b -v > /tmp/$dumpDB.dump"
sudo su - postgres
pwd
# pg_dump -d $dumpDB -F c -b -v > $dumpDB.dump
pg_dump -d sales-dev -F c -b -v > sales-dev.dump
exit
#
sudo mv /var/lib/postgresql/sales-dev.dump /tmp
sudo chown -v deploy:deploy sales-dev.dump
#
# server tujuan
# scp -v -i $privateSSHKey $sshUser@$sshIP:/tmp/$dumpDB.dump /tmp
scp -v -i ~/.ssh/gcp-proxsis-odoo-deploy [email protected]:/tmp/sales-dev.dump /tmp
#
# sudo su - postgres -c "createdb -T template1 $restoreDB"
sudo su - postgres -c "createdb -T template1 wow"
#
# pg_restore -C -d -v wow /tmp/sales-dev.dump
# sudo su - postgres -c "pg_restore -d $restoreDB -v /tmp/$dumpDB.dump"
sudo su - postgres -c "pg_restore -d wow -v /tmp/sales-dev.dump"
#
sudo su - postgres -c "pg_dump wow > /home/deploy/cadanganDB/`date +%Y%m%d%H%M`.wow.sql"
#
# sudo su - postgres -c "dropdb test"
#
# psql -c "ALTER DATABASE $restoreDB OWNER TO $odooUser;"
sudo su - postgres
psql -c "ALTER DATABASE wow OWNER TO odoo;"

Pencadangan basis data harian

cat << EOF > /home/deploy/odooDBBackup.sh
#
#!/bin/sh

USER="deploy"
GROUP="deploy"
# PASSWORD="sandi_pengguna"
OUTPUT="/home/deploy/cadanganDB"
# DB="sales-dev"
DATE="+%Y%m%d%H%M"

rm "$OUTPUT/$DB*gz" > /dev/null 2>&1

databases=$(psql -l | awk '{ print $1}' | grep -vE '^-|^List|^Name|postgres|template[0|1]|^\||^\(')
for db in $databases; do
    echo "Dumping database: $db"
    pg_dump $db > $OUTPUT/`date $DATE`.$db.sql
    gzip $OUTPUT/`date $DATE`.$db.sql
done

chown $USER:$GROUP $OUTPUT/*
EOF
#
chmod +x odooDBBackup.sh
#
mkdir -p /home/deploy/cadanganDB
#
crontab -e
#
00 04,12,21 * * 1-5 /bin/bash /home/deploy/odooDBBackup.sh
00 04 * * 6-7 /bin/bash /home/deploy/odooDBBackup.sh

Pencadangan direktori filestore

#
dbName="wow"
filestoreDir="/var/lib/odoo/.local/share/Odoo/filestore"
#
sudo rsync -Phvrzin $filestoreDir/$dbName ~/cadanganFilestore
sudo rsync -Phitaruvzn /var/lib/odoo/.local/share/Odoo/filestore/wow /home/deploy/filestoreSync
sudo su - odoo -c "/usr/bin/rsync -Phitaruvzen /home/deploy/filestoreSync/wow /var/lib/odoo/.local/share/Odoo/filestore/prod"
# rsync -Phitaruvzne "ssh -i $pathToPubKey" $remoteUser@$remoteIIP:$remotePathSource $localPathDestination

Penjelasan argument dari rsync:
- -P same as –partial –progress
- -h output numbers in a human-readable format
+ --progress
- -i, --itemize-changes output a change-summary for all updates
- -a, --archive archive mode; equals -rlptgoD (no -H,-A,-X)
- -r, --recursive recurse into directories
- -u, --update skip files that are newer on the receiver
- -v, --verbose increase verbosity
- -z, --compress compress file data during the transfer
- -n, --dry-run perform a trial run with no changes made
- -q, --quite suppress non-error messages
- -p, --perms preserve permissions
- -o, --owner preserve owner (super-user only)
- -g, --group preserve group
- -t, --times preserve modification times
- -e
- --delay-updates put all updated files into place at end
- --partial keep partially transferred files

Nginx IP whitelist

    location / {
        allow 111.94.171.254;
        deny all;
        resolver 8.8.8.8;
        proxy_redirect off;
        proxy_pass http://odoo;
    }

Troubleshooting

sudo apt install python-geoip python-requests python-decorator

Google Calendar Sync

Pesan kesalahan saat debug:

  • ValueError: No JSON object could be decoded
  • HTTP 400

Tindakan:

  • uninstall lalu install ulang semua produk Google Addons
  • Menghapus entri token pada Settings > Users -> Calendar -> tab Calendar

web.base.url
tz=Asia/Jakarta

location /google_calendar/sync_data/ {
    ...
}

Rujukan:

Internal Server Error setelah hapus Public User

CREATE ROLE dbmin WITH LOGIN ENCRYPTED PASSWORD '7+2m7yAd;L[CfgFM' NOCREATEDB;
GRANT ALL PRIVILEGES ON DATABASE wow TO dbmin;
ALTER ROLE deploy LOGIN ENCRYPTED PASSWORD '7+2m7yAd;L[CfgFM';

res_users id
res_company_users_rel res_company_users_rel_user_id_fkey

res_user

id (baru) login id (lama)
633 default 3
634 public 4
635 portaltemplate 6

res_company_users_rel

3,false,”default”,”“,1,4,”2016-11-04 11:34:13.670477”,false,1,1,540,”2017-05-31 05:09:46.434058”,”


“,NULL,NULL,NULL,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
4,false,”public”,NULL,1,5,”2016-11-04 11:34:13.670477”,true,1,1,NULL,”2017-05-31 05:09:46.434058”,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
6,false,”portaltemplate”,”“,1,7,”2016-11-07 02:11:04.416049”,true,1,1,NULL,”2017-05-31 05:09:46.434058”,NULL,”pbkdf2-sha51212000CAHgHGNMCSEkBABAKMV4Lw3AoFVMMx.U/SDR8n8Xum1phbhLMx2eRUsprNR0tY3qIPNvt4D2JwD3wJo1WI.dUHY6rZqvc1yJ8Ht3gAULsd3Q”,NULL,NULL,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL

633,false,”default”,”“,1,4,”2017-06-12 13:12:32.503299”,true,8,1,NULL,”2017-06-13 10:11:35.567846”,”


“,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0
634,false,”public”,NULL,1,5,”2017-06-12 13:12:32.503299”,true,1,1,NULL,”2017-06-13 15:35:50.019044”,”


“,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0
635,false,”portaltemplate”,”“,1,7,”2017-06-12 13:15:46.26928”,true,1,1,NULL,”2017-06-13 15:35:50.019044”,”


“,”pbkdf2-sha51212000WEvpfY8RohSiFGIM4VyL8QYkvT.z.d1LDL.DZUWP0wBgUbQcQVZwj.FVsEcjm.YEgVhpB4xIoixImoj7Y.cpeB.xFEG5chd8PxRB2lwcRh1A”,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0

-- isi manual
-- terkendala kehilangan FK untuk tabel lain
INSERT INTO res_users (id, active, login, password, company_id, partner_id, create_date, share, write_uid, create_uid, action_id, write_date, signature, password_crypt, alias_id, sale_team_id, target_sales_done, target_sales_won, target_sales_invoiced, karma, oauth_uid, oauth_access_token, oauth_provider_id, google_calendar_cal_id, google_calendar_token_validity, google_calendar_last_sync_date, google_calendar_token, google_calendar_rtoken) VALUES
    (3,false,'default','',1,4,'2016-11-04 11:34:13.670477',false,1,1,540,'2017-05-31 05:09:46.434058','',NULL,NULL,NULL,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
    (4,false,'public',NULL,1,5,'2016-11-04 11:34:13.670477',true,1,1,NULL,'2017-05-31 05:09:46.434058',NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
    (6,false,'portaltemplate','',1,7,'2016-11-07 02:11:04.416049',true,1,1,NULL,'2017-05-31 05:09:46.434058',NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL)

-- FK
alias_id mail_alias.id
company_id res_company.id
create_uid res_users.id
oauth_provider_id res_partner.id
partner_id res_partner.id
sale_team_id crm_team.id
write_uid res_users.id

SELECT alias_id, company_id, create_uid, oauth_provider_id, partner_id, sale_team_id, write_uid FROM res_users;

WITH res_company ()

res_users (id, active, login, password, company_id, partner_id, create_date, share, write_uid, create_uid, action_id, write_date, signature, password_crypt, alias_id, sale_team_id, target_sales_done, target_sales_won, target_sales_invoiced, oauth_uid, oauth_access_token, oauth_provider_id, google_calendar_cal_id, google_calendar_token_validity, google_calendar_last_sync_date, google_calendar_token, google_calendar_rtoken, karma) AS
( VALUES
    (3,false,'default','',1,4,'2016-11-04 11:34:13.670477',false,1,1,540,'2017-05-31 05:09:46.434058','',NULL,NULL,NULL,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
    (4,false,'public',NULL,1,5,'2016-11-04 11:34:13.670477',true,1,1,NULL,'2017-05-31 05:09:46.434058',NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
    (6,false,'portaltemplate','',1,7,'2016-11-07 02:11:04.416049',true,1,1,NULL,'2017-05-31 05:09:46.434058',NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL)
)
INSERT INTO res_company_users_rel (cid, user_id)
    SELECT res_users.id, res_company_users_rel.user_id
    FROM

INSERT INTO res_users (id, active, login, password, company_id, partner_id, create_date, share, write_uid, create_uid, action_id, write_date, signature, password_crypt, alias_id, sale_team_id, target_sales_done, target_sales_won, target_sales_invoiced, oauth_uid, oauth_access_token, oauth_provider_id, google_calendar_cal_id, google_calendar_token_validity, google_calendar_last_sync_date, google_calendar_token, google_calendar_rtoken, karma) VALUES (634,NULL,'public',NULL,1,5,'2017-06-12 13:12:32.503299',true,1,1,NULL,'2017-06-13 15:35:50.019044','<p><br></p>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);
-- INSERT INTO res_users (id, active, login, password, company_id, partner_id, create_date, share, write_uid, create_uid, action_id, write_date, signature, password_crypt, alias_id, sale_team_id, target_sales_done, target_sales_won, target_sales_invoiced, oauth_uid, oauth_access_token, oauth_provider_id, google_calendar_cal_id, google_calendar_token_validity, google_calendar_last_sync_date, google_calendar_token, google_calendar_rtoken, karma) VALUES (4,false,'public',NULL,1,5,'2017-06-12 13:12:32.503299',true,1,1,NULL,'2017-06-13 15:35:50.019044','<p><br></p>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);

SELECT * FROM res_users WHERE user_id=4;
UPDATE res_users SET id=4 WHERE id=634;
UPDATE res_company_users_rel SET user_id=4 WHERE user_id=634;

TODO

  1. Logrotate
  2. DB backup
  3. Filestore backup
  4. SSL renewal
  5. outgoing email
  6. DKIM
  7. Google Calendar Sync