From 007ffc441c712a2b93bf8356f1e9c861d2ad7e1f Mon Sep 17 00:00:00 2001 From: Yhael S Date: Sat, 30 Sep 2023 22:58:38 -0500 Subject: [PATCH 1/8] added s3 integration --- .env.example | 29 ++++++++++- docker-compose.yml | 18 +++++++ odoo/Dockerfile | 24 ++++----- .../data/ir_config_parameter.xml | 6 +++ odoo/odoorc.sh | 25 ++++++++++ odoo/requirements.txt | 1 + odoo/third-party-addons.sh | 50 ++++++++++++++++++- 7 files changed, 138 insertions(+), 15 deletions(-) diff --git a/.env.example b/.env.example index 78b2152..698aaee 100644 --- a/.env.example +++ b/.env.example @@ -5,7 +5,7 @@ APP_ENV=local INIT= UPDATE= -LOAD=base,web,session_redis +LOAD=base,web,session_redis,attachment_s3 WORKERS=2 DEV_MODE=reload,xml DOMAIN=erp.odoocker.test @@ -69,6 +69,18 @@ REDIS_PREFIX=odoo REDIS_EXPIRATION=604800 REDIS_EXPIRATION_ANONYMOUS=10800 +# Filesystem +MINIO_VIRTUAL_HOST=s3.j8c.test +MINIO_CONSOLE_PORT=9000 +MINIO_VIRTUAL_PORT=9001 +DISABLE_S3_STORAGE=0 + +AWS_ACCESS_KEY_ID=myaccesskey +AWS_SECRET_ACCESS_KEY=mysecretkey +AWS_REGION= +AWS_HOST=http://s3:${MINIO_CONSOLE_PORT} +AWS_BUCKETNAME=${DB_NAME} + # PgAdmin PGADMIN_DOMAIN=pgadmin.odoocker.test PGADMING_DB_NAME=pgadmin @@ -265,6 +277,21 @@ ODOO_SESSION_REDIS_PREFIX=${REDIS_PREFIX} ODOO_SESSION_REDIS_EXPIRATION=${REDIS_EXPIRATION} ODOO_SESSION_REDIS_EXPIRATION_ANONYMOUS=${REDIS_EXPIRATION_ANONYMOUS} +#----------# +# S3 # +#----------# +AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} +AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} +AWS_REGION=${AWS_REGION} +AWS_HOST=${AWS_HOST} +AWS_BUCKETNAME=${AWS_BUCKETNAME} + +DISABLE_ATTACHMENT_STORAGE=${DISABLE_S3_STORAGE} +MINIO_ROOT_USER=${AWS_ACCESS_KEY_ID} +MINIO_ROOT_PASSWORD=${AWS_SECRET_ACCESS_KEY} +MINIO_VIRTUAL_HOST=${MINIO_VIRTUAL_HOST} +MINIO_BROWSER_REDIRECT_URL=${MINIO_VIRTUAL_HOST} + #-------------# # PgAdmin # #-------------# diff --git a/docker-compose.yml b/docker-compose.yml index cda6f9d..61f82e9 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -63,6 +63,23 @@ services: volumes: - redis-data:/var/lib/keydb + s3: + image: minio/minio:latest + environment: + - MINIO_ROOT_USER + - MINIO_ROOT_PASSWORD + - VIRTUAL_HOST=${MINIO_VIRTUAL_HOST} + - VIRTUAL_PORT=${MINIO_VIRTUAL_PORT} + - MINIO_BROWSER_REDIRECT_URL + command: server /data --console-address ":9001" + volumes: + - s3_data:/data + ports: + - 9000:9000 + - 9001:9001 + networks: + - internal + nginx: image: nginx:${NGINX_TAG} depends_on: @@ -105,6 +122,7 @@ volumes: odoo-data: pg-data: redis-data: + s3_data: certs: vhost: html: diff --git a/odoo/Dockerfile b/odoo/Dockerfile index 225809e..9111d0c 100644 --- a/odoo/Dockerfile +++ b/odoo/Dockerfile @@ -44,6 +44,18 @@ RUN apt-get update && apt-get install -y \ # Clean up the apt cache to reduce the image size && rm -rf /var/lib/apt/lists/* +#---------------------# +# 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 # #-----------------------# @@ -67,18 +79,6 @@ RUN mkdir -p ${THIRD_PARTY_ADDONS} && \ COPY --chown=odoo:odoo ./odoo/third-party-addons.sh / RUN /third-party-addons.sh && chown odoo:odoo ${THIRD_PARTY_ADDONS} -#---------------------# -# 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 - #---------------------# # Logging # #---------------------# diff --git a/odoo/extra-addons/odoocker_base/data/ir_config_parameter.xml b/odoo/extra-addons/odoocker_base/data/ir_config_parameter.xml index 9e9fb65..5032b76 100644 --- a/odoo/extra-addons/odoocker_base/data/ir_config_parameter.xml +++ b/odoo/extra-addons/odoocker_base/data/ir_config_parameter.xml @@ -5,4 +5,10 @@ report.url http://127.0.0.1:8069 + + + + ir_attachment.location + s3 + diff --git a/odoo/odoorc.sh b/odoo/odoorc.sh index db971c8..81a9b07 100755 --- a/odoo/odoorc.sh +++ b/odoo/odoorc.sh @@ -109,6 +109,13 @@ defaults=( [ODOO_SESSION_REDIS_PREFIX]=${ODOO_SESSION_REDIS_PREFIX} [ODOO_SESSION_REDIS_EXPIRATION]=${ODOO_SESSION_REDIS_EXPIRATION} [ODOO_SESSION_REDIS_EXPIRATION_ANONYMOUS]=${ODOO_SESSION_REDIS_EXPIRATION_ANONYMOUS} + + [DISABLE_ATTACHMENT_STORAGE]=${DISABLE_ATTACHMENT_STORAGE} + [AWS_HOST]=${AWS_HOST} + [AWS_REGION]=${AWS_REGION} + [AWS_ACCESS_KEY_ID]=${AWS_ACCESS_KEY_ID} + [AWS_SECRET_ACCESS_KEY]=${AWS_SECRET_ACCESS_KEY} + [AWS_BUCKETNAME]=${AWS_BUCKETNAME} ) # Define the template @@ -405,6 +412,24 @@ ODOO_SESSION_REDIS_EXPIRATION = {ODOO_SESSION_REDIS_EXPIRATION} ; -- Time in seconds before expiration of the anonymous sessions (default is 3 hours) ODOO_SESSION_REDIS_EXPIRATION_ANONYMOUS = {ODOO_SESSION_REDIS_EXPIRATION_ANONYMOUS} +;----------; +; S3 ; +;----------; +; -- Disable S3 storage +DISABLE_ATTACHMENT_STORAGE = {DISABLE_ATTACHMENT_STORAGE} + +; -- Not required if using AWS S3 +AWS_HOST = {AWS_HOST} + +; -- Required if using AWS services +AWS_REGION = {AWS_REGION} + +AWS_ACCESS_KEY_ID = {AWS_ACCESS_KEY_ID} +AWS_SECRET_ACCESS_KEY = {AWS_SECRET_ACCESS_KEY} + +; Optional {db_name} placeholder +AWS_BUCKETNAME = {AWS_BUCKETNAME} + EOF ) diff --git a/odoo/requirements.txt b/odoo/requirements.txt index 759b3e9..181b3bb 100644 --- a/odoo/requirements.txt +++ b/odoo/requirements.txt @@ -1,3 +1,4 @@ debugpy websocket-client redis +boto3 diff --git a/odoo/third-party-addons.sh b/odoo/third-party-addons.sh index a5d82d9..4b1d3db 100755 --- a/odoo/third-party-addons.sh +++ b/odoo/third-party-addons.sh @@ -1,2 +1,48 @@ -git clone https://github.com/camptocamp/odoo-cloud-platform.git --depth 1 --branch ${ODOO_TAG} --single-branch --no-tags; -cp -r odoo-cloud-platform/session_redis ${THIRD_PARTY_ADDONS}/session_redis +# Check if the repository directory exists +if [ ! -d "odoo-cloud-platform" ]; then + git clone https://github.com/camptocamp/odoo-cloud-platform.git --depth 1 --branch ${ODOO_TAG} --single-branch --no-tags; + cp -r odoo-cloud-platform/session_redis ${THIRD_PARTY_ADDONS}/session_redis + 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 + +# Define the path to the manifest file +manifest_file_path="${THIRD_PARTY_ADDONS}/attachment_s3/__manifest__.py" + +# Use Python to modify the manifest file +python3 -c " +filename = '${manifest_file_path}' + +# Read the file content +with open(filename, 'r') as file: + lines = file.readlines() + +# Find the start and end index of the manifest dictionary +start_index = next(i for i, line in enumerate(lines) if line.strip().startswith('{')) +end_index = next(i for i, line in enumerate(lines) if line.strip().endswith('}')) + +# Construct and evaluate the manifest dictionary +manifest_dict = eval(''.join(lines[start_index:end_index + 1])) + +# Modify the manifest dictionary +manifest_dict['installable'] = True +manifest_dict['auto_install'] = True + +# Construct the modified manifest string +modified_manifest_lines = ['{\n'] +for key, value in manifest_dict.items(): + modified_manifest_lines.append(f' \'{key}\': {repr(value)},\n') +modified_manifest_lines.append('}\n') + +# Replace the manifest dictionary string in the content +lines[start_index:end_index + 1] = modified_manifest_lines + +# Write the modified content back to the file +with open(filename, 'w') as file: + file.writelines(lines) +" + +echo "Modified $manifest_file_path" + +# Optional: Cat the file to verify changes +cat $manifest_file_path \ No newline at end of file From 55270202abb682d9b145aa7b420104151ffdaf4d Mon Sep 17 00:00:00 2001 From: Yhael S Date: Sat, 30 Sep 2023 23:36:11 -0500 Subject: [PATCH 2/8] enhanced manifest manipulation --- docker-compose.yml | 2 -- odoo/Dockerfile | 1 + odoo/fix-manifest.py | 34 +++++++++++++++++++++++++++++++ odoo/third-party-addons.sh | 41 +++----------------------------------- 4 files changed, 38 insertions(+), 40 deletions(-) create mode 100644 odoo/fix-manifest.py diff --git a/docker-compose.yml b/docker-compose.yml index 61f82e9..66241b2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -20,8 +20,6 @@ services: - ./odoo/extra-addons:${EXTRA_ADDONS} - ./odoo/custom-addons:${CUSTOM_ADDONS} - ./odoo/entrypoint.sh:/entrypoint.sh - - ./odoo/odoorc.sh:/odoorc.sh - - ./odoo/third-party-addons.sh:/third-party-addons.sh env_file: - ./.env networks: diff --git a/odoo/Dockerfile b/odoo/Dockerfile index 9111d0c..5c2cd50 100644 --- a/odoo/Dockerfile +++ b/odoo/Dockerfile @@ -76,6 +76,7 @@ RUN if [ -n "$GITHUB_USER" ] && [ -n "$GITHUB_ACCESS_TOKEN" ]; then \ RUN mkdir -p ${THIRD_PARTY_ADDONS} && \ chown odoo:odoo -R ${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 ${THIRD_PARTY_ADDONS} diff --git a/odoo/fix-manifest.py b/odoo/fix-manifest.py new file mode 100644 index 0000000..5075e79 --- /dev/null +++ b/odoo/fix-manifest.py @@ -0,0 +1,34 @@ +import sys + +# Define the path to the manifest file +manifest_file_path = sys.argv[1] + +# Read the file content +with open(manifest_file_path, 'r') as file: + lines = file.readlines() + +# Find the start and end index of the manifest dictionary +start_index = next(i for i, line in enumerate(lines) if line.strip().startswith('{')) +end_index = next(i for i, line in enumerate(lines) if line.strip().endswith('}')) + +# Construct and evaluate the manifest dictionary +manifest_dict = eval(''.join(lines[start_index:end_index + 1])) + +# Modify the manifest dictionary +manifest_dict['installable'] = True +manifest_dict['auto_install'] = True + +# Construct the modified manifest string +modified_manifest_lines = ['{\n'] +for key, value in manifest_dict.items(): + modified_manifest_lines.append(f" '{key}': {repr(value)},\n") +modified_manifest_lines.append('}\n') + +# Replace the manifest dictionary string in the content +lines[start_index:end_index + 1] = modified_manifest_lines + +# Write the modified content back to the file +with open(manifest_file_path, 'w') as file: + file.writelines(lines) + +print(f"Modified {manifest_file_path}") diff --git a/odoo/third-party-addons.sh b/odoo/third-party-addons.sh index 4b1d3db..578ebcc 100755 --- a/odoo/third-party-addons.sh +++ b/odoo/third-party-addons.sh @@ -7,42 +7,7 @@ if [ ! -d "odoo-cloud-platform" ]; then fi # Define the path to the manifest file -manifest_file_path="${THIRD_PARTY_ADDONS}/attachment_s3/__manifest__.py" +s3_manifest="${THIRD_PARTY_ADDONS}/attachment_s3/__manifest__.py" -# Use Python to modify the manifest file -python3 -c " -filename = '${manifest_file_path}' - -# Read the file content -with open(filename, 'r') as file: - lines = file.readlines() - -# Find the start and end index of the manifest dictionary -start_index = next(i for i, line in enumerate(lines) if line.strip().startswith('{')) -end_index = next(i for i, line in enumerate(lines) if line.strip().endswith('}')) - -# Construct and evaluate the manifest dictionary -manifest_dict = eval(''.join(lines[start_index:end_index + 1])) - -# Modify the manifest dictionary -manifest_dict['installable'] = True -manifest_dict['auto_install'] = True - -# Construct the modified manifest string -modified_manifest_lines = ['{\n'] -for key, value in manifest_dict.items(): - modified_manifest_lines.append(f' \'{key}\': {repr(value)},\n') -modified_manifest_lines.append('}\n') - -# Replace the manifest dictionary string in the content -lines[start_index:end_index + 1] = modified_manifest_lines - -# Write the modified content back to the file -with open(filename, 'w') as file: - file.writelines(lines) -" - -echo "Modified $manifest_file_path" - -# Optional: Cat the file to verify changes -cat $manifest_file_path \ No newline at end of file +# Modify the manifest file +python3 /fix-manifest.py $s3_manifest From d0ec5118eb38d76c22f35708f6789beec2198724 Mon Sep 17 00:00:00 2001 From: Yhael S Date: Sun, 1 Oct 2023 00:55:06 -0500 Subject: [PATCH 3/8] enhanced .env variable usage --- docker-compose.yml | 9 +- odoo/Dockerfile | 4 +- odoo/entrypoint.sh | 31 ++- odoo/odoo.example.conf | 291 ---------------------- odoo/odoorc.sh | 477 +++---------------------------------- odoo/third-party-addons.sh | 4 + 6 files changed, 67 insertions(+), 749 deletions(-) delete mode 100644 odoo/odoo.example.conf diff --git a/docker-compose.yml b/docker-compose.yml index 66241b2..ac50d12 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -20,8 +20,13 @@ services: - ./odoo/extra-addons:${EXTRA_ADDONS} - ./odoo/custom-addons:${CUSTOM_ADDONS} - ./odoo/entrypoint.sh:/entrypoint.sh - env_file: - - ./.env + environment: + - HOST=${DB_HOST} + - PORT=${DB_PORT} + - USER=${DB_USER} + - PASSWORD=${DB_PASSWORD} + - ODOO_TAG + - THIRD_PARTY_ADDONS networks: - internal diff --git a/odoo/Dockerfile b/odoo/Dockerfile index 5c2cd50..ff8f697 100644 --- a/odoo/Dockerfile +++ b/odoo/Dockerfile @@ -73,8 +73,7 @@ RUN if [ -n "$GITHUB_USER" ] && [ -n "$GITHUB_ACCESS_TOKEN" ]; then \ # Odoo Extra Addons # #-------------------------# -RUN mkdir -p ${THIRD_PARTY_ADDONS} && \ - chown odoo:odoo -R ${THIRD_PARTY_ADDONS} +RUN mkdir -p ${THIRD_PARTY_ADDONS} && chown odoo:odoo -R ${THIRD_PARTY_ADDONS} COPY --chown=odoo:odoo ./odoo/fix-manifest.py / COPY --chown=odoo:odoo ./odoo/third-party-addons.sh / @@ -93,6 +92,7 @@ RUN touch ${LOG_PATH} && chown odoo:odoo ${LOG_PATH} # Copy environment variables & script to generate odoo.conf COPY --chown=odoo:odoo ./.env / +COPY --chown=odoo:odoo ./odoo/odoo.conf / COPY --chown=odoo:odoo ./odoo/odoorc.sh / # Generate odoo.conf diff --git a/odoo/entrypoint.sh b/odoo/entrypoint.sh index ff9ccf6..39b0753 100755 --- a/odoo/entrypoint.sh +++ b/odoo/entrypoint.sh @@ -2,6 +2,18 @@ set -e +while IFS='=' read -r key value || [[ -n $key ]]; do + # Skip comments and empty lines + [[ $key =~ ^#.* ]] || [[ -z $key ]] && continue + + # Removing any quotes around the value + value=${value%\"} + value=${value#\"} + + # Declare variable + eval "$key=\"$value\"" +done < .env + case "$1" in -- | odoo) shift @@ -9,7 +21,7 @@ case "$1" in # Creates new module. exec odoo "$@" else - wait-for-psql.py --db_host ${DB_HOST} --db_port ${DB_PORT} --db_user ${DB_USER} --db_password ${DB_PASSWORD} --timeout=30 + wait-for-psql.py --db_host ${HOST} --db_port ${PORT} --db_user ${USER} --db_password ${PASSWORD} --timeout=30 if [ ${APP_ENV} = 'fresh' ] || [ ${APP_ENV} = 'restore' ]; then # Ideal for a fresh install or restore a production database. @@ -18,13 +30,6 @@ case "$1" in exec odoo --config ${ODOO_RC} --database= --init= --update= --load-language= --workers=0 --limit-time-cpu=3600 --limit-time-real=7200 fi - if [ ${APP_ENV} = 'full' ] ; then - # Ideal for initializing a fresh database with a huge amount of addons. - echo odoo --config ${ODOO_RC} --database=${DB_NAME} --init=${INIT} --update= --load=${SERVER_WIDE_MODULES} --log-level=${LOG_LEVEL} --load-language=${LOAD_LANGUAGE} --max-cron-threads=${MAX_CRON_THREADS} --limit-time-cpu=3600 --limit-time-real=7200 - - exec odoo --config ${ODOO_RC} --update= --workers=0 --limit-time-cpu=3600 --limit-time-real=7200 - fi - if [ ${APP_ENV} = 'local' ] ; then # Listens to all .env variables mapped into odoo.conf file. echo odoo --config ${ODOO_RC} @@ -41,16 +46,16 @@ case "$1" in if [ ${APP_ENV} = 'testing' ] ; then # Initializies a fresh 'test_*' database, installs the addons to test, and runs tests you specify in the test tags. - echo odoo --config ${ODOO_RC} --database=test_${DB_NAME} --test-enable --test-tags ${TEST_TAGS} --init=${ADDONS_TO_TEST} --update=${ADDONS_TO_TEST} --load=${SERVER_WIDE_MODULES} --log-level=${LOG_LEVEL} --without-demo= --workers=0 --stop-after-init + echo odoo --config ${ODOO_RC} --database=test_${DB_NAME} --test-enable --test-tags ${TEST_TAGS} --init=${ADDONS_TO_TEST} --update=${ADDONS_TO_TEST} --load=${SERVER_WIDE_MODULES} --log-level=${LOG_LEVEL} --without-demo= --workers=0 --dev= --stop-after-init - exec odoo --config ${ODOO_RC} --database=test_${DB_NAME} --test-enable --test-tags ${TEST_TAGS} --init=${ADDONS_TO_TEST} --update=${ADDONS_TO_TEST} --without-demo= --workers=0 --stop-after-init + exec odoo --config ${ODOO_RC} --database=test_${DB_NAME} --test-enable --test-tags ${TEST_TAGS} --init=${ADDONS_TO_TEST} --update=${ADDONS_TO_TEST} --without-demo= --workers=0 --dev= --stop-after-init fi if [ ${APP_ENV} = 'staging' ] ; then # 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=${SERVER_WIDE_MODULES} --log-level=${LOG_LEVEL} --load-language=${LOAD_LANGUAGE} --limit-time-cpu=3600 --limit-time-real=7200 + echo odoo --config ${ODOO_RC} --database=${DB_NAME} --init=${INIT} --update=all --load=${SERVER_WIDE_MODULES} --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 + exec odoo --config ${ODOO_RC} --update=all --without-demo=all --workers=0 --limit-time-cpu=3600 --limit-time-real=7200 --dev= fi if [ ${APP_ENV} = 'production' ] ; then @@ -63,7 +68,7 @@ case "$1" in ;; -*) - wait-for-psql.py --db_host ${DB_HOST} --db_port ${DB_PORT} --db_user ${DB_USER} --db_password ${DB_PASSWORD} --timeout=30 + wait-for-psql.py --db_host ${HOST} --db_port ${PORT} --db_user ${USER} --db_password ${PASSWORD} --timeout=30 echo odoo --config ${ODOO_RC} exec odoo --config ${ODOO_RC} ;; diff --git a/odoo/odoo.example.conf b/odoo/odoo.example.conf deleted file mode 100644 index bca84c4..0000000 --- a/odoo/odoo.example.conf +++ /dev/null @@ -1,291 +0,0 @@ -options] -;------------------------------------------; -; Options not exposed on the command line. ; -;------------------------------------------; - -admin_passwd = {ADMIN_PASSWD} -csv_internal_sep = {CSV_INTERNAL_SEP} -publisher_warranty_url = {PUBLISHER_WARRANTY_URL} -root_path = {ROOT_PATH} -reportgz = {REPORTGZ} -websocket_keep_alive_timeout = {WEBSOCKET_KEEP_ALIVE_TIMEOUT} -websocket_rate_limit_burst = {WEBSOCKET_RATE_LIMIT_BURST} -websocket_rate_limit_delay = {WEBSOCKET_RATE_LIMIT_DELAY} - -;-----------------------; -; Server startup config ; -;-----------------------; -; --config | -c -config = {ODOO_RC} - -; --save -save = {SAVE} - -; --init | -i -init = {INIT} - -; --update | -u -update = {UPDATE} - -; --without-demo -demo = {DEMO} -without_demo = {WITHOUT_DEMO} - -; --import-partial -import_partial = {IMPORT_PARTIAL} - -; --pidfile -pidfile = {PIDFILE} - -; --addons-path -addons_path = {ADDONS_PATH} - -; --upgrade-path -upgrade_path = {UPGRADE_PATH} - -; --load -server_wide_modules = {SERVER_WIDE_MODULES} - -; --data-dir -data_dir = {DATA_DIR} - -;------; -; HTTP ; -;------; -; --http-interface | --xmlrpc-interface -http_interface = {HTTP_INTERFACE} - -; --http-port | -p | --xmlrpc-port -http_port = {HTTP_PORT} - -; --xmlrpcs-interface -xmlrpcs_interface = {XMLRPCS_INTERFACE} - -; --xmlrpcs-port -xmlrpcs_port = {XMLRPCS_PORT} - -; --gevent-port | --longpolling_port (deprecated) -gevent_port = {GEVENT_PORT} - -; --no-http | --no-xmlrpc -http_enable = {HTTP_ENABLE} - -; --no-xmlrpcs -xmlrpcs = {XMLRPCS} - -; --proxy-mode -proxy_mode = {PROXY_MODE} - -; --x-sendfile -x_sendfile = {X_SENDFILE} - -;---------------; -; Testing Group ; -;---------------; -; --test-file -test_file = {TEST_FILE} - -; --test-enable -test_enable = {TEST_ENABLE} - -; --test-tags -test_tags = {TEST_FILE} - -; --screencasts -screencasts = {SCREENCASTS} - -; --screenshots -screenshots = {SCREENSHOTS} - -;---------------; -; Logging Group ; -;---------------; -; --logfile -logfile = {LOGFILE} - -; --syslog -syslog = {SYSLOG} - -; --log-handler | --log-web (--log-handler=odoo.http:DEBUG) | --log-sql (--log-handler=odoo.sql_db:DEBUG) -log_handler = {LOG_HANDLER} - -; --log-db -log_db = {LOG_DB} - -; --log-db-level -log_db_level = {LOG_DB_LEVEL} - -; --log-level -log_level = {LOG_LEVEL} - -;------------; -; SMTP Group ; -;------------; -; --email-from -email_from = {EMAIL_FROM} - -; --from-filter -from_filter = {FROM_FILTER} - -; --smtp -smtp_server = {SMTP_SERVER} - -; --smtp-port -smtp_port = {SMTP_PORT} - -; --smtp-ssl -smtp_ssl = {SMTP_SSL} - -; --smtp-user -smtp_user = {SMTP_USER} - -; --smtp-password -smtp_password = {SMTP_PASSWORD} - -; --smtp-ssl-certificate-filename -smtp_ssl_certificate_filename = {SMTP_SSL_CERTIFICATE_FILENAME} - -; --smtp-ssl-private-key-filename -smtp_ssl_private_key_filename = {SMTP_SSL_PRIVATE_KEY_FILENAME} - -;----------; -; DB Group ; -;----------; -; --database | -d -db_name = {DB_NAME} - -; --db_user | -r -db_user = {DB_USER} - -; --db_password | -w -db_password = {DB_PASSWORD} - -; --pg_path -pg_path = {PG_PATH} - -; --db_host -db_host = {DB_HOST} - -; --db_port -db_port = {DB_PORT} - -; --db_sslmode -db_sslmode = {DB_SSLMODE} - -; --db_maxconn -db_maxconn = {DB_MAXCONN} - -; --db-template -db_template = {DB_TEMPLATE} - -;------------------------------; -; Internationalisation options ; -;------------------------------; -; --load-language -load_language = {LOAD_LANGUAGE} - -; --language -language = {LANGUAGE} - -; --i18n-export -translate_out = {TRANSLATE_OUT} - -; --i18n-import -translate_in = {TRANSLATE_IN} - -; --i18n-overwrite -overwrite_existing_translations = {OVERWRITE_EXISTING_TRANSLATIONS} - -; --modules -translate_modules = {TRANSLATE_MODULES} - -;----------; -; Security ; -;----------; -; --no-database-list -list_db = {LIST_DB} - -;-----; -; WEB ; -;-----; -; --db-filter -dbfilter = {DBFILTER} - -;------------------; -; Advanced options ; -;------------------; -; --dev (all, reload, xml, qweb, werkzeug, sql, shell, assets, tests) -dev_mode = {DEV_MODE} - -; --shell-interface -shell_interface = {SHELL_INTERFACE} - -; --stop-after-init -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} - -; --max-cron-threads -max_cron_threads = {MAX_CRON_THREADS} - -; --unaccent -unaccent = {UNACCENT} - -; --geoip-db -geoip_database = {GEOIP_DATABASE} - -; --workers -workers = {WORKERS} - -; --limit-memory-soft -limit_memory_soft = {LIMIT_MEMORY_SOFT} - -; --limit-memory-hard -limit_memory_hard = {LIMIT_MEMORY_HARD} - -; --limit-time-cpu -limit_time_cpu = {LIMIT_TIME_CPU} - -; --limit-time-real -limit_time_real = {LIMIT_TIME_REAL} - -; --limit-time-real-cron -limit_time_real_cron = {LIMIT_TIME_REAL_CRON} - -; --limit-request -limit_request = {LIMIT_REQUEST} - -;-----------------------------; -; External Integrations ; -;-----------------------------; - -;-------------; -; Redis ; -;-------------; -; -- Possible values: 1 or true -ODOO_SESSION_REDIS = {ODOO_SESSION_REDIS} - -; -- Defaults to is localhost -ODOO_SESSION_REDIS_HOST = {ODOO_SESSION_REDIS_HOST} - -; -- Defaults to 6379 -ODOO_SESSION_REDIS_PORT = {ODOO_SESSION_REDIS_PORT} - -; -- Sets the password for the AUTH command (optional) -ODOO_SESSION_REDIS_PASSWORD = {ODOO_SESSION_REDIS_PASSWORD} - -; -- Alternative way to define the Redis server address like rediss:// protocol. -ODOO_SESSION_REDIS_URL = {ODOO_SESSION_REDIS_URL} - -; -- Prefix for the session keys (optional) -ODOO_SESSION_REDIS_PREFIX = {ODOO_SESSION_REDIS_PREFIX} - -; -- Time in seconds before expiration of the sessions (default is 7 days) -ODOO_SESSION_REDIS_EXPIRATION = {ODOO_SESSION_REDIS_EXPIRATION} - -; -- Time in seconds before expiration of the anonymous sessions (default is 3 hours) -ODOO_SESSION_REDIS_EXPIRATION_ANONYMOUS = {ODOO_SESSION_REDIS_EXPIRATION_ANONYMOUS} diff --git a/odoo/odoorc.sh b/odoo/odoorc.sh index 81a9b07..bf2509f 100755 --- a/odoo/odoorc.sh +++ b/odoo/odoorc.sh @@ -2,444 +2,39 @@ set -e -# Define default values for environment variables -set -a -source /.env -set +a - -declare -A defaults -defaults=( - [ADMIN_PASSWD]=${ADMIN_PASSWD} - [CSV_INTERNAL_SEP]=${CSV_INTERNAL_SEP} - [PUBLISHER_WARRANTY_URL]=${PUBLISHER_WARRANTY_URL} - [ROOT_PATH]=${ROOT_PATH} - [REPORTGZ]=${REPORTGZ} - [WEBSOCKET_KEEP_ALIVE_TIMEOUT]=${WEBSOCKET_KEEP_ALIVE_TIMEOUT} - [WEBSOCKET_RATE_LIMIT_BURST]=${WEBSOCKET_RATE_LIMIT_BURST} - [WEBSOCKET_RATE_LIMIT_DELAY]=${WEBSOCKET_RATE_LIMIT_DELAY} - - [ODOO_RC]=${ODOO_RC} - [SAVE]=${SAVE} - [INIT]=${INIT} - [UPDATE]=${UPDATE} - [DEMO]=${DEMO} - [WITHOUT_DEMO]=${WITHOUT_DEMO} - [IMPORT_PARTIAL]=${IMPORT_PARTIAL} - [PIDFILE]=${PIDFILE} - [ADDONS_PATH]=${ADDONS_PATH} - [UPGRADE_PATH]=${UPGRADE_PATH} - [SERVER_WIDE_MODULES]=${SERVER_WIDE_MODULES} - [DATA_DIR]=${DATA_DIR} - - [HTTP_INTERFACE]=${HTTP_INTERFACE} - [HTTP_PORT]=${HTTP_PORT} - [XMLRPCS_INTERFACE]=${XMLRPCS_INTERFACE} - [XMLRPCS_PORT]=${XMLRPCS_PORT} - [GEVENT_PORT]=${GEVENT_PORT} - [HTTP_ENABLE]=${HTTP_ENABLE} - [XMLRPCS]=${XMLRPCS} - [PROXY_MODE]=${PROXY_MODE} - [X_SENDFILE]=${X_SENDFILE} - - [DBFILTER]=${DBFILTER} - - [TEST_FILE]=${TEST_FILE} - [TEST_ENABLE]=${TEST_ENABLE} - [TEST_TAGS]=${TEST_TAGS} - [SCREENCASTS]=${SCREENCASTS} - [SCREENSHOTS]=${SCREENSHOTS} - - [LOGFILE]=${LOGFILE} - [SYSLOG]=${SYSLOG} - [LOG_HANDLER]=${LOG_HANDLER} - [LOG_DB]=${LOG_DB} - [LOG_DB_LEVEL]=${LOG_DB_LEVEL} - [LOG_LEVEL]=${LOG_LEVEL} - - [EMAIL_FROM]=${EMAIL_FROM} - [FROM_FILTER]=${FROM_FILTER} - [SMTP_SERVER]=${SMTP_SERVER} - [SMTP_PORT]=${SMTP_PORT} - [SMTP_SSL]=${SMTP_SSL} - [SMTP_USER]=${SMTP_USER} - [SMTP_PASSWORD]=${SMTP_PASSWORD} - [SMTP_SSL_CERTIFICATE_FILENAME]=${SMTP_SSL_CERTIFICATE_FILENAME} - [SMTP_SSL_PRIVATE_KEY_FILENAME]=${SMTP_SSL_PRIVATE_KEY_FILENAME} - - [DB_NAME]=${DB_NAME} - [DB_USER]=${DB_USER} - [DB_PASSWORD]=${DB_PASSWORD} - [PG_PATH]=${PG_PATH} - [DB_HOST]=${DB_HOST} - [DB_PORT]=${DB_PORT} - [DB_SSLMODE]=${DB_SSLMODE} - [DB_MAXCONN]=${DB_MAXCONN} - [DB_TEMPLATE]=${DB_TEMPLATE} - - [LOAD_LANGUAGE]=${LOAD_LANGUAGE} - [LANGUAGE]=${LANGUAGE} - [TRANSLATE_OUT]=${TRANSLATE_OUT} - [TRANSLATE_IN]=${TRANSLATE_IN} - [OVERWRITE_EXISTING_TRANSLATIONS]=${OVERWRITE_EXISTING_TRANSLATIONS} - [TRANSLATE_MODULES]=${TRANSLATE_MODULES} - - [LIST_DB]=${LIST_DB} - - [DEV_MODE]=${DEV_MODE} - [SHELL_INTERFACE]=${SHELL_INTERFACE} - [STOP_AFTER_INIT]=${STOP_AFTER_INIT} - [OSV_MEMORY_COUNT_LIMIT]=${OSV_MEMORY_COUNT_LIMIT} - [TRANSIENT_AGE_LIMIT]=${TRANSIENT_AGE_LIMIT} - [MAX_CRON_THREADS]=${MAX_CRON_THREADS} - [UNACCENT]=${UNACCENT} - [GEOIP_DATABASE]=${GEOIP_DATABASE} - [WORKERS]=${WORKERS} - [LIMIT_MEMORY_SOFT]=${LIMIT_MEMORY_SOFT} - [LIMIT_MEMORY_HARD]=${LIMIT_MEMORY_HARD} - [LIMIT_TIME_CPU]=${LIMIT_TIME_CPU} - [LIMIT_TIME_REAL]=${LIMIT_TIME_REAL} - [LIMIT_TIME_REAL_CRON]=${LIMIT_TIME_REAL_CRON} - [LIMIT_REQUEST]=${LIMIT_REQUEST} - - [ODOO_SESSION_REDIS]=${ODOO_SESSION_REDIS} - [ODOO_SESSION_REDIS_HOST]=${ODOO_SESSION_REDIS_HOST} - [ODOO_SESSION_REDIS_PORT]=${ODOO_SESSION_REDIS_PORT} - [ODOO_SESSION_REDIS_PASSWORD]=${ODOO_SESSION_REDIS_PASSWORD} - [ODOO_SESSION_REDIS_URL]=${ODOO_SESSION_REDIS_URL} - [ODOO_SESSION_REDIS_PREFIX]=${ODOO_SESSION_REDIS_PREFIX} - [ODOO_SESSION_REDIS_EXPIRATION]=${ODOO_SESSION_REDIS_EXPIRATION} - [ODOO_SESSION_REDIS_EXPIRATION_ANONYMOUS]=${ODOO_SESSION_REDIS_EXPIRATION_ANONYMOUS} - - [DISABLE_ATTACHMENT_STORAGE]=${DISABLE_ATTACHMENT_STORAGE} - [AWS_HOST]=${AWS_HOST} - [AWS_REGION]=${AWS_REGION} - [AWS_ACCESS_KEY_ID]=${AWS_ACCESS_KEY_ID} - [AWS_SECRET_ACCESS_KEY]=${AWS_SECRET_ACCESS_KEY} - [AWS_BUCKETNAME]=${AWS_BUCKETNAME} -) - -# Define the template -template=$(cat << EOF -[options] -;------------------------------------------; -; Options not exposed on the command line. ; -;------------------------------------------; - -admin_passwd = {ADMIN_PASSWD} -csv_internal_sep = {CSV_INTERNAL_SEP} -publisher_warranty_url = {PUBLISHER_WARRANTY_URL} -root_path = {ROOT_PATH} -reportgz = {REPORTGZ} -websocket_keep_alive_timeout = {WEBSOCKET_KEEP_ALIVE_TIMEOUT} -websocket_rate_limit_burst = {WEBSOCKET_RATE_LIMIT_BURST} -websocket_rate_limit_delay = {WEBSOCKET_RATE_LIMIT_DELAY} - -;-----------------------; -; Server startup config ; -;-----------------------; -; --config | -c -config = {ODOO_RC} - -; --save -save = {SAVE} - -; --init | -i -init = {INIT} - -; --update | -u -update = {UPDATE} - -; --without-demo -demo = {DEMO} -without_demo = {WITHOUT_DEMO} - -; --import-partial -import_partial = {IMPORT_PARTIAL} - -; --pidfile -pidfile = {PIDFILE} - -; --addons-path -addons_path = {ADDONS_PATH} - -; --upgrade-path -upgrade_path = {UPGRADE_PATH} - -; --load -server_wide_modules = {SERVER_WIDE_MODULES} - -; --data-dir -data_dir = {DATA_DIR} - -;------; -; HTTP ; -;------; -; --http-interface | --xmlrpc-interface -http_interface = {HTTP_INTERFACE} - -; --http-port | -p | --xmlrpc-port -http_port = {HTTP_PORT} - -; --xmlrpcs-interface -xmlrpcs_interface = {XMLRPCS_INTERFACE} - -; --xmlrpcs-port -xmlrpcs_port = {XMLRPCS_PORT} - -; --gevent-port | --longpolling_port (deprecated) -gevent_port = {GEVENT_PORT} - -; --no-http | --no-xmlrpc -http_enable = {HTTP_ENABLE} - -; --no-xmlrpcs -xmlrpcs = {XMLRPCS} - -; --proxy-mode -proxy_mode = {PROXY_MODE} - -; --x-sendfile -x_sendfile = {X_SENDFILE} - -;---------------; -; Testing Group ; -;---------------; -; --test-file -test_file = {TEST_FILE} - -; --test-enable -test_enable = {TEST_ENABLE} - -; --test-tags -test_tags = {TEST_FILE} - -; --screencasts -screencasts = {SCREENCASTS} - -; --screenshots -screenshots = {SCREENSHOTS} - -;---------------; -; Logging Group ; -;---------------; -; --logfile -logfile = {LOGFILE} - -; --syslog -syslog = {SYSLOG} - -; --log-handler | --log-web (--log-handler=odoo.http:DEBUG) | --log-sql (--log-handler=odoo.sql_db:DEBUG) -log_handler = {LOG_HANDLER} - -; --log-db -log_db = {LOG_DB} - -; --log-db-level -log_db_level = {LOG_DB_LEVEL} - -; --log-level -log_level = {LOG_LEVEL} - -;------------; -; SMTP Group ; -;------------; -; --email-from -email_from = {EMAIL_FROM} - -; --from-filter -from_filter = {FROM_FILTER} - -; --smtp -smtp_server = {SMTP_SERVER} - -; --smtp-port -smtp_port = {SMTP_PORT} - -; --smtp-ssl -smtp_ssl = {SMTP_SSL} - -; --smtp-user -smtp_user = {SMTP_USER} - -; --smtp-password -smtp_password = {SMTP_PASSWORD} - -; --smtp-ssl-certificate-filename -smtp_ssl_certificate_filename = {SMTP_SSL_CERTIFICATE_FILENAME} - -; --smtp-ssl-private-key-filename -smtp_ssl_private_key_filename = {SMTP_SSL_PRIVATE_KEY_FILENAME} - -;----------; -; DB Group ; -;----------; -; --database | -d -db_name = {DB_NAME} - -; --db_user | -r -db_user = {DB_USER} - -; --db_password | -w -db_password = {DB_PASSWORD} - -; --pg_path -pg_path = {PG_PATH} - -; --db_host -db_host = {DB_HOST} - -; --db_port -db_port = {DB_PORT} - -; --db_sslmode -db_sslmode = {DB_SSLMODE} - -; --db_maxconn -db_maxconn = {DB_MAXCONN} - -; --db-template -db_template = {DB_TEMPLATE} - -;------------------------------; -; Internationalisation options ; -;------------------------------; -; --load-language -load_language = {LOAD_LANGUAGE} - -; --language -language = {LANGUAGE} - -; --i18n-export -translate_out = {TRANSLATE_OUT} - -; --i18n-import -translate_in = {TRANSLATE_IN} - -; --i18n-overwrite -overwrite_existing_translations = {OVERWRITE_EXISTING_TRANSLATIONS} - -; --modules -translate_modules = {TRANSLATE_MODULES} - -;----------; -; Security ; -;----------; -; --no-database-list -list_db = {LIST_DB} - -;-----; -; WEB ; -;-----; -; --db-filter -dbfilter = {DBFILTER} - -;------------------; -; Advanced options ; -;------------------; -; --dev (all, reload, xml, qweb, werkzeug, sql, shell, assets, tests) -dev_mode = {DEV_MODE} - -; --shell-interface -shell_interface = {SHELL_INTERFACE} - -; --stop-after-init -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} - -; --max-cron-threads -max_cron_threads = {MAX_CRON_THREADS} - -; --unaccent -unaccent = {UNACCENT} - -; --geoip-db -geoip_database = {GEOIP_DATABASE} - -; --workers -workers = {WORKERS} - -; --limit-memory-soft -limit_memory_soft = {LIMIT_MEMORY_SOFT} - -; --limit-memory-hard -limit_memory_hard = {LIMIT_MEMORY_HARD} - -; --limit-time-cpu -limit_time_cpu = {LIMIT_TIME_CPU} - -; --limit-time-real -limit_time_real = {LIMIT_TIME_REAL} - -; --limit-time-real-cron -limit_time_real_cron = {LIMIT_TIME_REAL_CRON} - -; --limit-request -limit_request = {LIMIT_REQUEST} - -;-----------------------------; -; External Integrations ; -;-----------------------------; - -;-------------; -; Redis ; -;-------------; -; -- Possible values: 1 or true -ODOO_SESSION_REDIS = {ODOO_SESSION_REDIS} - -; -- Defaults to is localhost -ODOO_SESSION_REDIS_HOST = {ODOO_SESSION_REDIS_HOST} - -; -- Defaults to 6379 -ODOO_SESSION_REDIS_PORT = {ODOO_SESSION_REDIS_PORT} - -; -- Sets the password for the AUTH command (optional) -ODOO_SESSION_REDIS_PASSWORD = {ODOO_SESSION_REDIS_PASSWORD} - -; -- Alternative way to define the Redis server address like rediss:// protocol. -ODOO_SESSION_REDIS_URL = {ODOO_SESSION_REDIS_URL} - -; -- Prefix for the session keys (optional) -ODOO_SESSION_REDIS_PREFIX = {ODOO_SESSION_REDIS_PREFIX} - -; -- Time in seconds before expiration of the sessions (default is 7 days) -ODOO_SESSION_REDIS_EXPIRATION = {ODOO_SESSION_REDIS_EXPIRATION} - -; -- Time in seconds before expiration of the anonymous sessions (default is 3 hours) -ODOO_SESSION_REDIS_EXPIRATION_ANONYMOUS = {ODOO_SESSION_REDIS_EXPIRATION_ANONYMOUS} - -;----------; -; S3 ; -;----------; -; -- Disable S3 storage -DISABLE_ATTACHMENT_STORAGE = {DISABLE_ATTACHMENT_STORAGE} - -; -- Not required if using AWS S3 -AWS_HOST = {AWS_HOST} - -; -- Required if using AWS services -AWS_REGION = {AWS_REGION} - -AWS_ACCESS_KEY_ID = {AWS_ACCESS_KEY_ID} -AWS_SECRET_ACCESS_KEY = {AWS_SECRET_ACCESS_KEY} - -; Optional {db_name} placeholder -AWS_BUCKETNAME = {AWS_BUCKETNAME} - -EOF -) - -# Override defaults with values from environment variables -for key in "${!defaults[@]}"; do - if [[ ! ${defaults[$key]} =~ ^\{.*\}$ ]]; then - value=${!key:-${defaults[$key]}} - template="${template//\{$key\}/$value}" - fi -done - -# Store the result to the odoo.conf file -echo "$template" > ${ODOO_RC} +# Define the path to the example configuration file +TEMPLATE_CONF="odoo.conf" + +# Copy the example conf to the destination to start replacing the variables +cp "$TEMPLATE_CONF" "$ODOO_RC" + +# First pass: Evaluate any nested variables within .env file and export them +while IFS='=' read -r key value || [[ -n $key ]]; do + # Skip comments and empty lines + [[ $key =~ ^#.* ]] || [[ -z $key ]] && continue + + # Removing any quotes around the value + value=${value%\"} + value=${value#\"} + + # Evaluate any variables within value + eval "value=\"$value\"" + + export "$key=$value" +done < .env + +# Second pass: Replace the variables in $ODOO_RC +while IFS='=' read -r key value || [[ -n $key ]]; do + # Skip comments and empty lines + [[ $key =~ ^#.* ]] || [[ -z $key ]] && continue + + value=${!key} # Get the value of the variable whose name is $key + + # Escape characters which are special to sed + value_escaped=$(echo "$value" | sed 's/[\/&]/\\&/g') + + # Replace occurrences of the key with the value in $ODOO_RC + sed -i "s/\${$key}/${value_escaped}/g" "$ODOO_RC" +done < .env + +echo "Configuration file is generated at $ODOO_RC" diff --git a/odoo/third-party-addons.sh b/odoo/third-party-addons.sh index 578ebcc..e25f60d 100755 --- a/odoo/third-party-addons.sh +++ b/odoo/third-party-addons.sh @@ -1,3 +1,7 @@ +#!/bin/bash + +set -e + # Check if the repository directory exists if [ ! -d "odoo-cloud-platform" ]; then git clone https://github.com/camptocamp/odoo-cloud-platform.git --depth 1 --branch ${ODOO_TAG} --single-branch --no-tags; From 0cd36b92a3b067c2dddb854241ac34535f8247f1 Mon Sep 17 00:00:00 2001 From: Yhael S Date: Sun, 1 Oct 2023 17:47:02 -0500 Subject: [PATCH 4/8] stuck with s3 refactoring --- .env.example | 28 ++-- docker-compose.yml | 15 ++- odoo/Dockerfile | 2 +- odoo/fix-manifest.py | 2 +- odoo/odoo.conf | 308 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 335 insertions(+), 20 deletions(-) create mode 100644 odoo/odoo.conf diff --git a/.env.example b/.env.example index 698aaee..3182073 100644 --- a/.env.example +++ b/.env.example @@ -2,7 +2,7 @@ # Main Configuration # #--------------------------# # Odoo -APP_ENV=local +APP_ENV=staging INIT= UPDATE= LOAD=base,web,session_redis,attachment_s3 @@ -26,7 +26,7 @@ LOAD_LANGUAGE= DB_SSLMODE=prefer DB_MAXCONN=64 DB_TEMPLATE=unaccent_template -UNACCENT=True +UNACCENT=False LIST_DB=True DBFILTER=.* @@ -70,16 +70,13 @@ REDIS_EXPIRATION=604800 REDIS_EXPIRATION_ANONYMOUS=10800 # Filesystem -MINIO_VIRTUAL_HOST=s3.j8c.test -MINIO_CONSOLE_PORT=9000 -MINIO_VIRTUAL_PORT=9001 -DISABLE_S3_STORAGE=0 - +S3_VIRTUAL_HOST=s3.odoocker.test +S3_API_PORT=9000 AWS_ACCESS_KEY_ID=myaccesskey AWS_SECRET_ACCESS_KEY=mysecretkey +AWS_BUCKETNAME=odoocker +AWS_HOST=http://s3:${S3_API_PORT} AWS_REGION= -AWS_HOST=http://s3:${MINIO_CONSOLE_PORT} -AWS_BUCKETNAME=${DB_NAME} # PgAdmin PGADMIN_DOMAIN=pgadmin.odoocker.test @@ -104,6 +101,8 @@ SUPPORT_EMAIL=mail@example.com # Containers' Tags ODOO_TAG=16.0 POSTGRES_TAG=16.0 +REDIS_TAG=latest +S3_TAG=latest NGINX_TAG=1.25.2 NGINX_PROXY_TAG=1.3.1 ACME_COMPANION_TAG=2.2.8 @@ -132,7 +131,7 @@ LOG_PATH=/var/log/odoo/odoo.log DEBUG_PATH=/usr/bin/odoo # Server startup config -ODOO_RC=/etc/odoo/odoo.conf +ODOO_RC=${ROOT_PATH}/odoo.conf SAVE=False INIT=${INIT} UPDATE=${UPDATE} @@ -168,6 +167,7 @@ SCREENSHOTS=/tmp/odoo_tests # Logging LOG_LEVEL=${LOG_LEVEL} LOG_HANDLER=odoo.http.rpc.request:${LOG_HANDLER_LEVEL},odoo.http.rpc.response:${LOG_HANDLER_LEVEL},:${LOG_HANDLER_LEVEL},odoo.sql_db:${LOG_HANDLER_LEVEL} +LOG_DB=False LOG_DB_LEVEL=${LOG_LEVEL} SYSLOG=False LOGFILE= @@ -286,11 +286,13 @@ AWS_REGION=${AWS_REGION} AWS_HOST=${AWS_HOST} AWS_BUCKETNAME=${AWS_BUCKETNAME} -DISABLE_ATTACHMENT_STORAGE=${DISABLE_S3_STORAGE} +DISABLE_ATTACHMENT_STORAGE=0 MINIO_ROOT_USER=${AWS_ACCESS_KEY_ID} MINIO_ROOT_PASSWORD=${AWS_SECRET_ACCESS_KEY} -MINIO_VIRTUAL_HOST=${MINIO_VIRTUAL_HOST} -MINIO_BROWSER_REDIRECT_URL=${MINIO_VIRTUAL_HOST} +MINIO_VIRTUAL_HOST=${S3_VIRTUAL_HOST} +MINIO_BROWSER_REDIRECT_URL=http://${MINIO_VIRTUAL_HOST} +MINIO_API_PORT=${S3_API_PORT} +MINIO_VIRTUAL_PORT=9001 #-------------# # PgAdmin # diff --git a/docker-compose.yml b/docker-compose.yml index ac50d12..a951336 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -52,11 +52,16 @@ services: - PGADMING_DB_NAME - PGADMING_DB_USER - PGADMIN_DB_PASSWORD + - AWS_HOST + - AWS_REGION + - AWS_ACCESS_KEY_ID + - AWS_SECRET_ACCESS_KEY + - AWS_BUCKETNAME networks: - internal redis: - image: eqalpha/keydb:latest + image: eqalpha/keydb:${REDIS_TAG} platform: linux/amd64 ports: - 6379:6379 @@ -67,16 +72,16 @@ services: - redis-data:/var/lib/keydb s3: - image: minio/minio:latest + image: minio/minio:${S3_TAG} environment: - MINIO_ROOT_USER - MINIO_ROOT_PASSWORD - VIRTUAL_HOST=${MINIO_VIRTUAL_HOST} - - VIRTUAL_PORT=${MINIO_VIRTUAL_PORT} + - VIRTUAL_PORT=9001 - MINIO_BROWSER_REDIRECT_URL command: server /data --console-address ":9001" volumes: - - s3_data:/data + - s3-data:/data ports: - 9000:9000 - 9001:9001 @@ -125,7 +130,7 @@ volumes: odoo-data: pg-data: redis-data: - s3_data: + s3-data: certs: vhost: html: diff --git a/odoo/Dockerfile b/odoo/Dockerfile index ff8f697..7f465b4 100644 --- a/odoo/Dockerfile +++ b/odoo/Dockerfile @@ -77,7 +77,7 @@ RUN mkdir -p ${THIRD_PARTY_ADDONS} && chown odoo:odoo -R ${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 ${THIRD_PARTY_ADDONS} +RUN /third-party-addons.sh && chown odoo:odoo -R ${THIRD_PARTY_ADDONS} #---------------------# # Logging # diff --git a/odoo/fix-manifest.py b/odoo/fix-manifest.py index 5075e79..5879cd8 100644 --- a/odoo/fix-manifest.py +++ b/odoo/fix-manifest.py @@ -16,7 +16,7 @@ manifest_dict = eval(''.join(lines[start_index:end_index + 1])) # Modify the manifest dictionary manifest_dict['installable'] = True -manifest_dict['auto_install'] = True +manifest_dict['auto_install'] = False # Construct the modified manifest string modified_manifest_lines = ['{\n'] diff --git a/odoo/odoo.conf b/odoo/odoo.conf new file mode 100644 index 0000000..6346b75 --- /dev/null +++ b/odoo/odoo.conf @@ -0,0 +1,308 @@ +[options] +;------------------------------------------; +; Options not exposed on the command line. ; +;------------------------------------------; + +admin_passwd = ${ADMIN_PASSWD} +csv_internal_sep = ${CSV_INTERNAL_SEP} +publisher_warranty_url = ${PUBLISHER_WARRANTY_URL} +root_path = ${ROOT_PATH} +reportgz = ${REPORTGZ} +websocket_keep_alive_timeout = ${WEBSOCKET_KEEP_ALIVE_TIMEOUT} +websocket_rate_limit_burst = ${WEBSOCKET_RATE_LIMIT_BURST} +websocket_rate_limit_delay = ${WEBSOCKET_RATE_LIMIT_DELAY} + +;-----------------------; +; Server startup config ; +;-----------------------; +; --config | -c +config = ${ODOO_RC} + +; --save +save = ${SAVE} + +; --init | -i +init = ${INIT} + +; --update | -u +update = ${UPDATE} + +; --without-demo +demo = ${DEMO} +without_demo = ${WITHOUT_DEMO} + +; --import-partial +import_partial = ${IMPORT_PARTIAL} + +; --pidfile +pidfile = ${PIDFILE} + +; --addons-path +addons_path = ${ADDONS_PATH} + +; --upgrade-path +upgrade_path = ${UPGRADE_PATH} + +; --load +server_wide_modules = ${SERVER_WIDE_MODULES} + +; --data-dir +data_dir = ${DATA_DIR} + +;------; +; HTTP ; +;------; +; --http-interface | --xmlrpc-interface +http_interface = ${HTTP_INTERFACE} + +; --http-port | -p | --xmlrpc-port +http_port = ${HTTP_PORT} + +; --xmlrpcs-interface +xmlrpcs_interface = ${XMLRPCS_INTERFACE} + +; --xmlrpcs-port +xmlrpcs_port = ${XMLRPCS_PORT} + +; --gevent-port | --longpolling_port (deprecated) +gevent_port = ${GEVENT_PORT} + +; --no-http | --no-xmlrpc +http_enable = ${HTTP_ENABLE} + +; --no-xmlrpcs +xmlrpcs = ${XMLRPCS} + +; --proxy-mode +proxy_mode = ${PROXY_MODE} + +; --x-sendfile +x_sendfile = ${X_SENDFILE} + +;---------------; +; Testing Group ; +;---------------; +; --test-file +test_file = ${TEST_FILE} + +; --test-enable +test_enable = ${TEST_ENABLE} + +; --test-tags +test_tags = ${TEST_FILE} + +; --screencasts +screencasts = ${SCREENCASTS} + +; --screenshots +screenshots = ${SCREENSHOTS} + +;---------------; +; Logging Group ; +;---------------; +; --logfile +logfile = ${LOGFILE} + +; --syslog +syslog = ${SYSLOG} + +; --log-handler | --log-web (--log-handler=odoo.http:DEBUG) | --log-sql (--log-handler=odoo.sql_db:DEBUG) +log_handler = ${LOG_HANDLER} + +; --log-db +log_db = ${LOG_DB} + +; --log-db-level +log_db_level = ${LOG_DB_LEVEL} + +; --log-level +log_level = ${LOG_LEVEL} + +;------------; +; SMTP Group ; +;------------; +; --email-from +email_from = ${EMAIL_FROM} + +; --from-filter +from_filter = ${FROM_FILTER} + +; --smtp +smtp_server = ${SMTP_SERVER} + +; --smtp-port +smtp_port = ${SMTP_PORT} + +; --smtp-ssl +smtp_ssl = ${SMTP_SSL} + +; --smtp-user +smtp_user = ${SMTP_USER} + +; --smtp-password +smtp_password = ${SMTP_PASSWORD} + +; --smtp-ssl-certificate-filename +smtp_ssl_certificate_filename = ${SMTP_SSL_CERTIFICATE_FILENAME} + +; --smtp-ssl-private-key-filename +smtp_ssl_private_key_filename = ${SMTP_SSL_PRIVATE_KEY_FILENAME} + +;----------; +; DB Group ; +;----------; +; --database | -d +db_name = ${DB_NAME} + +; --db_user | -r +db_user = ${DB_USER} + +; --db_password | -w +db_password = ${DB_PASSWORD} + +; --pg_path +pg_path = ${PG_PATH} + +; --db_host +db_host = ${DB_HOST} + +; --db_port +db_port = ${DB_PORT} + +; --db_sslmode +db_sslmode = ${DB_SSLMODE} + +; --db_maxconn +db_maxconn = ${DB_MAXCONN} + +; --db-template +db_template = ${DB_TEMPLATE} + +;------------------------------; +; Internationalisation options ; +;------------------------------; +; --load-language +load_language = ${LOAD_LANGUAGE} + +; --language +language = ${LANGUAGE} + +; --i18n-export +translate_out = ${TRANSLATE_OUT} + +; --i18n-import +translate_in = ${TRANSLATE_IN} + +; --i18n-overwrite +overwrite_existing_translations = ${OVERWRITE_EXISTING_TRANSLATIONS} + +; --modules +translate_modules = ${TRANSLATE_MODULES} + +;----------; +; Security ; +;----------; +; --no-database-list +list_db = ${LIST_DB} + +;-----; +; WEB ; +;-----; +; --db-filter +dbfilter = ${DBFILTER} + +;------------------; +; Advanced options ; +;------------------; +; --dev (all, reload, xml, qweb, werkzeug, sql, shell, assets, tests) +dev_mode = ${DEV_MODE} + +; --shell-interface +shell_interface = ${SHELL_INTERFACE} + +; --stop-after-init +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} + +; --max-cron-threads +max_cron_threads = ${MAX_CRON_THREADS} + +; --unaccent +unaccent = ${UNACCENT} + +; --geoip-db +geoip_database = ${GEOIP_DATABASE} + +; --workers +workers = ${WORKERS} + +; --limit-memory-soft +limit_memory_soft = ${LIMIT_MEMORY_SOFT} + +; --limit-memory-hard +limit_memory_hard = ${LIMIT_MEMORY_HARD} + +; --limit-time-cpu +limit_time_cpu = ${LIMIT_TIME_CPU} + +; --limit-time-real +limit_time_real = ${LIMIT_TIME_REAL} + +; --limit-time-real-cron +limit_time_real_cron = ${LIMIT_TIME_REAL_CRON} + +; --limit-request +limit_request = ${LIMIT_REQUEST} + +;-----------------------------; +; External Integrations ; +;-----------------------------; + +;-------------; +; Redis ; +;-------------; +; -- Possible values: 1 or true +ODOO_SESSION_REDIS = ${ODOO_SESSION_REDIS} + +; -- Defaults to is localhost +ODOO_SESSION_REDIS_HOST = ${ODOO_SESSION_REDIS_HOST} + +; -- Defaults to 6379 +ODOO_SESSION_REDIS_PORT = ${ODOO_SESSION_REDIS_PORT} + +; -- Sets the password for the AUTH command (optional) +ODOO_SESSION_REDIS_PASSWORD = ${ODOO_SESSION_REDIS_PASSWORD} + +; -- Alternative way to define the Redis server address like rediss:// protocol. +ODOO_SESSION_REDIS_URL = ${ODOO_SESSION_REDIS_URL} + +; -- Prefix for the session keys (optional) +ODOO_SESSION_REDIS_PREFIX = ${ODOO_SESSION_REDIS_PREFIX} + +; -- Time in seconds before expiration of the sessions (default is 7 days) +ODOO_SESSION_REDIS_EXPIRATION = ${ODOO_SESSION_REDIS_EXPIRATION} + +; -- Time in seconds before expiration of the anonymous sessions (default is 3 hours) +ODOO_SESSION_REDIS_EXPIRATION_ANONYMOUS = ${ODOO_SESSION_REDIS_EXPIRATION_ANONYMOUS} + +;----------; +; S3 ; +;----------; +; Disable S3 storage +DISABLE_ATTACHMENT_STORAGE = ${DISABLE_ATTACHMENT_STORAGE} + +; Not required if using AWS S3 +AWS_HOST = ${AWS_HOST} + +; Required if using AWS services +AWS_REGION = ${AWS_REGION} +AWS_ACCESS_KEY_ID = ${AWS_ACCESS_KEY_ID} +AWS_SECRET_ACCESS_KEY = ${AWS_SECRET_ACCESS_KEY} + +; Optional ${db_name} placeholder +AWS_BUCKETNAME = ${AWS_BUCKETNAME} From 554f9f533db54cbc354b2ce35429a7ce234eb87d Mon Sep 17 00:00:00 2001 From: Yhael S Date: Fri, 6 Oct 2023 23:55:18 -0500 Subject: [PATCH 5/8] last fixes --- .env.example | 7 +++++-- docker-compose.yml | 36 ++++++++++++++++++++++-------------- odoo/fix-manifest.py | 2 +- odoo/third-party-addons.sh | 4 ++++ 4 files changed, 32 insertions(+), 17 deletions(-) diff --git a/.env.example b/.env.example index 3182073..644c024 100644 --- a/.env.example +++ b/.env.example @@ -2,7 +2,7 @@ # Main Configuration # #--------------------------# # Odoo -APP_ENV=staging +APP_ENV=local INIT= UPDATE= LOAD=base,web,session_redis,attachment_s3 @@ -68,10 +68,12 @@ REDIS_URL= REDIS_PREFIX=odoo REDIS_EXPIRATION=604800 REDIS_EXPIRATION_ANONYMOUS=10800 +REDIS_DATA=/var/lib/keydb # Filesystem S3_VIRTUAL_HOST=s3.odoocker.test S3_API_PORT=9000 +S3_CONSOLE_PORT=9001 AWS_ACCESS_KEY_ID=myaccesskey AWS_SECRET_ACCESS_KEY=mysecretkey AWS_BUCKETNAME=odoocker @@ -292,7 +294,8 @@ MINIO_ROOT_PASSWORD=${AWS_SECRET_ACCESS_KEY} MINIO_VIRTUAL_HOST=${S3_VIRTUAL_HOST} MINIO_BROWSER_REDIRECT_URL=http://${MINIO_VIRTUAL_HOST} MINIO_API_PORT=${S3_API_PORT} -MINIO_VIRTUAL_PORT=9001 +MINIO_CONSOLE_PORT=${S3_CONSOLE_PORT} +MINIO_DATA=/data #-------------# # PgAdmin # diff --git a/docker-compose.yml b/docker-compose.yml index a951336..3ee8949 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -27,6 +27,19 @@ services: - PASSWORD=${DB_PASSWORD} - ODOO_TAG - THIRD_PARTY_ADDONS + - ODOO_SESSION_REDIS + - ODOO_SESSION_REDIS_HOST + - ODOO_SESSION_REDIS_PORT + - ODOO_SESSION_REDIS_PASSWORD + - ODOO_SESSION_REDIS_URL + - ODOO_SESSION_REDIS_PREFIX + - ODOO_SESSION_REDIS_EXPIRATION + - ODOO_SESSION_REDIS_EXPIRATION_ANONYMOUS + - AWS_HOST + - AWS_REGION + - AWS_ACCESS_KEY_ID + - AWS_SECRET_ACCESS_KEY + - AWS_BUCKETNAME networks: - internal @@ -52,11 +65,6 @@ services: - PGADMING_DB_NAME - PGADMING_DB_USER - PGADMIN_DB_PASSWORD - - AWS_HOST - - AWS_REGION - - AWS_ACCESS_KEY_ID - - AWS_SECRET_ACCESS_KEY - - AWS_BUCKETNAME networks: - internal @@ -64,27 +72,27 @@ services: image: eqalpha/keydb:${REDIS_TAG} platform: linux/amd64 ports: - - 6379:6379 + - ${REDIS_PORT}:${REDIS_PORT} restart: unless-stopped + volumes: + - redis-data:${REDIS_DATA} networks: - internal - volumes: - - redis-data:/var/lib/keydb s3: image: minio/minio:${S3_TAG} environment: - MINIO_ROOT_USER - MINIO_ROOT_PASSWORD - - VIRTUAL_HOST=${MINIO_VIRTUAL_HOST} - - VIRTUAL_PORT=9001 - MINIO_BROWSER_REDIRECT_URL - command: server /data --console-address ":9001" + - VIRTUAL_HOST=${MINIO_VIRTUAL_HOST} + - VIRTUAL_PORT=${MINIO_CONSOLE_PORT} + command: server ${MINIO_DATA} --console-address ":${MINIO_CONSOLE_PORT}" volumes: - - s3-data:/data + - s3-data:${MINIO_DATA} ports: - - 9000:9000 - - 9001:9001 + - ${MINIO_API_PORT}:${MINIO_API_PORT} + - ${MINIO_CONSOLE_PORT}:${MINIO_CONSOLE_PORT} networks: - internal diff --git a/odoo/fix-manifest.py b/odoo/fix-manifest.py index 5879cd8..5075e79 100644 --- a/odoo/fix-manifest.py +++ b/odoo/fix-manifest.py @@ -16,7 +16,7 @@ manifest_dict = eval(''.join(lines[start_index:end_index + 1])) # Modify the manifest dictionary manifest_dict['installable'] = True -manifest_dict['auto_install'] = False +manifest_dict['auto_install'] = True # Construct the modified manifest string modified_manifest_lines = ['{\n'] diff --git a/odoo/third-party-addons.sh b/odoo/third-party-addons.sh index e25f60d..9d1ec73 100755 --- a/odoo/third-party-addons.sh +++ b/odoo/third-party-addons.sh @@ -10,8 +10,12 @@ if [ ! -d "odoo-cloud-platform" ]; then cp -r odoo-cloud-platform/attachment_s3 ${THIRD_PARTY_ADDONS}/attachment_s3 fi +# Define the path to the manifest file +redis_manifest="${THIRD_PARTY_ADDONS}/session_redis/__manifest__.py" # Define the path to the manifest file s3_manifest="${THIRD_PARTY_ADDONS}/attachment_s3/__manifest__.py" # Modify the manifest file +# python3 /fix-manifest.py $redis_manifest python3 /fix-manifest.py $s3_manifest +python3 /fix-manifest.py $redis_manifest From 85a192867753e8edaa20f17922c28b74f1c28ee7 Mon Sep 17 00:00:00 2001 From: Yhael S Date: Fri, 6 Oct 2023 23:57:03 -0500 Subject: [PATCH 6/8] cleanup --- .env.example | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.env.example b/.env.example index 644c024..bbe5f42 100644 --- a/.env.example +++ b/.env.example @@ -2,7 +2,7 @@ # Main Configuration # #--------------------------# # Odoo -APP_ENV=local +APP_ENV=staging INIT= UPDATE= LOAD=base,web,session_redis,attachment_s3 @@ -26,7 +26,7 @@ LOAD_LANGUAGE= DB_SSLMODE=prefer DB_MAXCONN=64 DB_TEMPLATE=unaccent_template -UNACCENT=False +UNACCENT=True LIST_DB=True DBFILTER=.* From d85b660a449de9caf6984ac2d9e11525eca076f2 Mon Sep 17 00:00:00 2001 From: Yhael S Date: Fri, 6 Oct 2023 23:57:19 -0500 Subject: [PATCH 7/8] cleanup --- .env.example | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.env.example b/.env.example index bbe5f42..69975a1 100644 --- a/.env.example +++ b/.env.example @@ -2,7 +2,7 @@ # Main Configuration # #--------------------------# # Odoo -APP_ENV=staging +APP_ENV=local INIT= UPDATE= LOAD=base,web,session_redis,attachment_s3 From 2bbaa84714020478b87ac7cea4d5bd7be8d25f16 Mon Sep 17 00:00:00 2001 From: Yhael S Date: Sat, 7 Oct 2023 00:01:34 -0500 Subject: [PATCH 8/8] cleanup --- odoo/odoo.conf | 10 ++++++---- odoo/third-party-addons.sh | 3 +-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/odoo/odoo.conf b/odoo/odoo.conf index 6346b75..39b7ccc 100644 --- a/odoo/odoo.conf +++ b/odoo/odoo.conf @@ -293,16 +293,18 @@ ODOO_SESSION_REDIS_EXPIRATION_ANONYMOUS = ${ODOO_SESSION_REDIS_EXPIRATION_ANONYM ;----------; ; S3 ; ;----------; -; Disable S3 storage +; -- Disable S3 storage DISABLE_ATTACHMENT_STORAGE = ${DISABLE_ATTACHMENT_STORAGE} -; Not required if using AWS S3 +; -- Not required if using AWS S3 AWS_HOST = ${AWS_HOST} -; Required if using AWS services +; -- Required if using AWS services AWS_REGION = ${AWS_REGION} + +; -- AWS Authentication AWS_ACCESS_KEY_ID = ${AWS_ACCESS_KEY_ID} AWS_SECRET_ACCESS_KEY = ${AWS_SECRET_ACCESS_KEY} -; Optional ${db_name} placeholder +; Optional db_name placeholder AWS_BUCKETNAME = ${AWS_BUCKETNAME} diff --git a/odoo/third-party-addons.sh b/odoo/third-party-addons.sh index 9d1ec73..a34bc85 100755 --- a/odoo/third-party-addons.sh +++ b/odoo/third-party-addons.sh @@ -16,6 +16,5 @@ redis_manifest="${THIRD_PARTY_ADDONS}/session_redis/__manifest__.py" s3_manifest="${THIRD_PARTY_ADDONS}/attachment_s3/__manifest__.py" # Modify the manifest file -# python3 /fix-manifest.py $redis_manifest -python3 /fix-manifest.py $s3_manifest python3 /fix-manifest.py $redis_manifest +python3 /fix-manifest.py $s3_manifest