-
-
Save dalareo/cc3032c4c9904e7efa7a702b35d16268 to your computer and use it in GitHub Desktop.
install odoo from source
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
################################################################################################ | |
# Fully automated script to install Odoo and Odoo SaaS Tool (tested on a fresh Ubuntu 14.04 LTS) | |
# * Install & configure last stable version of nginx | |
# * Install & configure last stable version of postgresql | |
# * Install & configure Odoo | |
# * Configure automated backup of Odoo databases | |
# * Optional: Install & configure Odoo SaaS Tool | |
# * Optional: Background installation: $ nohup ./odoo_install.sh > nohup.log 2>&1 </dev/null & | |
################################################################################################ | |
#### GENERAL SETTINGS : Edit the following settings as needed | |
## Gist url | |
export GIST="dalareo/cc3032c4c9904e7efa7a702b35d16268" #update if you've forked this gist | |
export EMAIL_SERVER=stmp.example.com | |
export [email protected] | |
export EMAIL_PASS=GiveMeYourPassBaby | |
## PostgreSQL | |
export DB_PASS=`< /dev/urandom tr -dc A-Za-z0-9 | head -c${1:-32};echo;` | |
## Odoo | |
export ODOO_DOMAIN=odoo.example.com | |
export ODOO_DATABASE=odoo.example.com | |
export ODOO_USER=odoo | |
export ODOO_BRANCH=8.0 | |
export ODOO_PASS=`< /dev/urandom tr -dc A-Za-z0-9 | head -c${1:-12};echo;` | |
## SSL | |
export SSL_CERT=/etc/ssl/certs/XXXX.crt | |
export SSL_KEY=/etc/ssl/private/XXXX.key | |
## DB Backup | |
export DB_BACKUP="yes" #set "no" if you do want to configure backup | |
## Odoo SaaS Tool | |
export ODOO_SAAS_TOOL="yes" #set "no" if you do want odoo saas tool | |
export SAAS_SERVER=server-1 | |
export SAAS_TEMPLATE=template-1 | |
## Add your private Git | |
export USE_PRIVATE_GIT="no" #Set to "yes", if you want to clone a private Git | |
export PRIVATE_GIT_REMOTE="https://MY_USER_NAME:[email protected]/MY_REMOTE_USER/MY_REMOTE_REPOSITORY.git" #remote adress of your private Git | |
export PRIVATE_GIT_LOCAL="/usr/local/src/odoo-addons/MY_LOCAL_ADDON_FOLDER" #local folder of your private Git | |
#### Detect type of system manager | |
export SYSTEM='' | |
pidof systemd && export SYSTEM='systemd' | |
[[ -z $SYSTEM ]] && whereis upstart | grep -q 'upstart: /' && export SYSTEM='upstart' | |
[[ -z $SYSTEM ]] && export SYSTEM='supervisor' | |
echo "SYSTEM=$SYSTEM" | |
#### CHECK AND UPDATE LANGUAGE | |
env | grep LANG | |
export LANGUAGE=en_US:en && \ | |
export LANG=en_US.UTF-8 && \ | |
export LC_ALL=en_US.UTF-8 && \ | |
locale-gen en_US.UTF-8 && \ | |
dpkg-reconfigure locales | |
locale | |
#### DOWNLOADS... | |
### Packages | |
apt-get update && \ | |
apt-get upgrade -y && \ | |
apt-get install -y git python-pip moreutils tree python-dev && \ | |
apt-get install -y emacs23-nox || apt-get install -y emacs24-nox | |
[[ "$SYSTEM" == "supervisor" ]] && apt-get install supervisor | |
### PostgreSQL | |
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - | |
echo 'deb http://apt.postgresql.org/pub/repos/apt/ trusty-pgdg main' >> /etc/apt/sources.list.d/pgdg.list &&\ | |
apt-get update &&\ | |
apt-get install postgresql postgresql-contrib -y && \ | |
echo "postgresql installed" | |
### Python | |
pip install psycogreen &&\ | |
pip install rotate-backups &&\ | |
pip install oauthlib &&\ | |
pip install requests --upgrade | |
### Deps for OCA website | |
pip install ipwhois | |
### Deps for OCA Server tools | |
apt-get install python-ldap && | |
pip install unidecode &&\ | |
pip install unidecode --upgrade | |
### Deps for addons-vauxoo | |
### pip install pandas | |
### Deps for Odoo Saas Tool | |
pip install Boto | |
pip install FileChunkIO | |
pip install pysftp | |
### Odoo Souce Code | |
# If you change the following directories, you muss also ajust line 2 of file odoo-server.conf below | |
cd /usr/local/src/ &&\ | |
git clone -b ${ODOO_BRANCH} https://github.com/odoo/odoo.git &&\ | |
mkdir /usr/local/src/odoo-addons -p && cd /usr/local/src/odoo-addons/ &&\ | |
git clone -b ${ODOO_BRANCH} https://github.com/OCA/web.git OCA/web/ &&\ | |
git clone -b ${ODOO_BRANCH} https://github.com/OCA/website.git OCA/website/ &&\ | |
git clone -b ${ODOO_BRANCH} https://github.com/OCA/account-financial-reporting.git OCA/account-financial-reporting/ &&\ | |
git clone -b ${ODOO_BRANCH} https://github.com/OCA/account-financial-tools.git OCA/account-financial-tools/ &&\ | |
git clone -b ${ODOO_BRANCH} https://github.com/OCA/partner-contact.git OCA/partner-contact/ &&\ | |
git clone -b ${ODOO_BRANCH} https://github.com/OCA/hr.git OCA/hr/ &&\ | |
git clone -b ${ODOO_BRANCH} https://github.com/OCA/pos.git OCA/pos/ &&\ | |
git clone -b ${ODOO_BRANCH} https://github.com/OCA/commission.git OCA/commission/ &&\ | |
git clone -b ${ODOO_BRANCH} https://github.com/OCA/server-tools.git OCA/server-tools/ &&\ | |
git clone -b ${ODOO_BRANCH} https://github.com/OCA/reporting-engine.git OCA/reporting-engine/ &&\ | |
git clone -b ${ODOO_BRANCH} https://github.com/OCA/rma.git OCA/rma/ &&\ | |
git clone -b ${ODOO_BRANCH} https://github.com/OCA/project.git OCA/project/ &&\ | |
git clone -b ${ODOO_BRANCH} https://github.com/OCA/contract.git OCA/contract/ &&\ | |
git clone -b ${ODOO_BRANCH} https://github.com/OCA/sale-workflow.git OCA/sale-workflow/ &&\ | |
git clone -b ${ODOO_BRANCH} https://github.com/OCA/sale-workflow.git OCA/purchase-workflow/ &&\ | |
git clone -b ${ODOO_BRANCH} https://github.com/OCA/bank-payment.git OCA/bank-payment/ &&\ | |
git clone -b ${ODOO_BRANCH} https://github.com/OCA/bank-statement-import.git OCA/bank-statement-import/ &&\ | |
git clone -b ${ODOO_BRANCH} https://github.com/OCA/bank-statement-reconcile.git OCA/bank-statement-reconcile/ &&\ | |
git clone -b ${ODOO_BRANCH} https://github.com/yelizariev/pos-addons.git yelizariev/pos-addons/ &&\ | |
git clone -b ${ODOO_BRANCH} https://github.com/yelizariev/access-addons.git yelizariev/access-addons/ &&\ | |
git clone -b ${ODOO_BRANCH} https://github.com/yelizariev/website-addons.git yelizariev/website-addons/ &&\ | |
git clone -b ${ODOO_BRANCH} https://github.com/yelizariev/addons-yelizariev.git yelizariev/addons-yelizariev/ &&\ | |
git clone -b ${ODOO_BRANCH} https://github.com/yelizariev/odoo-saas-tools.git yelizariev/odoo-saas-tools/ &&\ | |
git clone -b ${ODOO_BRANCH} https://github.com/iledarn/e-commerce.git iledarn/e-commerce/ &&\ | |
git clone -b ${ODOO_BRANCH} https://github.com/xpansa/hr.git xpansa/hr/ &&\ | |
git clone -b ${ODOO_BRANCH} https://github.com/odoomrp/odoomrp-wip.git odoomrp/odoomrp-wip/ &&\ | |
git clone -b ${ODOO_BRANCH} https://github.com/odoomrp/odoomrp-utils.git odoomrp/odoomrp-utils/ &&\ | |
git clone -b ${ODOO_BRANCH} https://github.com/Vauxoo/addons-vauxoo.git vauxoo/ &&\ | |
git clone -b ${ODOO_BRANCH} https://github.com/techreceptives/website_recaptcha.git techreceptives/ | |
if [[ "$USE_PRIVATE_GIT" == "yes" ]] ###################################### IF | |
then | |
git clone -b ${ODOO_BRANCH} ${PRIVATE_GIT_REMOTE} ${PRIVATE_GIT_LOCAL}/ | |
export COMMA="," | |
export PRIVATE_GIT_LOCAL="$PRIVATE_GIT_LOCAL$COMMA" | |
else ###################################### ELSE | |
export PRIVATE_GIT_LOCAL="" | |
fi ###################################### END IF | |
# further module collections | |
mkdir -p z-others &&\ | |
mkdir -p z-others-p | |
### Odoo Deps | |
## python | |
python --version # should be 2.7 or higher | |
cd /usr/local/src/odoo &&\ | |
cp odoo.py odoo.py.orig &&\ | |
sed -i "s/'apt-get'/'apt-get', '-y'/" odoo.py &&\ | |
cat odoo.py | python &&\ | |
git checkout odoo.py | |
echo "odoo.py checked out" | |
## wkhtmltopdf | |
cd /usr/local/src | |
lsb_release -a | |
uname -i | |
# check version of your OS and download appropriate package | |
# http://wkhtmltopdf.org/downloads.html | |
apt-get install -y xfonts-base xfonts-75dpi | |
apt-get -f install | |
wget http://download.gna.org/wkhtmltopdf/0.12/0.12.2.1/wkhtmltox-0.12.2.1_linux-trusty-amd64.deb | |
dpkg -i wkhtmltox-*.deb | |
## Less CSS via nodejs | |
## nodejs: | |
# for 14.04+ | |
apt-get install -y npm | |
ln -s /usr/bin/nodejs /usr/bin/node | |
# for 13.10- | |
# check https://www.odoo.com/documentation/8.0/setup/install.html | |
## less css | |
npm install -g less less-plugin-clean-css | |
#### ...DOWNLOADS done. | |
#### Changes on Odoo Code | |
cd /usr/local/src/odoo | |
## delete matches="..." at /web/database/manager | |
sed -i 's/matches="[^"]*"//g' addons/web/static/src/xml/base.xml | |
## disable im_odoo_support | |
sed -i "s/'auto_install': True/'auto_install': False/" addons/im_odoo_support/__openerp__.py | |
#### CONFIGS | |
### System Config | |
#from http://stackoverflow.com/questions/2914220/bash-templating-how-to-build-configuration-files-from-templates-with-bash | |
export PERL_UPDATE_ENV="perl -p -e 's/\{\{([^}]+)\}\}/defined \$ENV{\$1} ? \$ENV{\$1} : \$&/eg' " | |
[[ -z $SYSTEM ]] && echo "Don't forget to define SYSTEM variable" | |
### Odoo System User | |
adduser --system --quiet --shell=/bin/bash --home=/opt/${ODOO_USER} --gecos '$OE_USER' --group ${ODOO_USER} | |
### Odoo DB User | |
sudo su - postgres bash -c "psql -c \"CREATE USER ${ODOO_USER} WITH CREATEDB PASSWORD '${DB_PASS}';\"" | |
### Odoo Config | |
echo "Odoo Config" | |
## /var/log/odoo/ | |
mkdir -p /var/log/odoo/ | |
chown ${ODOO_USER}:${ODOO_USER} /var/log/odoo | |
## /temp import data | |
mkdir -p /opt/${ODOO_USER}/.local/share/User/import/ | |
chown -R ${ODOO_USER}:${ODOO_USER} /opt/${ODOO_USER}/.local | |
## /etc/odoo/odoo-server.conf | |
mkdir -p /etc/odoo && cd /etc/odoo/ | |
wget -q https://gist.githubusercontent.com/${GIST}/raw/odoo-server.conf -O odoo-server.conf | |
eval "${PERL_UPDATE_ENV} < odoo-server.conf" | sponge odoo-server.conf | |
chown ${ODOO_USER}:${ODOO_USER} odoo-server.conf | |
chmod 600 odoo-server.conf | |
#### NGINX | |
#/etc/init.d/apache2 stop | |
#apt-get remove apache2 -y && \ | |
wget --quiet -O - http://nginx.org/keys/nginx_signing.key | apt-key add - &&\ | |
echo 'deb http://nginx.org/packages/ubuntu/ trusty nginx' >> /etc/apt/sources.list.d/nginx.list &&\ | |
echo 'deb-src http://nginx.org/packages/ubuntu/ trusty nginx' >> /etc/apt/sources.list.d/nginx.list &&\ | |
apt-get update &&\ | |
apt-get install nginx -y && \ | |
echo "nginx installed" | |
cd /etc/nginx && \ | |
mv nginx.conf nginx.conf.orig &&\ | |
wget -q https://gist.githubusercontent.com/${GIST}/raw/nginx.conf -O nginx.conf | |
cd /etc/nginx && \ | |
wget -q https://gist.githubusercontent.com/${GIST}/raw/nginx_odoo_params -O odoo_params && \ | |
eval "${PERL_UPDATE_ENV} < odoo_params" | sponge odoo_params | |
cd /etc/nginx && \ | |
wget -q https://gist.githubusercontent.com/${GIST}/raw/nginx_odoo_proxy_pass -O odoo_proxy_pass && \ | |
eval "${PERL_UPDATE_ENV} < odoo_proxy_pass" | sponge odoo_proxy_pass | |
mkdir /etc/nginx/sites-available/ -p && \ | |
cd /etc/nginx/sites-available/ && \ | |
wget -q https://gist.githubusercontent.com/${GIST}/raw/nginx_odoo.conf -O odoo.conf && \ | |
eval "${PERL_UPDATE_ENV} < odoo.conf" | sponge odoo.conf | |
mkdir /etc/nginx/sites-enabled/ -p && \ | |
cd /etc/nginx/sites-enabled/ && \ | |
ln -s ../sites-available/odoo.conf odoo.conf | |
#cd /etc/nginx/ && \ | |
cp -r /etc/nginx/conf.d/ /etc/nginx/conf.d.orig/ | |
rm /etc/nginx/conf.d/default.conf && \ | |
rm /etc/nginx/conf.d/example_ssl.conf | |
/etc/init.d/nginx restart | |
#### START CONTROL | |
### CONTROL SCRIPTS - systemd | |
if [[ "$SYSTEM" == "systemd" ]] ###################################### IF | |
then | |
cd /lib/systemd/system/ | |
wget -q https://gist.githubusercontent.com/${GIST}/raw/odoo.service -O odoo.service | |
eval "${PERL_UPDATE_ENV} < odoo.service" | sponge odoo.service | |
## START - systemd | |
systemctl enable odoo.service | |
systemctl restart odoo.service | |
### CONTROL SCRIPTS - upstart | |
elif [[ "$SYSTEM" == "upstart" ]] #################################### ELIF | |
then | |
cd /etc/init/ | |
wget -q https://gist.githubusercontent.com/${GIST}/raw/odoo-init.conf -O odoo.conf | |
eval "${PERL_UPDATE_ENV} < odoo.conf" | sponge odoo.conf | |
## START - upstart | |
start odoo # alt: stop odoo / restart odoo | |
### CONTROL SCRIPTS - supervisor | |
else #################################### ELSE | |
cd /etc/supervisor/conf.d/ | |
wget -q https://gist.githubusercontent.com/${GIST}/raw/odoo-supervisor.conf -O odoo.conf | |
eval "${PERL_UPDATE_ENV} < odoo.conf" | sponge odoo.conf | |
## START - supervisor | |
supervisorctl reread | |
supervisorctl update | |
supervisorctl restart odoo | |
fi ################################ END IF | |
echo "Do not forget to set server parameter report.url = 0.0.0.0:8069" | |
### CONTROL SCRIPTS - /etc/init.d/* | |
# Such scripts are not recommended, because you will not get supervision features. | |
# Use this link to find ones: https://gist.github.com/yelizariev/2abdd91d00dddc4e4fa4/d0ac3bd971e81213d17332647d9a74a580cfde6b | |
#### ODOO DB BACKUP | |
if [[ "$DB_BACKUP" == "yes" ]] ###################################### IF | |
then | |
mkdir -p /opt/${ODOO_USER}/backups/ | |
chown ${ODOO_USER}:${ODOO_USER} /opt/${ODOO_USER}/backups/ | |
cd /usr/local/bin/ | |
wget -q https://gist.githubusercontent.com/${GIST}/raw/odoo-backup.py -O odoo-backup.py | |
chmod +x odoo-backup.py | |
echo "### check url for undestanding time parameters: https://github.com/xolox/python-rotate-backups" >> /etc/crontab | |
echo -e "#6 6\t* * *\t${ODOO_USER} odoo-backup.py -d ${ODOO_DATABASE} -p /opt/${ODOO_USER}/backups/ --no-save-filestore --daily 8 --weekly 0 --monthly 0 --yearly 0" >> /etc/crontab | |
echo -e "#4 4\t* * 7\t${ODOO_USER} odoo-backup.py -d ${ODOO_DATABASE} -p /opt/${ODOO_USER}/backups/" >> /etc/crontab | |
## to test run: | |
# sudo su - ${ODOO_USER} -s /bin/bash -c "odoo-backup.py -d ${ODOO_DATABASE} -p /opt/${ODOO_USER}/backups/" | |
# e.g. | |
# cd /usr/local/bin/ && sudo su - odoo -s /bin/bash -c "odoo-backup.py -d ergodoo.com -p /opt/odoo/backups/" | |
fi ################################## END IF | |
#### Odoo Saas Tool | |
if [[ "$ODOO_SAAS_TOOL" == "yes" ]] ###################################### IF | |
then | |
#emacs /etc/odoo/odoo-server.conf # change dbfilter to ^%h$ if needed | |
echo $ODOO_PASS | |
echo $ODOO_DOMAIN | |
stop odoo | |
sudo su - ${ODOO_USER} -s /bin/bash -c "python /usr/local/src/odoo-addons/yelizariev/odoo-saas-tools/saas.py \ | |
--odoo-script=/usr/local/src/odoo/openerp-server \ | |
--odoo-config=/etc/odoo/odoo-server.conf \ | |
--portal-create --server-create --plan-create --run \ | |
--admin-password=${ODOO_PASS} \ | |
--portal-db-name=${ODOO_DOMAIN} \ | |
--server-db-name=${SAAS_SERVER}.${ODOO_DOMAIN} \ | |
--plan-template-db-name=${SAAS_TEMPLATE}.${ODOO_DOMAIN} \ | |
--plan-clients=demo-%i.${ODOO_DOMAIN}" | |
fi ################################## END IF | |
#### DEBUG | |
## show settings (admin password, addons path) | |
head /etc/odoo/odoo-server.conf | |
## show odoo version | |
grep '^version_info ' /usr/local/src/odoo/openerp/release.py | |
## Reminders | |
echo "Do not forget PGTune: http://pgtune.leopard.in.ua/" | |
## log | |
tail -f -n 100 /var/log/odoo/odoo-server.log | |
## start from console (for ODOO_USER=odoo): | |
# sudo su - odoo -s /bin/bash -c "/usr/local/src/odoo/openerp-server -c /etc/odoo/odoo-server.conf" | |
## psql (use name of your database) | |
# sudo -u odoo psql DATABASE | |
## some common issues: | |
## https://www.odoo.com/forum/help-1/question/dataerror-new-encoding-utf8-is-incompatible-with-the-encoding-of-the-template-database-sql-ascii-52124 | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
user nginx; | |
worker_processes auto; | |
error_log /var/log/nginx/error.log warn; | |
pid /var/run/nginx.pid; | |
events { | |
worker_connections 2048; | |
multi_accept on; | |
use epoll; | |
} | |
worker_rlimit_nofile 40000; | |
http { | |
include /etc/nginx/mime.types; | |
default_type application/octet-stream; | |
### Basic Settings | |
sendfile on; | |
tcp_nopush on; | |
tcp_nodelay on; | |
types_hash_max_size 2048; | |
#server_tokens off; | |
#server_names_hash_bucket_size 64; | |
#server_name_in_redirect off; | |
proxy_headers_hash_max_size 1024; | |
proxy_headers_hash_bucket_size 128; | |
### Timeout Settings | |
keepalive_timeout 90; | |
proxy_connect_timeout 1800; | |
proxy_send_timeout 1800; | |
proxy_read_timeout 1800; | |
#client_header_timeout 600; | |
#client_body_timeout 600; | |
send_timeout 1800; | |
### SSL Cache Settings | |
ssl_session_cache shared:SSL:30m; | |
ssl_session_timeout 60m; | |
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2; | |
ssl_ciphers HIGH:!aNULL:!MD5; | |
ssl_prefer_server_ciphers on; | |
### File Cache Settings | |
open_file_cache max=10000 inactive=15m; | |
open_file_cache_valid 30m; | |
open_file_cache_min_uses 1; | |
open_file_cache_errors on; | |
### Logging Settings | |
access_log /var/log/nginx/access.log; | |
error_log /var/log/nginx/error.log; | |
### Gzip Settings | |
gzip on; | |
gzip_disable "MSIE [1-6]\."; | |
gzip_vary on; | |
gzip_proxied any; | |
gzip_comp_level 9; | |
gzip_buffers 16 8k; | |
gzip_min_length 2048; | |
gzip_http_version 1.1; | |
#gzip_types *; | |
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; | |
### Virtual Host Configs | |
include /etc/nginx/conf.d/*.conf; | |
include /etc/nginx/sites-enabled/*; | |
} | |
#mail { | |
# # See sample authentication script at: | |
# # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript | |
# | |
# # auth_http localhost/auth.php; | |
# # pop3_capabilities "TOP" "USER"; | |
# # imap_capabilities "IMAP4rev1" "UIDPLUS"; | |
# | |
# server { | |
# listen localhost:110; | |
# protocol pop3; | |
# proxy on; | |
# } | |
# | |
# server { | |
# listen localhost:143; | |
# protocol imap; | |
# proxy on; | |
# } | |
#} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
server { | |
listen 80 ; | |
## Some domains to run in http without SSL | |
server_name | |
XXXX_DOMAIN_A.net | |
XXXX_DOMAIN_B.comt | |
; | |
include odoo_params; | |
## non-ssl log files | |
access_log /var/log/nginx/odoo-access.log; | |
error_log /var/log/nginx/odoo-error.log; | |
include odoo_proxy_pass; | |
} | |
server { | |
listen 80 default_server; | |
## Other domains run in https with SSL | |
#server_name {{ODOO_DOMAIN}}; | |
return 301 https://$host$request_uri; | |
} | |
server { | |
listen 443; | |
#server_name {{ODOO_DOMAIN}}; | |
include odoo_params; | |
## ssl certificate files | |
ssl on; | |
ssl_certificate {{SSL_CERT}}; | |
ssl_certificate_key {{SSL_KEY}}; | |
## ssl log files | |
access_log /var/log/nginx/{{ODOO_USER}}-ssl-access.log; | |
error_log /var/log/nginx/{{ODOO_USER}}-ssl-error.log; | |
# Let the OpenERP web service know that we’re using HTTPS, | |
# otherwise it will generate URL using http:// and not https:// | |
proxy_set_header X-Forwarded-Proto https; | |
include odoo_proxy_pass; | |
} | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
charset utf-8; | |
location = /favicon.ico { | |
return 404; | |
} | |
## increase proxy buffer to handle some OpenERP web requests | |
proxy_buffers 16 64k; | |
proxy_buffer_size 128k; | |
## 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 $scheme; | |
#proxy_redirect http:// https://; | |
#proxy_read_timeout 600s; #set centrally in nginx.conf | |
client_max_body_size 200m; | |
#general proxy settings | |
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503; | |
# by default, do not forward anything | |
proxy_redirect off; | |
proxy_buffering off; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
location /longpolling { | |
proxy_pass http://127.0.0.1:8072; | |
} | |
location / { | |
proxy_pass http://127.0.0.1:8069; | |
} | |
# cache some static data in memory for 90mins. | |
# under heavy load this should relieve stress on the odoo web interface a bit. | |
location ~* /web/static/ { | |
proxy_cache_valid 200 90m; | |
proxy_buffering on; | |
expires 864000; | |
proxy_pass http://127.0.0.1:8069; | |
} | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
### depends on https://github.com/xolox/python-rotate-backups -- check this url for understanding rotating parameters | |
import argparse | |
import os | |
import subprocess | |
import shutil | |
import zipfile | |
import datetime | |
import tempfile | |
from contextlib import contextmanager | |
### READ INPUT | |
parser = argparse.ArgumentParser(description='Odoo backup tool.') | |
parser.add_argument('-d', '--database', dest='database', nargs='+', help='database for backup') | |
parser.add_argument('--no-save-filestore', dest='save_filestore', action='store_false', help='skip filestore to save disk space') | |
parser.add_argument('--no-rotate', dest='rotate', action='store_false', help='skip backups rotating') | |
parser.add_argument('-p', '--path', dest='path', default='/tmp/', help='path to save backup') | |
parser.add_argument('-c', '--odoo-config', dest='odoo_config', default='/etc/odoo/odoo-server.conf', help='odoo config file') | |
parser.add_argument('--hourly', dest='hourly', default='24', help='how many hourly backups to preserve') | |
parser.add_argument('--daily', dest='daily', default='7', help='how many daily backups to preserve') | |
parser.add_argument('--weekly', dest='weekly', default='4', help='how many weekly backups to preserve') | |
parser.add_argument('--monthly', dest='monthly', default='12', help='how many monthly backups to preserve') | |
parser.add_argument('--yearly', dest='yearly', default='always', help='how many yearly backups to preserve') | |
#parser.add_argument('--odoo-source', dest='odoo_source', default='/usr/local/src/odoo/', help='odoo source dir') | |
args = parser.parse_args() | |
def get_odoo_config(): | |
import ConfigParser | |
p = ConfigParser.ConfigParser() | |
p.read(args.odoo_config) | |
res = {} | |
for (name,value) in p.items('options'): | |
if value=='True' or value=='true': | |
value = True | |
if value=='False' or value=='false': | |
value = False | |
res[name] = value | |
return res | |
odoo_config = get_odoo_config() | |
### EXECUTE | |
#@_set_pg_password_in_environment # see openerp/service/db.py | |
def dump_sql(db, dump_file): | |
cmd = ['pg_dump', '--format=p', '--no-owner', '--file=' + dump_file] | |
if odoo_config.get('db_user'): | |
cmd.append('--username=' + odoo_config.get('db_user')) | |
if odoo_config.get('db_host'): | |
cmd.append('--host=' + odoo_config.get('db_host')) | |
if odoo_config.get('db_port'): | |
cmd.append('--port=' + str(odoo_config.get('db_port'))) | |
cmd.append(db) | |
if exec_pg_command(*cmd): | |
print ' '.join(cmd) | |
raise Exception("Couldn't dump database") | |
def backup(db, dump_dir): | |
odoo_data_dir = odoo_config.get('data_dir', '~/.local/share/Odoo/') | |
filestore = os.path.join(odoo_data_dir, 'filestore', db) | |
if args.save_filestore: | |
os.symlink(filestore, os.path.join(dump_dir, 'filestore')) | |
dump_file = os.path.join(dump_dir, 'dump.sql') | |
dump_sql(db, dump_file) | |
dump_archive = "%(db)s_%(timestamp)s_%(mark)s.dump" % { | |
'db': db, | |
'timestamp': datetime.datetime.utcnow().strftime("%Y-%m-%d_%H-%M-%SZ"), | |
'mark': 'full' if args.save_filestore else 'quick', | |
} | |
with open(dump_archive, 'w') as stream: | |
zip_dir(dump_dir, stream, include_dir=False) | |
return dump_archive | |
def rotate(backup_dir): | |
cmd = ['rotate-backups'] | |
for period in ('hourly', 'daily', 'weekly', 'monthly', 'yearly'): | |
cmd.extend(['--%s' % period, getattr(args, period) ] ) | |
cmd.append(backup_dir) | |
cmd.extend(['2>', '/dev/null']) | |
os.system(' '.join(cmd)) | |
def main(): | |
for db in args.database: | |
backup_dir = os.path.join(args.path, db, 'full' if args.save_filestore else 'quick') | |
if not os.path.exists(backup_dir): | |
os.system('mkdir -p %s' % backup_dir) | |
with tempdir() as dump_dir: | |
dump_archive = backup(db, dump_dir) | |
shutil.move(dump_archive, os.path.join(backup_dir, dump_archive)) | |
if args.rotate: | |
rotate(backup_dir) | |
### TOOLS | |
def find_pg_tool(name): | |
path = None | |
#if config['pg_path'] and config['pg_path'] != 'None': | |
# path = config['pg_path'] | |
try: | |
return which(name, path=path) | |
except IOError: | |
return None | |
def exec_pg_command(name, *args): | |
prog = find_pg_tool(name) | |
if not prog: | |
raise Exception('Couldn\'t find %s' % name) | |
args2 = (prog,) + args | |
with open(os.devnull) as dn: | |
return subprocess.call(args2, stdout=dn, stderr=subprocess.STDOUT) | |
def zip_dir(path, stream, include_dir=True): # TODO add ignore list | |
path = os.path.normpath(path) | |
len_prefix = len(os.path.dirname(path)) if include_dir else len(path) | |
if len_prefix: | |
len_prefix += 1 | |
with zipfile.ZipFile(stream, 'w', compression=zipfile.ZIP_DEFLATED, allowZip64=True) as zipf: | |
for dirpath, dirnames, filenames in os.walk(path, followlinks=True): | |
for fname in filenames: | |
bname, ext = os.path.splitext(fname) | |
ext = ext or bname | |
if ext not in ['.pyc', '.pyo', '.swp', '.DS_Store']: | |
path = os.path.normpath(os.path.join(dirpath, fname)) | |
if os.path.isfile(path): | |
zipf.write(path, path[len_prefix:]) | |
@contextmanager | |
def tempdir(): | |
tmpdir = tempfile.mkdtemp() | |
try: | |
yield tmpdir | |
finally: | |
shutil.rmtree(tmpdir) | |
import sys | |
from os import access, defpath, pathsep, environ, F_OK, R_OK, W_OK, X_OK | |
from os.path import exists, dirname, split, join | |
windows = sys.platform.startswith('win') | |
defpath = environ.get('PATH', defpath).split(pathsep) | |
if windows: | |
defpath.insert(0, '.') # can insert without checking, when duplicates are removed | |
# given the quite usual mess in PATH on Windows, let's rather remove duplicates | |
seen = set() | |
defpath = [dir for dir in defpath if dir.lower() not in seen and not seen.add(dir.lower())] | |
del seen | |
defpathext = [''] + environ.get('PATHEXT', | |
'.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC').lower().split(pathsep) | |
else: | |
defpathext = [''] | |
def which_files(file, mode=F_OK | X_OK, path=None, pathext=None): | |
""" Locate a file in a path supplied as a part of the file name, | |
or the user's path, or a supplied path. | |
The function yields full paths (not necessarily absolute paths), | |
in which the given file name matches an existing file in a directory on the path. | |
>>> def test_which(expected, *args, **argd): | |
... result = list(which_files(*args, **argd)) | |
... assert result == expected, 'which_files: %s != %s' % (result, expected) | |
... | |
... try: | |
... result = [ which(*args, **argd) ] | |
... except IOError: | |
... result = [] | |
... assert result[:1] == expected[:1], 'which: %s != %s' % (result[:1], expected[:1]) | |
>>> if windows: cmd = environ['COMSPEC'] | |
>>> if windows: test_which([cmd], 'cmd') | |
>>> if windows: test_which([cmd], 'cmd.exe') | |
>>> if windows: test_which([cmd], 'cmd', path=dirname(cmd)) | |
>>> if windows: test_which([cmd], 'cmd', pathext='.exe') | |
>>> if windows: test_which([cmd], cmd) | |
>>> if windows: test_which([cmd], cmd, path='<nonexistent>') | |
>>> if windows: test_which([cmd], cmd, pathext='<nonexistent>') | |
>>> if windows: test_which([cmd], cmd[:-4]) | |
>>> if windows: test_which([cmd], cmd[:-4], path='<nonexistent>') | |
>>> if windows: test_which([], 'cmd', path='<nonexistent>') | |
>>> if windows: test_which([], 'cmd', pathext='<nonexistent>') | |
>>> if windows: test_which([], '<nonexistent>/cmd') | |
>>> if windows: test_which([], cmd[:-4], pathext='<nonexistent>') | |
>>> if not windows: sh = '/bin/sh' | |
>>> if not windows: test_which([sh], 'sh') | |
>>> if not windows: test_which([sh], 'sh', path=dirname(sh)) | |
>>> if not windows: test_which([sh], 'sh', pathext='<nonexistent>') | |
>>> if not windows: test_which([sh], sh) | |
>>> if not windows: test_which([sh], sh, path='<nonexistent>') | |
>>> if not windows: test_which([sh], sh, pathext='<nonexistent>') | |
>>> if not windows: test_which([], 'sh', mode=W_OK) # not running as root, are you? | |
>>> if not windows: test_which([], 'sh', path='<nonexistent>') | |
>>> if not windows: test_which([], '<nonexistent>/sh') | |
""" | |
filepath, file = split(file) | |
if filepath: | |
path = (filepath,) | |
elif path is None: | |
path = defpath | |
elif isinstance(path, str): | |
path = path.split(pathsep) | |
if pathext is None: | |
pathext = defpathext | |
elif isinstance(pathext, str): | |
pathext = pathext.split(pathsep) | |
if not '' in pathext: | |
pathext.insert(0, '') # always check command without extension, even for custom pathext | |
for dir in path: | |
basepath = join(dir, file) | |
for ext in pathext: | |
fullpath = basepath + ext | |
if exists(fullpath) and access(fullpath, mode): | |
yield fullpath | |
def which(file, mode=F_OK | X_OK, path=None, pathext=None): | |
""" Locate a file in a path supplied as a part of the file name, | |
or the user's path, or a supplied path. | |
The function returns full path (not necessarily absolute path), | |
in which the given file name matches an existing file in a directory on the path, | |
or raises IOError(errno.ENOENT). | |
>>> # for doctest see which_files() | |
""" | |
try: | |
return iter(which_files(file, mode, path, pathext)).next() | |
except StopIteration: | |
try: | |
from errno import ENOENT | |
except ImportError: | |
ENOENT = 2 | |
raise IOError(ENOENT, '%s not found' % (mode & X_OK and 'command' or 'file'), file) | |
if __name__ == '__main__': | |
main() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
description "odoo" | |
setuid {{ODOO_USER}} | |
start on startup | |
respawn | |
respawn limit 2 5 | |
exec /usr/local/src/odoo/openerp-server --config=/etc/odoo/odoo-server.conf --logfile=/var/log/odoo/odoo-server.log |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
description "odoo-longpolling" | |
setuid {{ODOO_USER}} | |
start on startup | |
respawn | |
respawn limit 2 5 | |
exec /usr/local/src/odoo/openerp-gevent --config=/etc/odoo/odoo-server.conf --logfile=/var/log/odoo/odoo-server-longpolling.log |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[program:odoo-longpolling] | |
command=/usr/local/src/odoo/openerp-gevent --config=/etc/odoo/odoo-server.conf --logfile=/var/log/odoo/odoo-server-longpolling.log | |
autostart=true | |
autorestart=true | |
user={{ODOO_USER}} | |
directory=/opt/{{ODOO_USER}}/ | |
environment = HOME="/opt/{{ODOO_USER}}/",USER="{{ODOO_USER}}" | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[Unit] | |
Description=odoo-longpolling | |
Requires=postgresql.service | |
After=postgresql.service | |
Wants=nginx.service | |
[Install] | |
Alias=odoo.service | |
[Service] | |
Type=simple | |
PermissionsStartOnly=true | |
EnvironmentFile=-/etc/odoo/odoo-server.conf | |
User={{ODOO_USER}} | |
Group={{ODOO_USER}} | |
SyslogIdentifier=odoo-server | |
PIDFile=/run/odoo/odoo-server.pid | |
#ExecStartPre=/usr/bin/install -d -m755 -o odoo -g odoo /run/odoo | |
ExecStart=/usr/local/src/odoo/openerp-gevent --config=/etc/odoo/odoo-server.conf --logfile=/var/log/odoo/odoo-server-longpolling.log | |
#ExecStop=/bin/kill $MAINPID | |
Restart=on-failure | |
RestartSec=10 | |
[Install] | |
WantedBy=multi-user.target | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[options] | |
addons_path = /usr/local/src/odoo/addons,/usr/local/src/odoo/openerp/addons,/usr/local/src/odoo-addons,{{PRIVATE_GIT_LOCAL}}/usr/local/src/odoo-addons/OCA/account-financial-reporting,/usr/local/src/odoo-addons/OCA/account-financial-tools,/usr/local/src/odoo-addons/OCA/partner-contact,/usr/local/src/odoo-addons/OCA/hr,/usr/local/src/odoo-addons/OCA/pos,/usr/local/src/odoo-addons/OCA/commission,/usr/local/src/odoo-addons/OCA/web,/usr/local/src/odoo-addons/OCA/project,/usr/local/src/odoo-addons/OCA/website,/usr/local/src/odoo-addons/OCA/server-tools,/usr/local/src/odoo-addons/OCA/reporting-engine,/usr/local/src/odoo-addons/OCA/rma,/usr/local/src/odoo-addons/OCA/contract,/usr/local/src/odoo-addons/OCA/sale-workflow,/usr/local/src/odoo-addons/OCA/purchase-workflow,/usr/local/src/odoo-addons/OCA/bank-payment,/usr/local/src/odoo-addons/OCA/bank-statement-import,/usr/local/src/odoo-addons/OCA/bank-statement-reconcile,/usr/local/src/odoo-addons/yelizariev/pos-addons,/usr/local/src/odoo-addons/yelizariev/access-addons,/usr/local/src/odoo-addons/yelizariev/website-addons,/usr/local/src/odoo-addons/yelizariev/addons-yelizariev,/usr/local/src/odoo-addons/yelizariev/odoo-saas-tools,/usr/local/src/odoo-addons/iledarn/e-commerce,/usr/local/src/odoo-addons/vauxoo,/usr/local/src/odoo-addons/xpansa/hr,/usr/local/src/odoo-addons/odoomrp/odoomrp-wip,/usr/local/src/odoo-addons/odoomrp/odoomrp-utils,/usr/local/src/odoo-addons/techreceptives,/usr/local/src/odoo-addons/z-others,/usr/local/src/odoo-addons/z-others-p | |
admin_passwd = {{DB_PASS}} | |
auto_reload = False | |
csv_internal_sep = , | |
data_dir=/opt/{{ODOO_USER}}/.local/share/Odoo | |
#dbfilter = .* ;will show database selector if there are more than one database | |
dbfilter = ^%h$ ;select database automatically by domain. E.g. http://portal.example.com will show "portal.example.com" database | |
#dbfilter = ^%d$ ;select database automatically by first subdomain (www is ignored). E.g. http://my.portal.example.com and http://www.my.portal.example.com will show database "my" | |
db_user = {{ODOO_USER}} | |
db_template = template1 | |
db_host = False | |
db_maxconn = 64 | |
db_name = False | |
db_password = {{DB_PASS}} | |
db_port = False | |
debug_mode = False | |
demo = {} | |
email_from = False | |
#import_partial = /opt/{{ODOO_USER}}/.local/share/User/import/odoo.import.temp ;needed for long-running data imports | |
import_partial = | |
limit_memory_hard = 25000000000 | |
limit_memory_soft = 24000000000 | |
limit_request = 8192 | |
limit_time_cpu = 10800 | |
limit_time_real = 14400 | |
list_db = True | |
# uncomment below to activate debug logs | |
#log_handler = ['["[\':DEBUG\']"]'] | |
#log_level = debug | |
# should be set in run command (i.e. via --logfile) | |
#logfile = /var/log/odoo/odoo-server.log | |
login_message = False | |
logrotate = True | |
longpolling_port = 8072 | |
max_cron_threads = 3 | |
netrpc = False | |
netrpc_interface = | |
netrpc_port = 8070 | |
osv_memory_age_limit = 12.0 | |
osv_memory_count_limit = False | |
pg_path = None | |
pidfile = False | |
proxy_mode = True | |
reportgz = False | |
secure_cert_file = {{SSL_CERT}} | |
secure_pkey_file = {{SSL_KEY}} | |
server_wide_modules = None | |
smtp_password = {{EMAIL_PASS}} ;False | |
smtp_port = 465 ;25 | |
smtp_server = {{EMAIL_SERVER}} ;localhost | |
smtp_ssl = True ;False | |
smtp_user = {{EMAIL_USER}} ;False | |
static_http_document_root = None | |
static_http_enable = False | |
static_http_url_prefix = None | |
syslog = False | |
test_commit = False | |
test_enable = False | |
test_file = False | |
test_report_directory = False | |
timezone = False | |
translate_modules = ['all'] | |
unaccent = False | |
without_demo = False | |
workers = 9 | |
xmlrpc = True | |
xmlrpc_interface = | |
xmlrpc_port = 8069 | |
xmlrpcs = True | |
xmlrpcs_interface = | |
xmlrpcs_port = 8071 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[program:odoo] | |
command=/usr/local/src/odoo/openerp-server --config=/etc/odoo/odoo-server.conf --logfile=/var/log/odoo/odoo-server.log | |
autostart=true | |
autorestart=true | |
user={{ODOO_USER}} | |
directory=/opt/{{ODOO_USER}}/ | |
environment = HOME="/opt/{{ODOO_USER}}/",USER="{{ODOO_USER}}" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[Unit] | |
Description=odoo | |
Requires=postgresql.service | |
After=postgresql.service | |
Wants=nginx.service | |
[Install] | |
Alias=odoo.service | |
[Service] | |
Type=simple | |
PermissionsStartOnly=true | |
EnvironmentFile=-/etc/odoo/odoo-server.conf | |
User={{ODOO_USER}} | |
Group={{ODOO_USER}} | |
SyslogIdentifier=odoo-server | |
PIDFile=/run/odoo/odoo-server.pid | |
#ExecStartPre=/usr/bin/install -d -m755 -o odoo -g odoo /run/odoo | |
ExecStart=/usr/local/src/odoo/openerp-server --config=/etc/odoo/odoo-server.conf --logfile=/var/log/odoo/odoo-server.log | |
#ExecStop=/bin/kill $MAINPID | |
Restart=on-failure | |
RestartSec=10 | |
[Install] | |
WantedBy=multi-user.target |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment