From 64694818b0568a5d1af2bd5079d7e9e8c31e85eb Mon Sep 17 00:00:00 2001 From: Chris Coleman Date: Wed, 15 Nov 2017 00:47:36 -0500 Subject: [PATCH] Big update. * Script can now run again and again without corrupting the installation. * Script will install to `/home/odoo/` by default, instead of `/odoo/`, this is best practice, because `/home/odoo` will be backed up on typical servers, and `/odoo` will be restricted or refused access on typical servers. * Script will halt on major errors to more easily locate any errors. * Cleaned up, combined many `apt-get` and `pip` calls into fewer calls. * All output goes to `~/install_log` for easier posting to github for help. * `./install_log` is cleared at the start of each run. * All work (downloads, building the `conf` file and service file) takes place in home dir. * Fixed bug, was creating `addons` dir with ownership of `root`. * Add configurable option to add user `odoo` to group `sudo` or not. * Show proof that service is running at the end of the run. * More to do, (put each step into its own function, and create reverse of each function for uninstaller) but this is a great start. Newest WKHTMLtoPDF 0.12.4 (Nov 2016). Install the newest version 0.12.4 (Nov 2016) of WKHTMLtoPDF. Has about 140 commits newer than the previously used 0.12.1 (released 2014) which is obsolete unpatched and unsupported for years now. https://github.com/wkhtmltopdf/wkhtmltopdf/releases Fix service start bug. On 16.04 /etc/init.d fails. Fix service start bug. Put more blocks of procedural code into functions for easier updating it. Clean up Enterprise install function. Fix. Run `odoo-server` as an ordinary user odoo, not member of `sudo` (superadmin). Running `odoo-server` service as ordinary user is working now. Set `odoo` user to default as non-`sudo` group member. This commit lets script continue OK when removing `odoo` user from `sudo` group when already not a member of the `sudo` group. Fix error checking for install on empty server. When `odoo-server` stopped, and try to `stop`, don't halt script, just continue. Show version and install details. Upgrade pip. Fixes bugs in `start.sh` and postgresql create database. Better organized. Easier to see bugs. Fixes bug in start.sh (was using old name openerp instead of odoo) Fixes bug, charset error when postgresql tries to create your database at the odoo welcome screen. Cleanup. Functions. Update version. Handles command line to install Enterprise: -E -e --enterprise Save time, no need to edit the script and change a variable just to install Enterprise! `./odoo_install.sh -E` `./odoo_install.sh -e` `./odoo_install.sh --enterprise` Fix bug in enterprise install, addons_path was omitting custom. Old bug in enterprise installs. `addons_path` was failing to include the path `(home)/custom/addons`. Fixed. Add sudo. Add flag. Reduce error messages. You should now be able to run without `sudo` before script name on command line. Script uses `sudo` which prompts for password when you're not super-admin. Odoo home folder, fix permission error message. Fix bug when run install as non-superadmin Bug. Was failing to create `odoo-server.conf` file. Add uninstall command line feature. -U or --uninstall Add missing python libs (from requirements.txt) These python libraries are required and were missing, and caused serious errors in the `/var/log/odoo/odoo-server` log file: ``` num2words markupsafe ofxparse pillow pyldap pyserial qrcode six ``` Fixed by adding these libs to the function `install_python_libraries`. Fixes errors (missing python libraries). This commit fixes the following error. A feature was broken because of the simple fact of not installing some required libraries. ``` 2017-11-22 19:14:34,560 21522 WARNING ? odoo.addons.base.res.res_currency: The num2words python library is not installed, l10n_mx_edi features won't be fully available. ``` Previous commit fixed the above error, but had 2 syntax errors, which are fixed in this commit. Version number. Add options --update --upgrade to get newest code from `odoo` repo. Add options `--update` `--upgrade`. Either one will get newest code from `odoo` repo. Version number. clear_install_log. Make log entries go to the same log file. Not relative to current directory. Because current directory changes during install process. Improved "--update" code. Add -h --help option. Fix missing sudo chown. Add --delete-start-over * Fix bug, was missing `sudo` in in front of some `chown` commands, this would fail, rather than prompt for password. * Add option `--delete-start-over`, this does full Uninstall, delete `odoo` user and home fdir, then creates `odoo` user as superadmin, and home dir. Just create a password for `odoo` user (command line: `passwd odoo`), and you're ready to test this install script as typical ordinary (non-`root`) user. Fix bug install Enterprise (dir wasn't created) 1. Fix bug install Enterprise (dir wasn't created because of shell command variable did not exist in context!). Now it works. 2. Fix bug wasn't adding enterprise addons path. Fixed now it works. Fix enterprise install bug. Add nginx + LE HTTPS. 1. Fix enterprise install bug (must specify current directory to avoid creating a new dir which puts the code one level too deep). 2. Add NGINX and Lets Encrypt support - not finished yet - command line parsing is not perfect. Detect sudo and show warning. Number steps. Next version should be able to run as non-`sudo` and install as much as possible without failing/exiting. For systems where admin has already installed required packages, maybe on a previous installation. Nginx + LE HTTPS work. Verifies domain exists. Add HTTP/2. Fix Livechat. Runs chat listener process. I fixed Livechat. Previously it wasn't listening on the livechat port. Now it is listening. However this livechat feature appears to not work on 16.04, probably because of this bug: https://github.com/odoo/odoo/issues/20512 Conclusion, Livechat might work for you. It will work on python 3.5 (16.04) only if your version of Odoo has the patch that avoids using the feature of python 3.5 that's broken and causing the http responses to be truncated. Fix parameter checking. Improve run without sudo. Parameter checking is more user friendly now. Run without `sudo` in front of the command. `Sudo` is in the code so `sudo` doesn't need to be on the command line. TODO: finish `virtualenv` + finish install as ordinary user (make sure system packages already installed). FIx a few bigs. * Fix bug causing script to fail on 14.04, must remove debian packages for `python-pypdf2` and `python3-suds` and install only thru `pip3`. * TODO: Move all possible debian `python-` packages to install with `pip3`. This makes installer script much more portable across OS. * Fix `sudo` missing bug on `create_startup_script` in statements `chown` and `mv`. * Add `universe` repository, in function `update-server` because some extremely minimal servers are missing the default `universe` repo. Fix typo. update_repo_in_current_dir updates db. Version. Fix bug (apt add repository universe). * `apt-add-repository` is not a built in command! Must be added to a generic default system. Fixed. Add feature, self-update. * `odoo_install.sh --self-update` downloads the newest version of this script, saving to the same filename as running, even if different from the original scrip filename. Fix self-update bug, download filename. * Even when script filename is changed, must download from the same source filename. Fix many issues. Add 2 features. * Change: move `conf` file location to `/etc/odoo/odoo-server.conf` to make easier management of multiple Odoo instances on one server. * Add command line option `--livechatport=8072` to make possible to install multiple Odoo instances on one server. * Fix many issues mentioned by @Yenthe666 Move python libs from apt to pip. Add option --upgrade-python-libraries * Add option to upgrade to the newest version of python libraries. Many will want to test on these newer library versions, and if they work, run Odoo on these new python library versions, for the many security and bug fixes they offer. Update the Help with --upgrade-python-libraries * Add --upgrade-python-libraries to help. * Improve help entries for other command options. Remove ZSI. It's not a requirement. * TODO: Add option to install exactly the python libs listed in `requirements.txt` Tested OK ubuntu 16.04 lxc/openvz server. * added `htop`, it helps show activity. * added `testresources` it's required by `launchpadlib` (used by `bzr` ?) yet wasn't auto installed. Add 2 python build requirements for minimal 16.04 * Minimal 16.04 appears to miss the build requirements `gcc` and `python3-dev`, needed to install `psutil` thru `pip3`. * Do `apt-get update` to get all package indexes, before the very first `apt-get install`. Necessary when the OS is totally fresh and has never before run `apt-get update`, causing `apt-get install` to fail because no package indexes have been downloaded yet. net-tools for netstat diagnostics. Works on 17.10 * Install on Ubuntu 17.10 Artful (note: `nginx` and `LE TLS cert` on 17.10 wasn't tested yet). * Add package `net-tools` soon to be added feature to display/verify ports in-use by `odoo` and by `nginx`. Fix download_odoo work when dir isnt empty. * `git clone` fails when dir isn't absolutely empty! So, we must remove the directory and all its contents (to be sure all the git dotfiles are gone) so that `git clone` will work under all circumstances. Add LE TLS cert workaround (SNI vulnerability) * TLS SNI has been disabled at Lets Encrypt TLS certificate issuing servers. This is what broke the LE TLS cert feature. Workaround now we use `standalone` mode which has the side effect of turning off `nginx` web server for about 10 seconds while the remote Lets Encrypt issuing servers create the TLS cert. https://github.com/certbot/certbot/issues/5405 Fix wkhtmltopdf dependencies, nginx upload size. * Add `wkhtmltopdf` missing dynamic runtime dependencies `libxrender1 fontconfig xvfb` because it's not truly fully static even though it claims to be fully static. * Set `max_client_body_size 200m;` to allow upload for the purpose to restore database backups. Default was 8MB (`8m`) far too small. Add dependencies for livechat, css, etc. * Add additional dependencies for livechat (`python-psycogreen`) + node stuff (previously believed to be for enterprise version only). Upgrade to systemd service. Show free space, RAM. * Upgrade to install a modern `systemd` service by default. Can still specify command line option `--sysvinit` to use old/obsolete SysV service. * Show system statistics at start of script. Free disk space, and RAM memory. --- odoo_install.sh | 1053 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 901 insertions(+), 152 deletions(-) diff --git a/odoo_install.sh b/odoo_install.sh index 1c9dab8..39e1cd0 100644 --- a/odoo_install.sh +++ b/odoo_install.sh @@ -1,7 +1,7 @@ -#!/bin/bash +#!/usr/bin/env bash ################################################################################ # Script for installing Odoo on Ubuntu 14.04, 15.04 and 16.04 (could be used for other version too) -# Author: Yenthe Van Ginneken +# Authors: Yenthe Van Ginneken, Chris Coleman (EspaceNetworks) #------------------------------------------------------------------------------- # This script will install Odoo on your Ubuntu 16.04 server. It can install multiple Odoo instances # in one Ubuntu because of the different xmlrpc_ports @@ -13,166 +13,652 @@ # Execute the script to install Odoo: # ./odoo-install ################################################################################ +versiondate="2018-02-26a" ##fixed parameters -#odoo OE_USER="odoo" -OE_HOME="/$OE_USER" -OE_HOME_EXT="/$OE_USER/${OE_USER}-server" +OE_HOME="/home/${OE_USER}" +OE_HOME_EXT="${OE_HOME}/${OE_USER}-server" #The default port where this Odoo instance will run under (provided you use the command -c in the terminal) -#Set to true if you want to install it, false if you don't need it or have it already installed. -INSTALL_WKHTMLTOPDF="True" -#Set the default Odoo port (you still have to use -c /etc/odoo-server.conf for example to use this.) +#Set the default Odoo port (you still have to use -c /etc/odoo/odoo-server.conf for example to use this.) OE_PORT="8069" -#Choose the Odoo version which you want to install. For example: 11.0, 10.0, 9.0 or saas-18. When using 'master' the master version will be installed. -#IMPORTANT! This script contains extra libraries that are specifically needed for Odoo 11.0 +#Set to True if you want to install it, False if you don't need it or have it already installed. +INSTALL_WKHTMLTOPDF="True" +#Choose the Odoo version which you want to install. For example: 11.0, 10.0, 9.0 or saas-18. +#When using 'master' the master version will be installed. +#IMPORTANT! This script installs packages and libraries that are needed by Odoo. OE_VERSION="11.0" -# Set this to True if you want to install Odoo 11 Enterprise! +# Set this to True to install Enterprise version (modules). +# NOTE: To install Enterprise, your github login must be associated with an Odoo subscription, or with an Odoo Partnership! IS_ENTERPRISE="False" #set the superadmin password OE_SUPERADMIN="admin" OE_CONFIG="${OE_USER}-server" +OE_RUN_SERVICE_AS_SUPERADMIN="False" +INSTALL_LOG="./${OE_USER}_install.log" +INSTALL_LOG_REDIRECT="$INSTALL_LOG 2>&1" +OE_ENTERPRISE_ADDONS="${OE_HOME}/enterprise/addons" +OE_CUSTOM_ADDONS="${OE_HOME}/custom/addons" +### WKHTMLTOPDF version +## Generic version (embeds libjpeg and libpng) for all distros. +## The generic linux binaries should work fine across all distributions +## as they are built on CentOS 6 with statically-linked libpng and libjpeg . +## However, in case of security vulnerabilities in either library a new release +## will have to be done – similar to what was required for Windows earlier. ## -### WKHTMLTOPDF download links -## === Ubuntu Trusty x64 & x32 === (for other distributions please replace these two links, -## in order to have correct version of wkhtmltox installed, for a danger note refer to -## https://www.odoo.com/documentation/8.0/setup/install.html#deb ): -WKHTMLTOX_X64=https://downloads.wkhtmltopdf.org/0.12/0.12.1/wkhtmltox-0.12.1_linux-trusty-amd64.deb -WKHTMLTOX_X32=https://downloads.wkhtmltopdf.org/0.12/0.12.1/wkhtmltox-0.12.1_linux-trusty-i386.deb - -#-------------------------------------------------- -# Update Server -#-------------------------------------------------- -echo -e "\n---- Update Server ----" -sudo apt-get update -sudo apt-get upgrade -y - -#-------------------------------------------------- -# Install PostgreSQL Server -#-------------------------------------------------- -echo -e "\n---- Install PostgreSQL Server ----" -sudo apt-get install postgresql -y - -echo -e "\n---- Creating the ODOO PostgreSQL User ----" -sudo su - postgres -c "createuser -s $OE_USER" 2> /dev/null || true - -#-------------------------------------------------- -# Install Dependencies -#-------------------------------------------------- -echo -e "\n--- Installing Python 3 + pip3 --" -sudo apt-get install python3 python3-pip - -echo -e "\n---- Install tool packages ----" -sudo apt-get install wget git bzr python-pip gdebi-core -y - -echo -e "\n---- Install python packages ----" -sudo apt-get install python-pypdf2 python-dateutil python-feedparser python-ldap python-libxslt1 python-lxml python-mako python-openid python-psycopg2 python-pybabel python-pychart python-pydot python-pyparsing python-reportlab python-simplejson python-tz python-vatnumber python-vobject python-webdav python-werkzeug python-xlwt python-yaml python-zsi python-docutils python-psutil python-mock python-unittest2 python-jinja2 python-pypdf python-decorator python-requests python-passlib python-pil -y -sudo pip3 install pypdf2 Babel passlib Werkzeug decorator python-dateutil pyyaml psycopg2 psutil html2text docutils lxml pillow reportlab ninja2 requests gdata XlsxWriter vobject python-openid pyparsing pydot mock mako Jinja2 ebaysdk feedparser xlwt psycogreen suds-jurko pytz pyusb greenlet xlrd - -echo -e "\n---- Install python libraries ----" -# This is for compatibility with Ubuntu 16.04. Will work on 14.04, 15.04 and 16.04 -sudo apt-get install python3-suds - -echo -e "\n--- Install other required packages" -sudo apt-get install node-clean-css -y -sudo apt-get install node-less -y -sudo apt-get install python-gevent -y - -#-------------------------------------------------- -# Install Wkhtmltopdf if needed -#-------------------------------------------------- -if [ $INSTALL_WKHTMLTOPDF = "True" ]; then - echo -e "\n---- Install wkhtml and place shortcuts on correct place for ODOO 11 ----" +## We install directly and avoid distro package because the debian package +## had a bug which made the PDF page headers and page footers fail. More info: +## https://www.odoo.com/documentation/11.0/setup/install.html#debian-ubuntu ): +wk_version=0.12.4 + +######################### +### Command line options +######################### +uninstall="False" +update="False" +_self_update="False" +help="False" +delete_start_over="False" +_virtualenv="False" +nginx="False" +email="" # email for let's encrypt https cert notifications. +domain="" # domain for let's encrypt https cert and nginx website. +_version="False" +_livechatport=8072 #default live chat port. possibly already in use by other odoo instance. +_upgrade_python_libraries="False" +_sysvinit="False" # default to False (therefore install systemd service). will be True (init.d service) if requested on command line. + +################################################################# +##### Values calculated at runtime - no need to modify these #### +################################################################# +_superadmin=0 +_domain_exists="False" +_cores=$(grep processor /proc/cpuinfo | wc -l) +### let "_workers= $_cores * 2 + 1 " +let "_workers= $_cores + 1 " +_totalkb=$(awk '/^MemTotal:/{print $2}' /proc/meminfo); +let "_totalmb= $_totalkb / 1024 " +_diskfree=$(df -h $OE_HOME | tail -1 | tr -s ' ' | cut -d' ' -f4) + +############# +### FUNCTIONS +############# + +function process_command_line { + getopt --test > /dev/null + if [[ $? -ne 4 ]]; then + echo "Sorry, cannot process command line, outdated version of getopt installed. Upgrade getopt and try again." + exit 1 + else + OPTIND=1 + OPTIONS="EhuV" + # Add single-letter options here. Uppercase lowercase is different. ":" means a parameter is expected with the option. + LONGOPTIONS="enterprise,uninstall,self-update,update,upgrade,upgrade-python-libraries,help,delete-start-over,virtualenv,email:,domain:,nginx,version,livechatport:,sysvinit" + # Add comma-separated "long options" here. For example "--help". ":" means a parameter is expected with the option. + PARSED="$(getopt --options=$OPTIONS --longoptions=$LONGOPTIONS --name "$0" -- "$@")" + if [[ $? -ne 0 ]]; then + # e.g. $? == 1 + # then getopt has complained about wrong arguments to stdout + exit 2 + fi + # read getopt's output this way to handle the quoting right: + eval set -- "$PARSED" + + # now enjoy the options in order and nicely split until we see -- + while true; do + case "$1" in + -E|--enterprise) + IS_ENTERPRISE="True" + shift + ;; + --nginx) + nginx="True" + shift + ;; + --email) + email="$2" + shift 2 + ;; + --domain) + domain="$2" + shift 2 + ;; + -h|--help) + help="True" + shift + ;; + --delete-start-over) + delete_start_over="True" + shift + ;; + --livechatport) + _livechatport="$2" + shift 2 + ;; + --self-update) + _self_update="True" + shift + ;; + --uninstall) + uninstall="True" + shift + ;; + -u|--update|--upgrade) + update="True" + shift + ;; + --upgrade-python-libraries) + _upgrade_python_libraries="True" + shift + ;; + -V|--version) + _version="True" + shift + ;; + --virtualenv) + _virtualenv="True" + shift + ;; + --sysvinit) + _sysvinit="True" + shift + ;; + --) + shift + break + ;; + *) # This is a parameter which was supposed to be processed above in the option, + # but probably case where it's supposed to process the short or long version of the option, + # is missing a "shift" or is catching either the option or the longoption. + echo "Option programming error. Missing OPTIONS, LONGOPTIONS, or case." + exit 3 + ;; + esac + done + + # handle non-option arguments + # For example, for commandline "touch filename", this is where to handle "filename". + #if [[ $# -ne 1 ]]; then + # echo "$0: A single input file is required." + # exit 4 + #fi + #echo -e "uninstall: $uninstall \n update: $update \n help: $help \n delete-start-over: $delete_start_over \n virtualenv: $_virtualenv \n nginx: $nginx \n email: $email \n domain: $domain" + + fi +} + +function self_update () { + wget -q --unlink --output-document=$0 https://github.com/chris001/InstallScript/raw/patch-2/odoo_install.sh + chmod +x $0 +} + +function get_flavor_name { # Needed to prevent these string constants from being copy pasted everywhere. + flavor="Community" + if [[ $IS_ENTERPRISE == "True" ]]; then + flavor="Enterprise" + fi +} + +function can_i_sudo { + local _groups=$("groups") + if [[ "$UID" == 0 ]]; then + _superadmin=1 + fi + if [[ "$_groups" == *" sudo"* ]]; then + _superadmin=1 + fi +} + +is_fqdn() { + hostname=$1 + [[ $hostname == *"."* ]] || return 1 + host $hostname > /dev/null 2>&1 || return 1 +} + +function verify_domain_exists { + is_fqdn $domain + if [[ "$?" == 0 ]] + then + _domain_exists="True" + else + _domain_exists="False" + fi +} + +function remove_install_log { + set +e + rm -f $INSTALL_LOG + set -e +} + +function clear_install_log { + remove_install_log + set +e + touch $INSTALL_LOG +} + +function stop_odoo_server { + set +e + sudo service ${OE_CONFIG} stop + set -e +} + +function update_repo_in_current_dir { + git fetch --depth 1 >> $INSTALL_LOG + git reset --hard origin/$OE_VERSION >> $INSTALL_LOG + sudo chown -R $OE_USER. . + #apply changes to database + sudo service $OE_CONFIG restart -u all >> $INSTALL_LOG + #sudo systemctl restart $OE_CONFIG +} + +function update_odoo { + set +e + cd $OE_HOME_EXT + update_repo_in_current_dir + cd ~ + set -e +} + +function download_odoo { + set +e + sudo rm -rf $OE_HOME_EXT + sudo git clone --depth 1 --branch $OE_VERSION https://github.com/odoo/odoo $OE_HOME_EXT/ + sudo chown $OE_USER. $OE_HOME_EXT + if [[ $update == "True" ]]; then + cd $OE_HOME_EXT + update_repo_in_current_dir + stop_odoo_server + fi + cd ~ + set -e +} + +function install_odoo_python_requirements_virtualenv { + #Install the tools required to build Odoo dependencies if needed + # and virtualenvwrapper + sudo apt-get -y install build-essential python3-dev libxslt-dev \ + libzip-dev libldap2-dev libsasl2-dev \ + libxml2 libxslt1.1 libxml2-dev libxslt1-dev \ + python-libxml2 python-libxslt1 python-dev python-setuptools \ + libxml2-dev libssl-dev \ + virtualenvwrapper >> $INSTALL_LOG + local _cmd="source /usr/share/virtualenvwrapper/virtualenvwrapper.sh ; mkvirtualenv -p /usr/bin/python3 ${OE_USER}-venv 2>&1 >> $INSTALL_LOG" + sudo -i -u $OE_USER $_cmd >> $INSTALL_LOG + #This will install virtualenvwrapper and activate it immediately. + ## We are now INSIDE the odoo user's python virtual environment named "$OE_USER-venv". + #Create an isolated environment + #Now we can create a virtual environment for Odoo like this: + # (Already done in above command.) + #sudo su - $OE_USER -c "mkvirtualenv -p /usr/bin/python3 ${OE_USER}-venv" + #With this command, we ask for an isolated Python3 environment that will be named "odoo-env". + #If the command works as expected, your shell is now using this environment. + #Your prompt should have changed to remind you that you are using an isolated environment. + #You can verify with this command: + #$ which python3 + #This command should show you the path to the Python interpreter located in the isolated environment directory. + #Now let's install the Odoo required python packages WHILE INSIDE THE VIRTUAL ENVIRONMENT: + #pip install -r ${OE_HOME_EXT}/requirements.txt + pip install -r https://github.com/odoo/odoo/raw/${OE_VERSION}/requirements.txt + #After a little while, you should be ready to run odoo from the command line as explained above. + #When you you want to leave the virtual environment, just issue this command: + #deactivate + #Whenever you want to work again with your 'odoo-venv' environment: + #$ workon odoo-venv + cd ~ + + # Previous method: + #sudo apt-get install -y build-essential libxml2 libxslt1.1 libxml2-dev libxslt1-dev + # python-libxml2 python-libxslt1 python-dev python-setuptools \ + # libxml2-dev libxslt-dev libldap2-dev libsasl2-dev libssl-dev >> $INSTALL_LOG + #pip3 install virtualenv >> $INSTALL_LOG + #mkdir $OE_PYTHON_ENV >> $INSTALL_LOG + #virtualenv $OE_PYTHON_ENV -p /usr/bin/python3 >> $INSTALL_LOG + #source $OE_HOME/python_env/bin/activate && pip3 install -r $OE_HOME_EXT/requirements.txt >> $INSTALL_LOG + #deactivate +} + +function update_server { + set +e + #for ubuntu. + #need software-properties-common for the apt-add-repository command. + #also update-notifier-common to provide update notifications with the message of the day (MOTD). + sudo apt-get update >> $INSTALL_LOG + sudo apt-get install -y software-properties-common python-software-properties \ + update-notifier-common >> $INSTALL_LOG + #some minimal ubuntu servers are lacking the popular yet optional universe repo which contains pip3 + #so we must add universe to be sure we can install pip3. + sudo add-apt-repository -y universe >> $INSTALL_LOG + sudo apt-get update >> $INSTALL_LOG + sudo apt-get -y upgrade >> $INSTALL_LOG + set -e +} + +function add_odoo_site_to_nginx { + local _tmp_config="./${domain}.conf" + local config="/etc/nginx/sites-available/${domain}.conf" + # https://www.odoo.com/documentation/11.0/setup/deploy.html + sudo rm -f $config + sudo rm -f $_tmp_config + set +e + touch $_tmp_config + set -e + cat < $_tmp_config +#odoo server +upstream odoo { + server 127.0.0.1:$OE_PORT; +} +upstream odoochat { + server 127.0.0.1:$_livechatport; +} + +server { + listen 443 ssl http2; + listen [::]:443 ssl http2 ipv6only=on; + server_name $domain; + + client_max_body_size 200m; + + ssl_stapling on; + ssl_stapling_verify on; + + add_header Strict-Transport-Security "max-age=15768000; includeSubdomains; preload"; + add_header X-Frame-Options DENY; + add_header X-Content-Type-Options nosniff; + + proxy_read_timeout 720s; + proxy_connect_timeout 720s; + proxy_send_timeout 720s; + + # Add Headers for odoo proxy mode + 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; + + # log + access_log /var/log/nginx/$domain.access.log; + error_log /var/log/nginx/$domain.error.log; + + # Redirect requests to odoo backend server + location / { + proxy_redirect off; + proxy_pass http://odoo; + } + location /longpolling { + proxy_pass http://odoochat; + } + + # common gzip + gzip_types text/css text/less text/plain text/xml application/xml application/json application/javascript; + gzip on; +} + +# http -> https +server { + listen 80; + listen [::]:80 ipv6only=on; + server_name $domain; + rewrite ^(.*) https://\$host\$1 permanent; +} +EOF + + sudo mv $_tmp_config $config + set +e + sudo ln -s /etc/nginx/sites-available/$domain.conf /etc/nginx/sites-enabled/$domain.conf >> $INSTALL_LOG + sudo systemctl restart nginx + set -e +} + +function install_nginx_with_LE_https_cert { + ###sudo apt-get update >> $INSTALL_LOG # Update was already done in update_server function. + sudo apt-get -y install nginx software-properties-common >> $INSTALL_LOG + sudo add-apt-repository -y ppa:certbot/certbot >> $INSTALL_LOG + sudo apt-get update >> $INSTALL_LOG + sudo apt-get -y install python-certbot-nginx >> $INSTALL_LOG + + add_odoo_site_to_nginx + + #Certbot has an Nginx plugin, which is supported on many platforms, and automates both obtaining and installing certs. + #Running this command will get a certificate for you and have Certbot edit your Nginx configuration automatically to serve it. + #Please specify --domains, or --installer that will help in domain names autodiscovery. + ## Original method deprecated Jan 2018 because TLS SNI vulnerability requires SNI verification turned off. + ## sudo certbot run -n --nginx --agree-tos --no-eff-email -m $email -d $domain + ## Temporary workaround method January 2018 until ppa maintainers add certbot 0.21 to ppa:certbot/certbot. + ## https://github.com/certbot/certbot/issues/5405#issuecomment-356498627 + sudo certbot -n --authenticator standalone --installer nginx --agree-tos --no-eff-email -m $email -d $domain --pre-hook "systemctl stop nginx" --post-hook "systemctl start nginx" >> $INSTALL_LOG + + #Automating renewal + #The Certbot packages on your system come with a cron job that will renew your certificates automatically before they expire. + #Since Let's Encrypt certificates last for 90 days, it's highly advisable to take advantage of this feature. + #You can test automatic renewal for your certificates by running this command: + #sudo certbot renew --dry-run + #If dry run appears to be working correctly, you can arrange for automatic renewal by adding a cron or systemd job + #which runs the following: + #certbot renew +} + +function install_postgresql { + sudo apt-get install postgresql -y >> $INSTALL_LOG + sudo su - postgres -c "createuser -s $OE_USER" 2> /dev/null || true +} + +function update_postgresql_template { + set -e + sudo localedef -f UTF-8 -i en_US en_US.UTF-8 >> $INSTALL_LOG + RUN_PSQL="sudo -i -u postgres psql -X --set AUTOCOMMIT=off --set ON_ERROR_STOP=on --single-transaction " + ${RUN_PSQL} <> $INSTALL_LOG + # python-gevent python-dateutil python-feedparser python-ldap python-libxslt1 + # python-lxml python-mako python-openid + # python-psycopg2 python-pybabel python-pychart python-pydot python-pyparsing + # python-reportlab python-simplejson python-tz python-vatnumber + # python-vobject python-webdav python-werkzeug python-xlwt python-yaml python-zsi + # python-docutils python-psutil python-mock python-unittest2 + # python-jinja2 python-pypdf python-decorator python-requests python-passlib python-pil + # python-libxml2 python-libxslt1 +} + +function upgrade_pip { + sudo -H pip install --upgrade pip >> $INSTALL_LOG + sudo -H pip3 install --upgrade pip >> $INSTALL_LOG +} + +function install_python_libraries { + local _upgrade_flag="" + if [[ $_upgrade_python_libraries == "True" ]]; then + _upgrade_flag="--upgrade" + fi + sudo -H pip3 install $_upgrade_flag gevent feedparser ldap lxml mako \ + https://launchpad.net/ubuntu/+archive/primary/+files/python-pychart_1.39.orig.tar.gz \ + pypdf2 Babel passlib Werkzeug decorator python-dateutil pyyaml psycopg2 \ + psutil html2text docutils pillow reportlab simplejson vatnumber pywebdav3 \ + ninja2 requests gdata XlsxWriter vobject python-openid pyparsing pydot \ + mock Jinja2 ebaysdk xlwt psycogreen suds-jurko pytz \ + pyusb greenlet xlrd unittest2 \ + num2words markupsafe ofxparse pyldap pyserial qrcode six \ + serial geoip python3-openid unicodecsv \ + launchpadtools paramiko >> $INSTALL_LOG + set +e + #sudo -H pip2 install ZSI >> $INSTALL_LOG + #sudo -H pip2 install infi.ZSI >> $INSTALL_LOG + sudo -H pip2 install testresources egenix-mx-base >> $INSTALL_LOG #required by launchpadlib. not auto installed. + set -e +} + +function install_wkhtmltopdf { + #-------------------------------------------------- + # Install Wkhtmltopdf + #-------------------------------------------------- + # First install dependencies. + sudo apt-get install -y libxrender1 fontconfig xvfb >> $INSTALL_LOG #pick up correct one from x64 & x32 versions: - if [ "`getconf LONG_BIT`" == "64" ];then - _url=$WKHTMLTOX_X64 - else - _url=$WKHTMLTOX_X32 + local arch="i386" + local bit=$(getconf LONG_BIT) + if [ "$bit" == "64" ];then + arch="amd64" fi - sudo wget $_url - sudo gdebi --n `basename $_url` - sudo ln -s /usr/local/bin/wkhtmltopdf /usr/bin - sudo ln -s /usr/local/bin/wkhtmltoimage /usr/bin -else - echo "Wkhtmltopdf isn't installed due to the choice of the user!" -fi + local _url="https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/${wk_version}/wkhtmltox-${wk_version}_linux-generic-${arch}.tar.xz" + wget -nc -q $_url >> $INSTALL_LOG + tar xf $(basename $_url) + sudo mv wkhtmltox/bin/* /usr/local/bin/ + rm -Rf wkhtmltox + set +e + sudo ln -s /usr/local/bin/wkhtmltopdf /usr/bin >> $INSTALL_LOG + sudo ln -s /usr/local/bin/wkhtmltoimage /usr/bin >> $INSTALL_LOG + set -e +} -echo -e "\n---- Create ODOO system user ----" -sudo adduser --system --quiet --shell=/bin/bash --home=$OE_HOME --gecos 'ODOO' --group $OE_USER -#The user should also be added to the sudo'ers group. -sudo adduser $OE_USER sudo - -echo -e "\n---- Create Log directory ----" -sudo mkdir /var/log/$OE_USER -sudo chown $OE_USER:$OE_USER /var/log/$OE_USER - -#-------------------------------------------------- -# Install ODOO -#-------------------------------------------------- -echo -e "\n==== Installing ODOO Server ====" -sudo git clone --depth 1 --branch $OE_VERSION https://www.github.com/odoo/odoo $OE_HOME_EXT/ - -if [ $IS_ENTERPRISE = "True" ]; then - # Odoo Enterprise install! - echo -e "\n--- Create symlink for node" - sudo ln -s /usr/bin/nodejs /usr/bin/node - sudo su $OE_USER -c "mkdir $OE_HOME/enterprise" - sudo su $OE_USER -c "mkdir $OE_HOME/enterprise/addons" - - GITHUB_RESPONSE=$(sudo git clone --depth 1 --branch $OE_VERSION https://www.github.com/odoo/enterprise "$OE_HOME/enterprise/addons" 2>&1) - while [[ $GITHUB_RESPONSE == *"Authentication"* ]]; do - echo "------------------------WARNING------------------------------" - echo "Your authentication with Github has failed! Please try again." - printf "In order to clone and install the Odoo enterprise version you \nneed to be an offical Odoo partner and you need access to\nhttp://github.com/odoo/enterprise.\n" - echo "TIP: Press ctrl+c to stop this script." - echo "-------------------------------------------------------------" - echo " " - GITHUB_RESPONSE=$(sudo git clone --depth 1 --branch $OE_VERSION https://www.github.com/odoo/enterprise "$OE_HOME/enterprise/addons" 2>&1) - done - - echo -e "\n---- Added Enterprise code under $OE_HOME/enterprise/addons ----" - echo -e "\n---- Installing Enterprise specific libraries ----" - sudo pip3 install num2words ofxparse - sudo apt-get install nodejs npm - sudo npm install -g less - sudo npm install -g less-plugin-clean-css -fi +function create_odoo_system_user { + ## For future option, if user already exists, to install under user home dir. + #if [[ id -u "$OE_USER" >> $INSTALL_LOG_REDIRECT ]; then + # GET THE ALREADY EXISTING HOME DIR FOR THE USER. + # OE_HOME=$( getent passwd "$OE_USER" | cut -d: -f6 ) + # echo "**** Skip create ODOO system user, user already exists! ****" + # echo "**** Using: User ${OE_USER} Home dir: ${OE_HOME} ****" + #else + set +e + sudo mkdir -p $OE_HOME >> $INSTALL_LOG + # FIX OWNERSHIP ON ODOO HOME DIR. BUG CAUSED NODE TO BREAK SO FRONT END HAD NO CSS, NO IMAGES. + sudo chown -R $OE_USER:$OE_USER $OE_HOME >> $INSTALL_LOG + set -e + sudo adduser --system --shell=/bin/bash --home=$OE_HOME --gecos 'ODOO' --group $OE_USER >> $INSTALL_LOG + sudo chown $OE_USER. $OE_HOME >> $INSTALL_LOG + set +e + if [[ $OE_RUN_SERVICE_AS_SUPERADMIN == "True" ]]; then + #The user should also be added to the sudo'ers group. + sudo adduser $OE_USER sudo >> $INSTALL_LOG + else + #Remove user from the sudo group, in case it was added on a previous install. + sudo deluser $OE_USER sudo >> $INSTALL_LOG + fi + set -e +} + +function delete_odoo_system_user { + sudo deluser $OE_USER sudo >> $INSTALL_LOG + sudo deluser --remove-home $OE_USER >> $INSTALL_LOG +} -echo -e "\n---- Create custom module directory ----" -sudo su $OE_USER -c "mkdir $OE_HOME/custom" -sudo su $OE_USER -c "mkdir $OE_HOME/custom/addons" +function create_user_only { + # creates odoo system user, odoo group, AND odoo home dir with correct ownership. user password is empty. + sudo adduser --system --shell=/bin/bash --home=$OE_HOME --gecos 'ODOO' --group $OE_USER >> $INSTALL_LOG + sudo addgroup $OE_USER sudo +} -echo -e "\n---- Setting permissions on home folder ----" -sudo chown -R $OE_USER:$OE_USER $OE_HOME/* +function create_log_directory { + local logdir="/var/log/${OE_USER}" + set +e + sudo mkdir -p $logdir >> $INSTALL_LOG + set -e + sudo chown $OE_USER:$OE_USER $logdir >> $INSTALL_LOG +} -echo -e "* Create server config file" +function install_odoo_enterprise_addons { + sudo mkdir -p $OE_ENTERPRISE_ADDONS >> $INSTALL_LOG + sudo chown -R ${OE_USER}. $OE_ENTERPRISE_ADDONS >> $INSTALL_LOG + cd $OE_ENTERPRISE_ADDONS + local OE_GITHUB_ENTERPRISE_URL="https://github.com/odoo/enterprise" + local GITHUB_COMMAND="git clone --depth 1 --branch $OE_VERSION $OE_GITHUB_ENTERPRISE_URL ." + local GITHUB_RESPONSE=$($GITHUB_COMMAND 2>&1) + while [[ "$GITHUB_RESPONSE" == *"Authentication"* ]]; do + echo "------------------------WARNING------------------------------" + echo "Your authentication with Github has failed! Please try again." + echo "In order to clone and install the Odoo enterprise version you" + echo "need to be an offical Odoo partner and you need access to" + echo "http://github.com/odoo/enterprise." + echo "TIP: Press ctrl+c to stop this script." + echo "-------------------------------------------------------------" + echo " " + GITHUB_RESPONSE=$($GITHUB_COMMAND 2>&1) + done + cd ~ + if [[ $update == "True" ]]; then + cd $OE_ENTERPRISE_ADDONS + update_repo_in_current_dir + ######stop_odoo_server + cd ~ + fi +} -sudo touch /etc/${OE_CONFIG}.conf -echo -e "* Creating server config file" -sudo su root -c "printf '[options] \n; This is the password that allows database operations:\n' >> /etc/${OE_CONFIG}.conf" -sudo su root -c "printf 'admin_passwd = ${OE_SUPERADMIN}\n' >> /etc/${OE_CONFIG}.conf" -sudo su root -c "printf 'xmlrpc_port = ${OE_PORT}\n' >> /etc/${OE_CONFIG}.conf" -sudo su root -c "printf 'logfile = /var/log/${OE_USER}/${OE_CONFIG}\n' >> /etc/${OE_CONFIG}.conf" -if [ $IS_ENTERPRISE = "True" ]; then - sudo su root -c "printf 'addons_path=${OE_HOME}/enterprise/addons,${OE_HOME_EXT}/addons\n' >> /etc/${OE_CONFIG}.conf" -else - sudo su root -c "printf 'addons_path=${OE_HOME_EXT}/addons,${OE_HOME}/custom/addons\n' >> /etc/${OE_CONFIG}.conf" -fi -sudo chown $OE_USER:$OE_USER /etc/${OE_CONFIG}.conf -sudo chmod 640 /etc/${OE_CONFIG}.conf +function install_enterprise_libraries { + set -e + sudo apt-get install -y nodejs npm >> $INSTALL_LOG + sudo npm install -g less less-plugin-clean-css >> $INSTALL_LOG + set +e + sudo ln -s /usr/bin/nodejs /usr/bin/node >> $INSTALL_LOG + set -e +} -echo -e "* Create startup file" -sudo su root -c "echo '#!/bin/sh' >> $OE_HOME_EXT/start.sh" -sudo su root -c "echo 'sudo -u $OE_USER $OE_HOME_EXT/openerp-server --config=/etc/${OE_CONFIG}.conf' >> $OE_HOME_EXT/start.sh" -sudo chmod 755 $OE_HOME_EXT/start.sh +function create_custom_module_dir { + set +e + sudo su $OE_USER -c "mkdir -p $OE_CUSTOM_ADDONS" >> $INSTALL_LOG + set -e +} -#-------------------------------------------------- -# Adding ODOO as a deamon (initscript) -#-------------------------------------------------- +function set_permissions_home_dir { + sudo chown -R $OE_USER:$OE_USER $OE_HOME >> $INSTALL_LOG +} -echo -e "* Create init file" -cat < ~/$OE_CONFIG +function create_odoo_server_config_file { + local config=~/${OE_CONFIG}.conf + local community_addons_dirs="${OE_HOME_EXT}/addons,${OE_CUSTOM_ADDONS}" + addons_dirs=$community_addons_dirs + if [[ $IS_ENTERPRISE == "True" ]]; then + addons_dirs="${OE_ENTERPRISE_ADDONS},${community_addons_dirs}" + fi + cat < $config +[options] +; This is the password that allows database operations: +admin_passwd = ${OE_SUPERADMIN} +#db_host = localhost +#db_port = 5432 +#db_user = odoo +#db_password = pwd +#dbfilter = ^$domain.*$ +xmlrpc_port = ${OE_PORT} +proxy_mode = ${nginx} +; workers must be non-zero so that odoo will give LiveChat its own process so it can listen on its own port. +workers = $_workers +logfile = /var/log/${OE_USER}/${OE_CONFIG} +addons_path=${addons_dirs} +EOF + sudo chown $OE_USER:$OE_USER $config >> $INSTALL_LOG + sudo chmod 640 $config >> $INSTALL_LOG + sudo mkdir -p /etc/odoo >> $INSTALL_LOG + sudo mv $config /etc/odoo/${OE_CONFIG}.conf >> $INSTALL_LOG +} + +function create_startup_file { + temp=~/temp0.sh + rm -f $temp + cat < $temp +#!/bin/sh +sudo -u $OE_USER $OE_HOME_EXT/${OE_USER}-bin --config=/etc/odoo/${OE_CONFIG}.conf +EOF + chmod 0755 $temp + sudo chown $OE_USER. $temp + sudo mv $temp $OE_HOME_EXT/start.sh +} + +function create_odoo_init_file { + cat < ~/${OE_CONFIG}.tmp0 #!/bin/sh ### BEGIN INIT INFO # Provides: $OE_CONFIG @@ -191,8 +677,8 @@ NAME=$OE_CONFIG DESC=$OE_CONFIG # Specify the user name (Default: odoo). USER=$OE_USER -# Specify an alternate config file (Default: /etc/openerp-server.conf). -CONFIGFILE="/etc/${OE_CONFIG}.conf" +# Specify an alternate config file (Default: /etc/odoo/odoo-server.conf). +CONFIGFILE="/etc/odoo/${OE_CONFIG}.conf" # pidfile PIDFILE=/var/run/\${NAME}.pid # Additional options that are passed to the Daemon. @@ -237,25 +723,288 @@ exit 1 esac exit 0 EOF +} + +function security_init_file { + sudo mv ~/$OE_CONFIG.tmp0 /etc/init.d/$OE_CONFIG >> $INSTALL_LOG + sudo chmod 0755 /etc/init.d/$OE_CONFIG >> $INSTALL_LOG + sudo chown root: /etc/init.d/$OE_CONFIG >> $INSTALL_LOG +} + +function start_odoo_on_startup { + sudo update-rc.d $OE_CONFIG defaults >> $INSTALL_LOG + sudo systemctl enable $OE_CONFIG >> $INSTALL_LOG +} + +create_odoo_systemd_service () { + cat < ~/${OE_CONFIG}.service +[Unit] +Description=$OE_CONFIG (Odoo $OE_VERSION $flavor) +Requires=postgresql.service +After=network.target postgresql.service + +[Service] +Type=simple +SyslogIdentifier=$OE_CONFIG +PermissionsStartOnly=true +User=$OE_USER +Group=$OE_USER +#ExecStart=/opt/odoo/odoo11-venv/bin/python3 /opt/odoo/odoo11/odoo-bin -c /etc/odoo11.conf +ExecStart=$(which python3) $OE_HOME_EXT/odoo-bin -c /etc/odoo/$OE_CONFIG.conf +StandardOutput=journal+console + +[Install] +WantedBy=multi-user.target +EOF + sudo chmod 0644 ~/${OE_CONFIG}.service >> $INSTALL_LOG + sudo chown root:root ~/${OE_CONFIG}.service >> $INSTALL_LOG + sudo mv ~/${OE_CONFIG}.service /etc/systemd/system/${OE_CONFIG}.service >> $INSTALL_LOG + sudo systemctl enable ${OE_CONFIG} >> $INSTALL_LOG +} + +function start_odoo { + sudo service ${OE_CONFIG} restart -u all >> $INSTALL_LOG +} + +function show_odoo_status { + sudo service ${OE_CONFIG} status +} + +function remove_sysvinit_service () { + # 2. disable start odoo on startup. + sudo update-rc.d ${OE_CONFIG} disable + sudo update-rc.d ${OE_CONFIG} remove + # 3. remove init file. + sudo rm /etc/init.d/${OE_CONFIG} + # 3b. clean up service daemon system settings. + sudo systemctl daemon-reload +} + +function uninstall_odoo () { + # 1. Stop odoo-server "$OE_CONFIG" if running. + sudo service ${OE_CONFIG} stop + # 2-3. Remove SysV Init service. + remove_sysvinit_service + # 4. remove /home/odoo/odoo-server dir (odoo community from github). + sudo rm -r ${OE_HOME_EXT} + # 4a. Remove downloaded wkhtmltox* + sudo rm ${OE_HOME}/wkhtmltox* + # 5. remove enterprise addons dir? + #sudo rm -r ${OE_ENTERPRISE_ADDONS} + # 6. remove /home/odoo/custom/addons dir? + #sudo rm -r ${OE_CUSTOM_ADDONS} + # 7. remove /var/log/odoo ? + sudo rm -r /var/log/${OE_USER}/${OE_CONFIG} + # 8. delete odoo system user ? + delete_odoo_system_user + # 9. remove system packages ? Use autoremove. apt will remove only unused packages. + sudo apt autoremove + # 10. remove python dependencies ? +} + +function show_help { + echo "-h --help Show help (this page)." + echo "--delete-start-over Uninstall $OE_CONFIG, delete odoo user $OE_USER + homedir $OE_HOME_EXT , create odoo user (as superadmin so this script can run) + homedir." + echo "-E --enterprise Install Odoo Enterprise $OE_VERSION" + echo "--livechatport=8072 Livechat port number, must be different than other Odoo livechat instances running on same IP address." + echo "--nginx --email=me@myemail.com --domain=mycompany.com Install nginx support + free LE HTTPS cert" + echo "--self-update Update this script, $0" + echo "--uninstall Uninstall Odoo $OE_CONFIG from $OE_HOME_EXT" + echo "-u --update --upgrade Update Odoo instance $OE_CONFIG in $OE_HOME_EXT with the latest update." + echo "--upgrade-python-libraries Upgrade the python libraries, used by Odoo, to their latest versions." + echo "-V --version Show version of $0" + echo "--virtualenv Install libraries to isolated virtual environment in your user home dir." +} -echo -e "* Security Init File" -sudo mv ~/$OE_CONFIG /etc/init.d/$OE_CONFIG -sudo chmod 755 /etc/init.d/$OE_CONFIG -sudo chown root: /etc/init.d/$OE_CONFIG +################################ + +cd ~ +#Clear previous odoo_install.log file to empty. +clear_install_log +echo "Odoo Installer version $versiondate" +echo "by Yenthe Van Ginneken and Chris Coleman (EspaceNetworks)." +echo "System Memory detected: $_totalmb MB" +echo "Free space on $OE_HOME : $_diskfree" + +command_line_args="$@" +process_command_line $command_line_args +if [[ $_version == "True" ]]; then + echo "For usage: $0 --help" + exit #just showed version (above). +fi +if [[ $help == "True" ]]; then + show_help + exit +fi +if [[ $_self_update == "True" ]]; then + self_update + echo "$0 updated OK." + exit +fi +if [[ $update == "True" ]]; then + echo "Update: $OE_HOME_EXT" + cd $OE_HOME_EXT + update_repo_in_current_dir + cd ~ + exit +fi +if [[ $_upgrade_python_libraries == "True" ]]; then + echo "Upgrade python libraries." + echo "a. Update server" + update_server + echo "b. Install OS dependencies" + install_dependencies + echo "c. Upgrade pip" + upgrade_pip + echo "d. Install upgraded python libraries" + install_python_libraries + echo "e. Done, installed upgraded python libraries." + exit +fi +can_i_sudo +if [[ "$_superadmin" == 0 ]]; then + echo "You cannot sudo. Next version will work for you. Or run as user with sudo priviliges." + exit +fi +get_flavor_name + +if [[ "$uninstall" == "True" ]]; then + echo "*** Uninstalling service: ${OE_CONFIG} Removing: ${OE_HOME_EXT} (Assuming Odoo ${OE_VERSION} ${flavor}) ****" + uninstall_odoo + exit +fi +if [[ "$delete_start_over" == "True" ]]; then + echo "*** Deleting and starting over with fresh ordinary user to run this install script as. ****" + uninstall_odoo + echo "**** Creating user $OE_USER as superadmin, and home dir $OE_HOME ****" + create_user_only + exit +fi +if [[ "$_virtualenv" == "True" ]]; then + install_odoo_python_requirements_virtualenv + exit +fi + +echo "Installing: Odoo $OE_VERSION $flavor to $OE_HOME_EXT" +echo "---- 1. Stop odoo server (if running) ----" +stop_odoo_server + +echo "---- 2. Update operating system ----" +update_server + +if [[ "$nginx" == "True" ]]; then + if [[ $email == "" ]] || [[ $domain == "" ]]; then + echo "ERROR: to install nginx + LE HTTPS, you must specify both --email= and --domain=" + exit 1 + else + echo "---- 3. Installing Nginx + LE HTTPS cert (email: $email domain: $domain ) ----" + verify_domain_exists + if [[ "$_domain_exists" == "False" ]]; then + echo "ERROR: domain $domain does not exist. Nginx + HTTPS requires domain. Check DNS and try again." + exit 1 + fi + if [[ "$email" == "" ]]; then + echo "ERROR: provide your email address for Let's Encrypt HTTPS cert 90 day renewal notifications." + echo "Example: $0 --nginx --domain=$domain --email=myname@myemail.com" + exit 1 + fi + install_nginx_with_LE_https_cert + fi +fi + +echo "---- 4. Install PostgreSQL Server + Create ODOO PostgreSQL User ----" +install_postgresql + +echo "---- 5. Update postgresql template1 for UTF-8 charset ----" +update_postgresql_template + +echo "---- 6. Install Python 3 + pip3 + tool packages + python packages + other required--" +install_dependencies + +echo "---- 7. Download ODOO Server ----" +download_odoo + +echo "---- 8. Upgrade pip ----" +upgrade_pip + +echo "---- 9. Install python libraries ----" +install_python_libraries + +### INSTALL PYTHON PACKAGES FROM REQUIREMENTS.TXT AND VIRTUALENV +### THIS WILL HALT (OUT OF MEMORY) BUILDING LXML ON LOW FREE RAM SERVER, +### USING PREBUILT DISTRO PYTHON PACKAGES ABOVE INSTEAD. +###echo -e "---- Install python packages and virtualenv ----" +###install_odoo_python_requirements_virtualenv + +if [[ $INSTALL_WKHTMLTOPDF == "True" ]]; then + echo "---- 10. Install wkhtml and create shortcuts ----" + install_wkhtmltopdf +else + echo "---- 10. Wkhtmltopdf isn't installed due to the choice of the user! ----" +fi + +echo "---- 11. Create ODOO system user ----" +create_odoo_system_user +set_permissions_home_dir + +echo "---- 12. Create Odoo Server Log directory ----" +create_log_directory + +if [ $IS_ENTERPRISE == "True" ]; then + # Odoo Enterprise install! + echo "---- 13. Install ODOO Enterprise addons ----" + set +e + install_odoo_enterprise_addons + echo "---- DONE. Added Enterprise addons in $OE_ENTERPRISE_ADDONS ----" + set -e +fi + +echo -e "---- 14. Install npm nodejs less less-plugin-clean-css + shortcut ----" +# These (npm nodejs less etc) are needed by enterprise AND community. +install_enterprise_libraries + +echo "---- 15. Create custom module directory ----" +create_custom_module_dir + +echo "---- 16. Set permissions on home dir $OE_HOME ----" +set_permissions_home_dir + +echo "17. Create server config (settings) file" +create_odoo_server_config_file + +echo "18. Create startup (shell command) file" +create_startup_file + +if [[ $_sysvinit == "True" ]]; then + #OLD SYSV INIT SERVICE. + echo "19. Create init (service) file" + create_odoo_init_file + echo "20. Security Init File" + security_init_file + echo "21. Start ODOO on Startup" + start_odoo_on_startup +else + #NEW SYSTEMD SERVICE + echo "18b. Remove old SysV Init service." + set +e + remove_sysvinit_service #clean up old sysv init service if it's there and we're installing over it. + set -e + echo "19-21. Create systemd (service) file + Security systemd file + Start ODOO on startup" + create_odoo_systemd_service +fi -echo -e "* Start ODOO on Startup" -sudo update-rc.d $OE_CONFIG defaults +echo "22. Starting Odoo Service" +start_odoo -echo -e "* Starting Odoo Service" -sudo su root -c "/etc/init.d/$OE_CONFIG start" echo "-----------------------------------------------------------" echo "Done! The Odoo server is up and running. Specifications:" echo "Port: $OE_PORT" echo "User service: $OE_USER" echo "User PostgreSQL: $OE_USER" -echo "Code location: $OE_USER" -echo "Addons folder: $OE_USER/$OE_CONFIG/addons/" +echo "Code location: $OE_HOME_EXT/" +echo "Addons folders: $addons_dirs" echo "Start Odoo service: sudo service $OE_CONFIG start" echo "Stop Odoo service: sudo service $OE_CONFIG stop" echo "Restart Odoo service: sudo service $OE_CONFIG restart" echo "-----------------------------------------------------------" +show_odoo_status