From 5062e3cd42827f98451134c0685b12e6c912ce2a Mon Sep 17 00:00:00 2001 From: yhaelopez Date: Wed, 20 Dec 2023 11:12:15 -0700 Subject: [PATCH] odoocker upgrade --- .env.example | 11 ++- docker-compose.yml | 41 ++++++----- odoo/Dockerfile | 73 ++++++++++--------- odoo/clone-addons.sh | 70 ++++++++++++++++++ odoo/clone-enterprise.sh | 7 ++ odoo/custom-addons/DELETE_ME.txt | 2 +- odoo/entrypoint.sh | 6 +- odoo/extra-addons/DELETE_ME.txt | 2 + .../odoocker_base/__manifest__.py | 24 ------ .../data/ir_config_parameter.xml | 14 ---- odoo/odoo.conf | 2 +- odoo/requirements.txt | 5 +- odoo/third-party-addons.sh | 24 ------ odoo/third-party-addons.txt | 13 ++++ 14 files changed, 165 insertions(+), 129 deletions(-) create mode 100755 odoo/clone-addons.sh create mode 100755 odoo/clone-enterprise.sh create mode 100644 odoo/extra-addons/DELETE_ME.txt delete mode 100644 odoo/extra-addons/odoocker_base/__manifest__.py delete mode 100644 odoo/extra-addons/odoocker_base/data/ir_config_parameter.xml delete mode 100755 odoo/third-party-addons.sh create mode 100644 odoo/third-party-addons.txt diff --git a/.env.example b/.env.example index ec36869..ca1e25a 100644 --- a/.env.example +++ b/.env.example @@ -8,9 +8,10 @@ UPDATE= LOAD=base,web ROOT_PATH=/usr/lib/python3/dist-packages/odoo WORKERS=0 -DEV_MODE=reload,xml DOMAIN=erp.odoocker.test ADMIN_PASSWD=odoo +# Use reload,xml to enable hot reload in python and xml files +DEV_MODE= # Services PROJECT_NAME=odoocker @@ -19,13 +20,17 @@ SERVICES=odoo,nginx,proxy,postgres # Service configuration USE_REDIS=false USE_S3=false -USE_SENTRY=false # Currently not working +USE_SENTRY=false USE_PGADMIN=false -# Enterprise +# GitHub user and access token to clone private repositories GITHUB_USER= GITHUB_ACCESS_TOKEN= +# GitHub user and access token to clone Enterprise repository +ENTERPRISE_USER=${GITHUB_USER} +ENTERPRISE_ACCESS_TOKEN=${GITHUB_ACCESS_TOKEN} + # Database DB_HOST=postgres DB_PORT=5432 diff --git a/docker-compose.yml b/docker-compose.yml index 881af96..7a34114 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,9 +7,11 @@ services: - ODOO_TAG - ODOO_RC - ROOT_PATH + - ENTERPRISE_USER + - ENTERPRISE_ACCESS_TOKEN + - ENTERPRISE_ADDONS - GITHUB_USER - GITHUB_ACCESS_TOKEN - - ENTERPRISE_ADDONS - THIRD_PARTY_ADDONS - LOG_PATH - USE_REDIS @@ -115,6 +117,24 @@ services: - internal profiles: [$NGINX_PROXY_PROFILES] + letsencrypt: + image: nginxproxy/acme-companion:${ACME_COMPANION_TAG} + depends_on: + - nginx-proxy + volumes_from: + - nginx-proxy:rw + volumes: + - certs:${NGINX_CERTS}:rw + - acme:${NGINX_ACME} + - ${DOCKER_SOCK}:${DOCKER_SOCK}:ro + environment: + - ACME_CA_URI + - CERTS_UPDATE_INTERVAL + - DEFAULT_EMAIL + networks: + - internal + profiles: [$ACME_COMPANION_PROFILES] + redis: image: eqalpha/keydb:${KEYDB_TAG} platform: linux/amd64 @@ -144,24 +164,6 @@ services: - internal profiles: [$MINIO_PROFILES] - letsencrypt: - image: nginxproxy/acme-companion:${ACME_COMPANION_TAG} - depends_on: - - nginx-proxy - volumes_from: - - nginx-proxy:rw - volumes: - - certs:${NGINX_CERTS}:rw - - acme:${NGINX_ACME} - - ${DOCKER_SOCK}:${DOCKER_SOCK}:ro - environment: - - ACME_CA_URI - - CERTS_UPDATE_INTERVAL - - DEFAULT_EMAIL - networks: - - internal - profiles: [$ACME_COMPANION_PROFILES] - pgadmin: build: context: ./ @@ -169,7 +171,6 @@ services: args: - PGADMIN_TAG depends_on: - - postgres - nginx-proxy expose: - 80 diff --git a/odoo/Dockerfile b/odoo/Dockerfile index ebeaa6e..0d8c01a 100644 --- a/odoo/Dockerfile +++ b/odoo/Dockerfile @@ -11,9 +11,11 @@ USER root ARG ODOO_TAG ARG ROOT_PATH ARG LOG_PATH +ARG ENTERPRISE_USER +ARG ENTERPRISE_ACCESS_TOKEN +ARG ENTERPRISE_ADDONS ARG GITHUB_USER ARG GITHUB_ACCESS_TOKEN -ARG ENTERPRISE_ADDONS ARG THIRD_PARTY_ADDONS ARG ODOO_RC ARG USE_REDIS @@ -22,20 +24,32 @@ ARG USE_SENTRY ENV ODOO_TAG=${ODOO_TAG} \ LOG_PATH=${LOG_PATH} \ + ENTERPRISE_USER=${ENTERPRISE_USER} \ + ENTERPRISE_ACCESS_TOKEN=${ENTERPRISE_ACCESS_TOKEN} \ + ENTERPRISE_ADDONS=${ENTERPRISE_ADDONS} \ GITHUB_USER=${GITHUB_USER} \ GITHUB_ACCESS_TOKEN=${GITHUB_ACCESS_TOKEN} \ - ENTERPRISE_ADDONS=${ENTERPRISE_ADDONS} \ THIRD_PARTY_ADDONS=${THIRD_PARTY_ADDONS} \ ODOO_RC=${ODOO_RC} \ USE_REDIS=${USE_REDIS} \ USE_S3=${USE_S3} \ USE_SENTRY=${USE_SENTRY} +#---------------------# +# Logging # +#---------------------# +# Create odoo.log file +RUN touch ${LOG_PATH} && chown odoo:odoo ${LOG_PATH} + #------------------------# # APT Dependencies # #------------------------# +# Install Odoocker image dependencies RUN apt-get update && apt-get install -y \ - apt-utils \ + # `zip` and `unzip` for filestore management + zip \ + unzip \ + # `git` required packages git \ git-man \ less \ @@ -43,59 +57,46 @@ RUN apt-get update && apt-get install -y \ libcurl3-gnutls \ libedit2 \ liberror-perl \ + libpcre2-8-0 \ libxmuu1 \ openssh-client \ patch \ xauth \ - # Clean up the apt cache to reduce the image size + # Remove apt lists && rm -rf /var/lib/apt/lists/* +#-----------------------# +# Odoo Enterprise # +#-----------------------# +# Create Enterprise addons directory +RUN mkdir -p ${ENTERPRISE_ADDONS} && chown odoo:odoo -R ${ENTERPRISE_ADDONS} + +# Clone Enterprise addons if user and token are present +COPY --chown=odoo:odoo ./odoo/clone-enterprise.sh / +RUN /clone-enterprise.sh + #---------------------# # PIP Dependecies # #---------------------# -# Upgrade pip -RUN pip3 install --upgrade pip - # Copy & Install PIP requirements COPY --chown=odoo:odoo ./odoo/requirements.txt /tmp/requirements.txt RUN python3 -m pip install -r /tmp/requirements.txt && \ rm /tmp/requirements.txt -#-----------------------# -# Odoo Enterprise # -#-----------------------# - -# Create Enterprise addons directory -RUN mkdir -p ${ENTERPRISE_ADDONS} && \ - chown odoo:odoo -R ${ENTERPRISE_ADDONS} - -# Clone Enterprise addons if user and token are present -RUN if [ -n "$GITHUB_USER" ] && [ -n "$GITHUB_ACCESS_TOKEN" ]; then \ - git clone https://${GITHUB_USER}:${GITHUB_ACCESS_TOKEN}@github.com/odoo/enterprise.git ${ENTERPRISE_ADDONS} --depth 1 --branch ${ODOO_TAG} --single-branch --no-tags; \ - fi - -#-------------------------# -# Odoo Extra Addons # -#-------------------------# - -RUN mkdir -p ${THIRD_PARTY_ADDONS} && chown odoo:odoo -R ${THIRD_PARTY_ADDONS} - +#--------------------------# +# Third Party Addons # +#--------------------------# +# Create third-party-addons directory and clone them +RUN mkdir -p ${THIRD_PARTY_ADDONS} COPY --chown=odoo:odoo ./odoo/fix-manifest.py / -COPY --chown=odoo:odoo ./odoo/third-party-addons.sh / -RUN /third-party-addons.sh && chown odoo:odoo -R ${THIRD_PARTY_ADDONS} - -#---------------------# -# Logging # -#---------------------# - -# Create odoo.log file -RUN touch ${LOG_PATH} && chown odoo:odoo ${LOG_PATH} +COPY --chown=odoo:odoo ./odoo/clone-addons.sh / +COPY --chown=odoo:odoo ./odoo/third-party-addons.txt / +RUN /clone-addons.sh && chown odoo:odoo -R ${THIRD_PARTY_ADDONS} #-----------------------# # Odoo Conf # #-----------------------# - # Copy environment variables & script to generate odoo.conf COPY --chown=odoo:odoo ./.env / COPY --chown=odoo:odoo ./odoo/odoo.conf / diff --git a/odoo/clone-addons.sh b/odoo/clone-addons.sh new file mode 100755 index 0000000..ad3da64 --- /dev/null +++ b/odoo/clone-addons.sh @@ -0,0 +1,70 @@ +#!/bin/bash + +set -e + +# Function to clone and copy modules based on conditions +clone_and_copy_modules() { + local repo_type=$1 + local repo_url=$2 + shift 2 + local modules_conditions=("$@") + + # Extract repo name from the URL + repo_name=$(basename -s .git "$repo_url") + + # Determine the clone command based on repo type + local clone_cmd + if [[ $repo_type == "private" ]]; then + clone_cmd="git clone https://${GITHUB_USER}:${GITHUB_ACCESS_TOKEN}@${repo_url#https://}" + else + clone_cmd="git clone $repo_url" + fi + + # Iterate over modules and conditions + for (( i=0; i<${#modules_conditions[@]}; i+=2 )); do + local module=${modules_conditions[i]} + local condition=${modules_conditions[i+1]} + + # Check if the condition is true and clone and copy if needed + if [[ $condition == true ]]; then + # Clone the repository if not already cloned + if [ ! -d "$repo_name" ]; then + echo "Cloning $clone_cmd --depth 1 --branch ${ODOO_TAG} --single-branch --no-tags" + $clone_cmd --depth 1 --branch ${ODOO_TAG} --single-branch --no-tags + fi + # Copy the module + echo "Copying ${module} from ${repo_name} into ${THIRD_PARTY_ADDONS}" + cp -r /${repo_name}/${module} ${THIRD_PARTY_ADDONS}/${module} + fi + done +} + +# Function to manually expand environment variables in a string +expand_env_vars() { + while IFS=' ' read -r -a words; do + for word in "${words[@]}"; do + if [[ $word == \$* ]]; then + varname=${word:2:-1} # Extract the variable name + echo -n "${!varname} " # Substitute with its value + else + echo -n "$word " + fi + done + echo + done <<< "$1" +} + +# Read the configuration file and process each line +while IFS= read -r line; do + # Skip empty lines and lines starting with '#' + if [[ -z "$line" || "$line" == \#* ]]; then + continue + fi + + # Manually replace environment variables in the line with their values + processed_line=$(expand_env_vars "$line") + # Split the processed line into an array + IFS=' ' read -r -a repo_info <<< "$processed_line" + # Call the function with the repository type, URL, and modules with conditions + clone_and_copy_modules "${repo_info[@]}" +done < "third-party-addons.txt" diff --git a/odoo/clone-enterprise.sh b/odoo/clone-enterprise.sh new file mode 100755 index 0000000..7cb53e3 --- /dev/null +++ b/odoo/clone-enterprise.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +set -e + +if [ -n "$ENTERPRISE_USER" ] && [ -n "$ENTERPRISE_ACCESS_TOKEN" ]; then \ + git clone https://${ENTERPRISE_USER}:${ENTERPRISE_ACCESS_TOKEN}@github.com/odoo/enterprise.git ${ENTERPRISE_ADDONS} --depth 1 --branch ${ODOO_TAG} --single-branch --no-tags +fi diff --git a/odoo/custom-addons/DELETE_ME.txt b/odoo/custom-addons/DELETE_ME.txt index e9a6d02..9616a59 100644 --- a/odoo/custom-addons/DELETE_ME.txt +++ b/odoo/custom-addons/DELETE_ME.txt @@ -1 +1 @@ -Delete me once you add your first custom addon :) \ No newline at end of file +Delete me once you add your first custom addon :) diff --git a/odoo/entrypoint.sh b/odoo/entrypoint.sh index 8f04cc2..69aa021 100755 --- a/odoo/entrypoint.sh +++ b/odoo/entrypoint.sh @@ -71,14 +71,14 @@ case "$1" in # Automagically upgrade all addons and install new ones. Ideal for deployment process. echo odoo --config ${ODOO_RC} --database=${DB_NAME} --init=${INIT} --update=all --load=${LOAD} --log-level=${LOG_LEVEL} --load-language=${LOAD_LANGUAGE} --limit-time-cpu=3600 --limit-time-real=7200 --dev= - exec odoo --config ${ODOO_RC} --update=all --without-demo=all --workers=0 --limit-time-cpu=3600 --limit-time-real=7200 --dev= + exec odoo --config ${ODOO_RC} --database=${DB_NAME} --init=${INIT} --update=all --without-demo=all --workers=0 --limit-time-cpu=3600 --limit-time-real=7200 --dev= fi if [ ${APP_ENV} = 'production' ] ; then # Bring up Odoo ready for production. - echo odoo --config ${ODOO_RC} --database=${DB_NAME} --init=${INIT} --update=${UPDATE} --load=${LOAD} --workers=${WORKERS} --log-level=${LOG_LEVEL} --without-demo=${WITHOUT_DEMO} --load-language= --dev= + echo odoo --config ${ODOO_RC} --database= --init=${INIT} --update=${UPDATE} --load=${LOAD} --workers=${WORKERS} --log-level=${LOG_LEVEL} --without-demo=${WITHOUT_DEMO} --load-language= --dev= - exec odoo --config ${ODOO_RC} --init=${INIT} --update=${UPDATE} --load-language= --dev= + exec odoo --config ${ODOO_RC} --database= --init=${INIT} --update=${UPDATE} --load-language= --dev= fi fi ;; diff --git a/odoo/extra-addons/DELETE_ME.txt b/odoo/extra-addons/DELETE_ME.txt new file mode 100644 index 0000000..5e81cae --- /dev/null +++ b/odoo/extra-addons/DELETE_ME.txt @@ -0,0 +1,2 @@ +Delete me once you add your first extra addon :) +This folder is made for addons that are not clonable via GitHub. diff --git a/odoo/extra-addons/odoocker_base/__manifest__.py b/odoo/extra-addons/odoocker_base/__manifest__.py deleted file mode 100644 index 4628660..0000000 --- a/odoo/extra-addons/odoocker_base/__manifest__.py +++ /dev/null @@ -1,24 +0,0 @@ -{ - 'name': 'Odoocker Base', - 'summary': 'Supercharge Odoo with Odoocker', - 'description': ''' - Some Odoocker dependencies require to some custom values that we cover with this Addon for you. - ''', - 'version': '1.0.0', - 'category': 'Technical', - 'license': 'LGPL-3', - 'author': 'Odoocker', - 'maintainer': 'Odoocker', - 'contributors': [ - 'Yhael S ' - ], - 'depends': [ - 'base' - ], - 'data': [ - 'data/ir_config_parameter.xml' - ], - 'application': False, - 'installable': True, - 'auto_install': True -} diff --git a/odoo/extra-addons/odoocker_base/data/ir_config_parameter.xml b/odoo/extra-addons/odoocker_base/data/ir_config_parameter.xml deleted file mode 100644 index 5032b76..0000000 --- a/odoo/extra-addons/odoocker_base/data/ir_config_parameter.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - report.url - http://127.0.0.1:8069 - - - - - ir_attachment.location - s3 - - diff --git a/odoo/odoo.conf b/odoo/odoo.conf index c285553..6832072 100644 --- a/odoo/odoo.conf +++ b/odoo/odoo.conf @@ -226,7 +226,7 @@ stop_after_init = ${STOP_AFTER_INIT} ; --osv-memory-count-limit osv_memory_count_limit = ${OSV_MEMORY_COUNT_LIMIT} -; --transient-age-limit | --osv-memory-age-limit (deprecated) +; --transient-age-limit transient_age_limit = ${TRANSIENT_AGE_LIMIT} ; --max-cron-threads diff --git a/odoo/requirements.txt b/odoo/requirements.txt index 862eb93..bbccdca 100644 --- a/odoo/requirements.txt +++ b/odoo/requirements.txt @@ -1,9 +1,8 @@ -urllib3 -chardet jinja2 +sortedcontainers debugpy websocket-client redis boto3 -sentry-sdk +sentry-sdk==1.9.0 # Fixed because Odoo depends on urllib3==1.26.5 aiohttp diff --git a/odoo/third-party-addons.sh b/odoo/third-party-addons.sh deleted file mode 100755 index d101247..0000000 --- a/odoo/third-party-addons.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash - -set -e - -# Check if the repository directory exists and either Redis or S3 is to be used -if [[ ${USE_REDIS} == "true" || ${USE_S3} == "true" ]]; then - git clone https://github.com/odoocker/odoo-cloud-platform.git --depth 1 --branch ${ODOO_TAG} --single-branch --no-tags; -fi - -if [[ ${USE_REDIS} == "true" ]]; then - cp -r odoo-cloud-platform/session_redis ${THIRD_PARTY_ADDONS}/session_redis -fi - -# Check the USE_S3 variable to decide whether to copy S3 directories -if [[ ${USE_S3} == "true" ]]; then - cp -r odoo-cloud-platform/base_attachment_object_storage ${THIRD_PARTY_ADDONS}/base_attachment_object_storage - cp -r odoo-cloud-platform/attachment_s3 ${THIRD_PARTY_ADDONS}/attachment_s3 -fi - -# Check if the repository directory exists and Sentry is to be used -if [[ ${USE_SENTRY} == "true" ]]; then - git clone https://github.com/odoocker/server-tools.git --depth 1 --branch ${ODOO_TAG} --single-branch --no-tags; - cp -r server-tools/sentry ${THIRD_PARTY_ADDONS}/sentry -fi diff --git a/odoo/third-party-addons.txt b/odoo/third-party-addons.txt new file mode 100644 index 0000000..2153994 --- /dev/null +++ b/odoo/third-party-addons.txt @@ -0,0 +1,13 @@ +# This file is read by clone-addons.sh + +# Odoocker repositories +public https://github.com/odoocker/odoocker-modules.git odoocker_base true +public https://github.com/odoocker/odoo-cloud-platform.git session_redis ${USE_REDIS} base_attachment_object_storage ${USE_S3} attachment_s3 ${USE_S3} +public https://github.com/odoocker/server-tools.git sentry ${USE_SENTRY} + +# Add repositories with the following format: +# ... + +# Public repositories + +# Private repositories