From 9031e517bd391797971bb34e7924218351bd97e0 Mon Sep 17 00:00:00 2001 From: CodeByKyle Date: Sun, 9 Feb 2025 19:17:17 -0500 Subject: [PATCH 01/18] Update wait-for-psql.py Add a --database param which defaults to postgres --- 18.0/wait-for-psql.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/18.0/wait-for-psql.py b/18.0/wait-for-psql.py index a55f44098..42b7734cc 100755 --- a/18.0/wait-for-psql.py +++ b/18.0/wait-for-psql.py @@ -12,13 +12,21 @@ arg_parser.add_argument('--db_user', required=True) arg_parser.add_argument('--db_password', required=True) arg_parser.add_argument('--timeout', type=int, default=5) + arg_parser.add_argument('--database', default='postgres', required=False) args = arg_parser.parse_args() start_time = time.time() while (time.time() - start_time) < args.timeout: try: - conn = psycopg2.connect(user=args.db_user, host=args.db_host, port=args.db_port, password=args.db_password, dbname='postgres') + conn = psycopg2.connect( + user=args.db_user, + host=args.db_host, + port=args.db_port, + password=args.db_password, + dbname=args.database + ) + error = '' break except psycopg2.OperationalError as e: From 6818ec25e9e8ab5c1c68567f38affcc686809203 Mon Sep 17 00:00:00 2001 From: CodeByKyle Date: Sun, 9 Feb 2025 19:17:51 -0500 Subject: [PATCH 02/18] Update entrypoint.sh Add a database param which is removed if not set --- 18.0/entrypoint.sh | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/18.0/entrypoint.sh b/18.0/entrypoint.sh index f802bcb25..767e96b2e 100755 --- a/18.0/entrypoint.sh +++ b/18.0/entrypoint.sh @@ -12,21 +12,30 @@ fi : ${PORT:=${DB_PORT_5432_TCP_PORT:=5432}} : ${USER:=${DB_ENV_POSTGRES_USER:=${POSTGRES_USER:='odoo'}}} : ${PASSWORD:=${DB_ENV_POSTGRES_PASSWORD:=${POSTGRES_PASSWORD:='odoo'}}} +: ${DATABASE:=${DB_ENV_POSTGRES_DATABASE:=${POSTGRES_DATABASE}}} DB_ARGS=() function check_config() { param="$1" value="$2" - if grep -q -E "^\s*\b${param}\b\s*=" "$ODOO_RC" ; then + + if grep -q -E "^\s*\b${param}\b\s*=" "$ODOO_RC" ; then value=$(grep -E "^\s*\b${param}\b\s*=" "$ODOO_RC" |cut -d " " -f3|sed 's/["\n\r]//g') fi; + + if [[ "$param" == "database" && -z "$value" ]]; then + return + fi; + DB_ARGS+=("--${param}") DB_ARGS+=("${value}") } + check_config "db_host" "$HOST" check_config "db_port" "$PORT" check_config "db_user" "$USER" check_config "db_password" "$PASSWORD" +check_config "database" "$DATABASE" case "$1" in -- | odoo) From 0bfc0f78b161d971f59db9c91002f79b8f013a7b Mon Sep 17 00:00:00 2001 From: CodeByKyle Date: Sun, 9 Feb 2025 19:58:29 -0500 Subject: [PATCH 03/18] Support a list of databases to watch --- 18.0/wait-for-psql.py | 43 +++++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/18.0/wait-for-psql.py b/18.0/wait-for-psql.py index 42b7734cc..a2c579da3 100755 --- a/18.0/wait-for-psql.py +++ b/18.0/wait-for-psql.py @@ -4,7 +4,6 @@ import sys import time - if __name__ == '__main__': arg_parser = argparse.ArgumentParser() arg_parser.add_argument('--db_host', required=True) @@ -17,24 +16,28 @@ args = arg_parser.parse_args() start_time = time.time() - while (time.time() - start_time) < args.timeout: - try: - conn = psycopg2.connect( - user=args.db_user, - host=args.db_host, - port=args.db_port, - password=args.db_password, - dbname=args.database - ) + database_list = args.database.split(',') + + for database in database_list: + while (time.time() - start_time) < args.timeout: + try: + conn = psycopg2.connect( + user=args.db_user, + host=args.db_host, + port=args.db_port, + password=args.db_password, + dbname=database + ) + + error = '' + break + except psycopg2.OperationalError as e: + error = e + finally: + conn.close() - error = '' - break - except psycopg2.OperationalError as e: - error = e - else: - conn.close() - time.sleep(1) + if error: + print("Database connection failure: %s" % error, file=sys.stderr) + sys.exit(1) - if error: - print("Database connection failure: %s" % error, file=sys.stderr) - sys.exit(1) + time.sleep(1) From 54ed3880fd301a0b277b1be0193a2b2b759b19e8 Mon Sep 17 00:00:00 2001 From: CodeByKyle Date: Mon, 10 Feb 2025 03:22:26 -0500 Subject: [PATCH 04/18] Generate odoo.conf file from .env vars --- 18.0/Dockerfile | 6 ++- 18.0/docker-compose.yml | 75 +++++++++++++++++++++++++++++++++++ 18.0/entrypoint.sh | 88 +++++++++++++++++++++++++---------------- 18.0/odoo.conf | 77 +++++++++++++++++++----------------- 18.0/wait-for-psql.py | 61 ++++++++++++++++++++-------- 5 files changed, 218 insertions(+), 89 deletions(-) create mode 100644 18.0/docker-compose.yml diff --git a/18.0/Dockerfile b/18.0/Dockerfile index d1882e2ef..b0efeeaad 100644 --- a/18.0/Dockerfile +++ b/18.0/Dockerfile @@ -14,6 +14,7 @@ ARG TARGETARCH RUN apt-get update && \ DEBIAN_FRONTEND=noninteractive \ apt-get install -y --no-install-recommends \ + gettext \ ca-certificates \ curl \ dirmngr \ @@ -81,7 +82,10 @@ RUN curl -o odoo.deb -sSL http://nightly.odoo.com/${ODOO_VERSION}/nightly/deb/od # Copy entrypoint script and Odoo configuration file COPY ./entrypoint.sh / -COPY ./odoo.conf /etc/odoo/ + +# Copy the configuration file to the template. +# The template will +COPY ./odoo.conf /etc/odoo/odoo.conf # Set permissions and Mount /var/lib/odoo to allow restoring filestore and /mnt/extra-addons for users addons RUN chown odoo /etc/odoo/odoo.conf \ diff --git a/18.0/docker-compose.yml b/18.0/docker-compose.yml new file mode 100644 index 000000000..75fae2997 --- /dev/null +++ b/18.0/docker-compose.yml @@ -0,0 +1,75 @@ +version: '3.8' + +services: + odoo: + build: + context: . + dockerfile: Dockerfile + container_name: odoo + environment: + ADDONS_PATH: ${ADDONS_PATH:-/mnt/extra-addons} + DATA_DIR: ${DATA_DIR:-/var/lib/odoo} + DB_HOST: ${HOST:-${DB_PORT_5432_TCP_ADDR:-postgres}} + DB_PORT: ${PORT:-${DB_PORT_5432_TCP_PORT:-5432}} + DB_USER: ${USER:-${DB_ENV_POSTGRES_USER:-${POSTGRES_USER:-odoo}}} + DB_PASSWORD: ${PASSWORD:-${DB_ENV_POSTGRES_PASSWORD:-${POSTGRES_PASSWORD:-odoo}}} + DB_NAME: ${DB_NAME:-${DATABASE:-${DB_ENV_POSTGRES_DATABASE:-odoo}}} + ADMIN_PASSWD: ${ADMIN_PASSWD:-admin} + CSV_INTERNAL_SEP: ${CSV_INTERNAL_SEP:-,} + DB_MAXCONN: ${DB_MAXCONN:-64} + DB_TEMPLATE: ${DB_TEMPLATE:-template1} + DBFILTER: ${DBFILTER:-.*} + DEBUG_MODE: ${DEBUG_MODE:-False} + EMAIL_FROM: ${EMAIL_FROM:-False} + LIMIT_MEMORY_HARD: ${LIMIT_MEMORY_HARD:-2684354560} + LIMIT_MEMORY_SOFT: ${LIMIT_MEMORY_SOFT:-2147483648} + LIMIT_REQUEST: ${LIMIT_REQUEST:-8192} + LIMIT_TIME_CPU: ${LIMIT_TIME_CPU:-60} + LIMIT_TIME_REAL: ${LIMIT_TIME_REAL:-120} + LIST_DB: ${LIST_DB:-True} + LOG_DB: ${LOG_DB:-False} + LOG_HANDLER: ${LOG_HANDLER:-[:INFO]} + LOG_LEVEL: ${LOG_LEVEL:-info} + LOGFILE: ${LOGFILE:-None} + LONGPOLLING_PORT: ${LONGPOLLING_PORT:-8072} + MAX_CRON_THREADS: ${MAX_CRON_THREADS:-2} + OSV_MEMORY_AGE_LIMIT: ${OSV_MEMORY_AGE_LIMIT:-1.0} + OSV_MEMORY_COUNT_LIMIT: ${OSV_MEMORY_COUNT_LIMIT:-False} + SMTP_PASSWORD: ${SMTP_PASSWORD:-False} + SMTP_PORT: ${SMTP_PORT:-25} + SMTP_SERVER: ${SMTP_SERVER:-localhost} + SMTP_SSL: ${SMTP_SSL:-False} + SMTP_USER: ${SMTP_USER:-False} + WORKERS: ${WORKERS:-0} + XMLRPC: ${XMLRPC:-True} + XMLRPC_INTERFACE: ${XMLRPC_INTERFACE:-} + XMLRPC_PORT: ${XMLRPC_PORT:-8069} + XMLRPCS: ${XMLRPCS:-True} + XMLRPCS_INTERFACE: ${XMLRPCS_INTERFACE:-} + XMLRPCS_PORT: ${XMLRPCS_PORT:-8071} + ports: + - "8069:8069" + - "8071:8071" + - "8072:8072" + volumes: + - odoo_data:/var/lib/odoo + - ./addons:/mnt/extra-addons + depends_on: + - db + command: + - "scaffold test" + db: + image: postgres:13 + container_name: odoo_db + environment: + POSTGRES_USER: ${POSTGRES_USER:-odoo} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-odoo} + POSTGRES_DB: ${POSTGRES_DATABASE:-postgres} + volumes: + - pg_data:/var/lib/postgresql/data + ports: + - "5432:5432" + +volumes: + odoo_data: + pg_data: diff --git a/18.0/entrypoint.sh b/18.0/entrypoint.sh index 767e96b2e..7abce51cd 100755 --- a/18.0/entrypoint.sh +++ b/18.0/entrypoint.sh @@ -2,40 +2,58 @@ set -e +# Setup default configuration values +export ADDONS_PATH=${ADDONS_PATH:-/mnt/extra-addons} +export DATA_DIR=${DATA_DIR:-/var/lib/odoo} +export DB_HOST=${HOST:=${DB_PORT_5432_TCP_ADDR:='db'}} +export DB_PORT=${PORT:=${DB_PORT_5432_TCP_PORT:=5432}} +export DB_USER=${USER:=${DB_ENV_POSTGRES_USER:=${POSTGRES_USER:='odoo'}}} +export DB_PASSWORD=${PASSWORD:=${DB_ENV_POSTGRES_PASSWORD:=${POSTGRES_PASSWORD:='odoo'}}} +export DB_NAME=${DB_NAME:-'postgres'} +export ADMIN_PASSWD=${ADMIN_PASSWD:-admin} +export CSV_INTERNAL_SEP=${CSV_INTERNAL_SEP:-,} +export DB_MAXCONN=${DB_MAXCONN:-64} +export DB_TEMPLATE=${DB_TEMPLATE:-template1} +export DBFILTER=${DBFILTER:-.*} +export DEBUG_MODE=${DEBUG_MODE:-False} +export EMAIL_FROM=${EMAIL_FROM:-False} +export LIMIT_MEMORY_HARD=${LIMIT_MEMORY_HARD:-2684354560} +export LIMIT_MEMORY_SOFT=${LIMIT_MEMORY_SOFT:-2147483648} +export LIMIT_REQUEST=${LIMIT_REQUEST:-8192} +export LIMIT_TIME_CPU=${LIMIT_TIME_CPU:-60} +export LIMIT_TIME_REAL=${LIMIT_TIME_REAL:-120} +export LIST_DB=${LIST_DB:-True} +export LOG_DB=${LOG_DB:-False} +export LOG_HANDLER=${LOG_HANDLER:-[:INFO]} +export LOG_LEVEL=${LOG_LEVEL:-info} +export LOGFILE=${LOGFILE:-None} +export LONGPOLLING_PORT=${LONGPOLLING_PORT:-8072} +export MAX_CRON_THREADS=${MAX_CRON_THREADS:-2} +export OSV_MEMORY_AGE_LIMIT=${OSV_MEMORY_AGE_LIMIT:-1.0} +export OSV_MEMORY_COUNT_LIMIT=${OSV_MEMORY_COUNT_LIMIT:-False} +export SMTP_PASSWORD=${SMTP_PASSWORD:-False} +export SMTP_PORT=${SMTP_PORT:-25} +export SMTP_SERVER=${SMTP_SERVER:-localhost} +export SMTP_SSL=${SMTP_SSL:-False} +export SMTP_USER=${SMTP_USER:-False} +export WORKERS=${WORKERS:-0} +export XMLRPC=${XMLRPC:-True} +export XMLRPC_INTERFACE=${XMLRPC_INTERFACE:-} +export XMLRPC_PORT=${XMLRPC_PORT:-8069} +export XMLRPCS=${XMLRPCS:-True} +export XMLRPCS_INTERFACE=${XMLRPCS_INTERFACE:-} +export XMLRPCS_PORT=${XMLRPCS_PORT:-8071} + +# Set the password file environment variable if [ -v PASSWORD_FILE ]; then - PASSWORD="$(< $PASSWORD_FILE)" + DB_PASSWORD="$(< $PASSWORD_FILE)" fi -# set the postgres database host, port, user and password according to the environment -# and pass them as arguments to the odoo process if not present in the config file -: ${HOST:=${DB_PORT_5432_TCP_ADDR:='db'}} -: ${PORT:=${DB_PORT_5432_TCP_PORT:=5432}} -: ${USER:=${DB_ENV_POSTGRES_USER:=${POSTGRES_USER:='odoo'}}} -: ${PASSWORD:=${DB_ENV_POSTGRES_PASSWORD:=${POSTGRES_PASSWORD:='odoo'}}} -: ${DATABASE:=${DB_ENV_POSTGRES_DATABASE:=${POSTGRES_DATABASE}}} - -DB_ARGS=() -function check_config() { - param="$1" - value="$2" - - if grep -q -E "^\s*\b${param}\b\s*=" "$ODOO_RC" ; then - value=$(grep -E "^\s*\b${param}\b\s*=" "$ODOO_RC" |cut -d " " -f3|sed 's/["\n\r]//g') - fi; - - if [[ "$param" == "database" && -z "$value" ]]; then - return - fi; - - DB_ARGS+=("--${param}") - DB_ARGS+=("${value}") -} - -check_config "db_host" "$HOST" -check_config "db_port" "$PORT" -check_config "db_user" "$USER" -check_config "db_password" "$PASSWORD" -check_config "database" "$DATABASE" +# Substitute environment variables into the config file +# and write them back to the Odoo config +export CONFIG_CONTENT; +CONFIG_CONTENT=$(envsubst < /etc/odoo/odoo.conf) +echo "$CONFIG_CONTENT" > /etc/odoo/odoo.conf case "$1" in -- | odoo) @@ -43,13 +61,13 @@ case "$1" in if [[ "$1" == "scaffold" ]] ; then exec odoo "$@" else - wait-for-psql.py ${DB_ARGS[@]} --timeout=30 - exec odoo "$@" "${DB_ARGS[@]}" + wait-for-psql.py --timeout=30 + exec odoo "$@" fi ;; -*) - wait-for-psql.py ${DB_ARGS[@]} --timeout=30 - exec odoo "$@" "${DB_ARGS[@]}" + wait-for-psql.py --timeout=30 + exec odoo "$@" ;; *) exec "$@" diff --git a/18.0/odoo.conf b/18.0/odoo.conf index 28f70c105..4eb5db14d 100644 --- a/18.0/odoo.conf +++ b/18.0/odoo.conf @@ -1,37 +1,42 @@ [options] -addons_path = /mnt/extra-addons -data_dir = /var/lib/odoo -; admin_passwd = admin -; csv_internal_sep = , -; db_maxconn = 64 -; db_name = False -; db_template = template1 -; dbfilter = .* -; debug_mode = False -; email_from = False -; limit_memory_hard = 2684354560 -; limit_memory_soft = 2147483648 -; limit_request = 8192 -; limit_time_cpu = 60 -; limit_time_real = 120 -; list_db = True -; log_db = False -; log_handler = [':INFO'] -; log_level = info -; logfile = None -; longpolling_port = 8072 -; max_cron_threads = 2 -; osv_memory_age_limit = 1.0 -; osv_memory_count_limit = False -; smtp_password = False -; smtp_port = 25 -; smtp_server = localhost -; smtp_ssl = False -; smtp_user = False -; workers = 0 -; xmlrpc = True -; xmlrpc_interface = -; xmlrpc_port = 8069 -; xmlrpcs = True -; xmlrpcs_interface = -; xmlrpcs_port = 8071 +addons_path = $ADDONS_PATH +data_dir = $DATA_DIR +db_host = $DB_HOST +db_port = $DB_PORT +db_user = $DB_USER +db_password = $DB_PASSWORD +db_name = $DB_NAME + +; admin_passwd = $ADMIN_PASSWD +; csv_internal_sep = $CSV_INTERNAL_SEP +; db_maxconn = $DB_MAXCONN +; db_template = $DB_TEMPLATE +; dbfilter = $DBFILTER +; debug_mode = $DEBUG_MODE +; email_from = $EMAIL_FROM +; limit_memory_hard = $LIMIT_MEMORY_HARD +; limit_memory_soft = $LIMIT_MEMORY_SOFT +; limit_request = $LIMIT_REQUEST +; limit_time_cpu = $LIMIT_TIME_CPU +; limit_time_real = $LIMIT_TIME_REAL +; list_db = $LIST_DB +; log_db = $LOG_DB +; log_handler = $LOG_HANDLER +; log_level = $LOG_LEVEL +; logfile = $LOGFILE +; longpolling_port = $LONGPOLLING_PORT +; max_cron_threads = $MAX_CRON_THREADS +; osv_memory_age_limit = $OSV_MEMORY_AGE_LIMIT +; osv_memory_count_limit = $OSV_MEMORY_COUNT_LIMIT +; smtp_password = $SMTP_PASSWORD +; smtp_port = $SMTP_PORT +; smtp_server = $SMTP_SERVER +; smtp_ssl = $SMTP_SSL +; smtp_user = $SMTP_USER +; workers = $WORKERS +; xmlrpc = $XMLRPC +; xmlrpc_interface = $XMLRPC_INTERFACE +; xmlrpc_port = $XMLRPC_PORT +; xmlrpcs = $XMLRPCS +; xmlrpcs_interface = $XMLRPCS_INTERFACE +; xmlrpcs_port = $XMLRPCS_PORT diff --git a/18.0/wait-for-psql.py b/18.0/wait-for-psql.py index a2c579da3..2581ac0c9 100755 --- a/18.0/wait-for-psql.py +++ b/18.0/wait-for-psql.py @@ -1,43 +1,70 @@ #!/usr/bin/env python3 import argparse +import os import psycopg2 import sys import time +import configparser +import logging + +logging.basicConfig( + format="%(asctime)s - %(levelname)s - %(message)s", + level=logging.INFO +) + +class DatabaseConnectionError(Exception): + pass if __name__ == '__main__': + default_config_path = os.getenv('ODOO_RC', '/etc/odoo/odoo.conf') + arg_parser = argparse.ArgumentParser() - arg_parser.add_argument('--db_host', required=True) - arg_parser.add_argument('--db_port', required=True) - arg_parser.add_argument('--db_user', required=True) - arg_parser.add_argument('--db_password', required=True) + arg_parser.add_argument('--config', type=str, default=default_config_path) arg_parser.add_argument('--timeout', type=int, default=5) - arg_parser.add_argument('--database', default='postgres', required=False) args = arg_parser.parse_args() + config = configparser.ConfigParser() + config.read(args.config) + + db_host = config.get('options', 'db_host', fallback='localhost') + db_port = config.get('options', 'db_port', fallback=5432) + db_user = config.get('options', 'db_user', fallback='odoo') + db_password = config.get('options', 'db_password', fallback='odoo') + db_name = config.get('options', 'db_name', fallback='postgres') + start_time = time.time() - database_list = args.database.split(',') + + database_list = db_name.split(',') + logging.info("Waiting for database(s) to be ready ...") + logging.info(f"Host: {db_user}@{db_host}:{db_port}") + logging.info(f"Database(s): {database_list}") + logging.info(f"Timeout: {args.timeout} seconds") for database in database_list: + logging.info(f"Checking database {database} ...") + error = None + while (time.time() - start_time) < args.timeout: try: conn = psycopg2.connect( - user=args.db_user, - host=args.db_host, - port=args.db_port, - password=args.db_password, + user=db_user, + host=db_host, + port=db_port, + password=db_password, dbname=database ) - error = '' + error = None + conn.close() + + logging.info(f"Database {database} is ready.") break except psycopg2.OperationalError as e: error = e - finally: - conn.close() + time.sleep(1) - if error: - print("Database connection failure: %s" % error, file=sys.stderr) - sys.exit(1) + if error: + raise DatabaseConnectionError(f"Database {database} connection failure: {error}") - time.sleep(1) + logging.info("🚀 Database(s) are ready.") \ No newline at end of file From fe7e0f01890e0a61a90113d71378d317a92a9e35 Mon Sep 17 00:00:00 2001 From: CodeByKyle Date: Mon, 10 Feb 2025 03:24:24 -0500 Subject: [PATCH 05/18] Left test command... --- 18.0/docker-compose.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/18.0/docker-compose.yml b/18.0/docker-compose.yml index 75fae2997..a0c3ada91 100644 --- a/18.0/docker-compose.yml +++ b/18.0/docker-compose.yml @@ -56,8 +56,6 @@ services: - ./addons:/mnt/extra-addons depends_on: - db - command: - - "scaffold test" db: image: postgres:13 container_name: odoo_db From cdd1ace6f0ca5fff54fd7a34d0fed8f56077ad6b Mon Sep 17 00:00:00 2001 From: CodeByKyle Date: Mon, 10 Feb 2025 03:25:28 -0500 Subject: [PATCH 06/18] Add docker compose --- 18.0/docker-compose.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/18.0/docker-compose.yml b/18.0/docker-compose.yml index a0c3ada91..82a8b6f00 100644 --- a/18.0/docker-compose.yml +++ b/18.0/docker-compose.yml @@ -56,6 +56,7 @@ services: - ./addons:/mnt/extra-addons depends_on: - db + db: image: postgres:13 container_name: odoo_db From ac3bba7049b7bbd5d21b7e05f8bcb198151936fe Mon Sep 17 00:00:00 2001 From: CodeByKyle Date: Mon, 10 Feb 2025 03:26:31 -0500 Subject: [PATCH 07/18] db_name should not be specified by default --- 18.0/odoo.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/18.0/odoo.conf b/18.0/odoo.conf index 4eb5db14d..5b2025e57 100644 --- a/18.0/odoo.conf +++ b/18.0/odoo.conf @@ -5,8 +5,8 @@ db_host = $DB_HOST db_port = $DB_PORT db_user = $DB_USER db_password = $DB_PASSWORD -db_name = $DB_NAME +; db_name = $DB_NAME ; admin_passwd = $ADMIN_PASSWD ; csv_internal_sep = $CSV_INTERNAL_SEP ; db_maxconn = $DB_MAXCONN From 26c0f6f43308ba39faa95ad48a7cb0ae493d3141 Mon Sep 17 00:00:00 2001 From: CodeByKyle Date: Mon, 10 Feb 2025 03:36:16 -0500 Subject: [PATCH 08/18] Remove unfinished comment --- 18.0/Dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/18.0/Dockerfile b/18.0/Dockerfile index b0efeeaad..daf2c9712 100644 --- a/18.0/Dockerfile +++ b/18.0/Dockerfile @@ -84,7 +84,6 @@ RUN curl -o odoo.deb -sSL http://nightly.odoo.com/${ODOO_VERSION}/nightly/deb/od COPY ./entrypoint.sh / # Copy the configuration file to the template. -# The template will COPY ./odoo.conf /etc/odoo/odoo.conf # Set permissions and Mount /var/lib/odoo to allow restoring filestore and /mnt/extra-addons for users addons From 5ad9e9f4315439115b42f5cae6d2ffbb8da7e074 Mon Sep 17 00:00:00 2001 From: CodeByKyle Date: Mon, 10 Feb 2025 21:01:10 -0500 Subject: [PATCH 09/18] Change odoo rc location --- 18.0/Dockerfile | 5 +-- 18.0/docker-compose.yml | 78 ++++++++++++++++++++--------------------- 18.0/entrypoint.sh | 4 +-- 3 files changed, 43 insertions(+), 44 deletions(-) diff --git a/18.0/Dockerfile b/18.0/Dockerfile index daf2c9712..a9af2ead8 100644 --- a/18.0/Dockerfile +++ b/18.0/Dockerfile @@ -85,9 +85,10 @@ COPY ./entrypoint.sh / # Copy the configuration file to the template. COPY ./odoo.conf /etc/odoo/odoo.conf +RUN touch /etc/odoo/odoo_docker.conf # Set permissions and Mount /var/lib/odoo to allow restoring filestore and /mnt/extra-addons for users addons -RUN chown odoo /etc/odoo/odoo.conf \ +RUN chown odoo:odoo /etc/odoo/odoo.conf /etc/odoo/odoo_docker.conf \ && mkdir -p /mnt/extra-addons \ && chown -R odoo /mnt/extra-addons VOLUME ["/var/lib/odoo", "/mnt/extra-addons"] @@ -96,7 +97,7 @@ VOLUME ["/var/lib/odoo", "/mnt/extra-addons"] EXPOSE 8069 8071 8072 # Set the default config file -ENV ODOO_RC /etc/odoo/odoo.conf +ENV ODOO_RC /etc/odoo/odoo_docker.conf COPY wait-for-psql.py /usr/local/bin/wait-for-psql.py diff --git a/18.0/docker-compose.yml b/18.0/docker-compose.yml index 82a8b6f00..87e57e676 100644 --- a/18.0/docker-compose.yml +++ b/18.0/docker-compose.yml @@ -8,45 +8,45 @@ services: container_name: odoo environment: ADDONS_PATH: ${ADDONS_PATH:-/mnt/extra-addons} - DATA_DIR: ${DATA_DIR:-/var/lib/odoo} - DB_HOST: ${HOST:-${DB_PORT_5432_TCP_ADDR:-postgres}} - DB_PORT: ${PORT:-${DB_PORT_5432_TCP_PORT:-5432}} - DB_USER: ${USER:-${DB_ENV_POSTGRES_USER:-${POSTGRES_USER:-odoo}}} - DB_PASSWORD: ${PASSWORD:-${DB_ENV_POSTGRES_PASSWORD:-${POSTGRES_PASSWORD:-odoo}}} - DB_NAME: ${DB_NAME:-${DATABASE:-${DB_ENV_POSTGRES_DATABASE:-odoo}}} - ADMIN_PASSWD: ${ADMIN_PASSWD:-admin} - CSV_INTERNAL_SEP: ${CSV_INTERNAL_SEP:-,} - DB_MAXCONN: ${DB_MAXCONN:-64} - DB_TEMPLATE: ${DB_TEMPLATE:-template1} - DBFILTER: ${DBFILTER:-.*} - DEBUG_MODE: ${DEBUG_MODE:-False} - EMAIL_FROM: ${EMAIL_FROM:-False} - LIMIT_MEMORY_HARD: ${LIMIT_MEMORY_HARD:-2684354560} - LIMIT_MEMORY_SOFT: ${LIMIT_MEMORY_SOFT:-2147483648} - LIMIT_REQUEST: ${LIMIT_REQUEST:-8192} - LIMIT_TIME_CPU: ${LIMIT_TIME_CPU:-60} - LIMIT_TIME_REAL: ${LIMIT_TIME_REAL:-120} - LIST_DB: ${LIST_DB:-True} - LOG_DB: ${LOG_DB:-False} - LOG_HANDLER: ${LOG_HANDLER:-[:INFO]} - LOG_LEVEL: ${LOG_LEVEL:-info} - LOGFILE: ${LOGFILE:-None} - LONGPOLLING_PORT: ${LONGPOLLING_PORT:-8072} - MAX_CRON_THREADS: ${MAX_CRON_THREADS:-2} - OSV_MEMORY_AGE_LIMIT: ${OSV_MEMORY_AGE_LIMIT:-1.0} - OSV_MEMORY_COUNT_LIMIT: ${OSV_MEMORY_COUNT_LIMIT:-False} - SMTP_PASSWORD: ${SMTP_PASSWORD:-False} - SMTP_PORT: ${SMTP_PORT:-25} - SMTP_SERVER: ${SMTP_SERVER:-localhost} - SMTP_SSL: ${SMTP_SSL:-False} - SMTP_USER: ${SMTP_USER:-False} - WORKERS: ${WORKERS:-0} - XMLRPC: ${XMLRPC:-True} - XMLRPC_INTERFACE: ${XMLRPC_INTERFACE:-} - XMLRPC_PORT: ${XMLRPC_PORT:-8069} - XMLRPCS: ${XMLRPCS:-True} - XMLRPCS_INTERFACE: ${XMLRPCS_INTERFACE:-} - XMLRPCS_PORT: ${XMLRPCS_PORT:-8071} +# DATA_DIR: ${DATA_DIR:-/var/lib/odoo} +# DB_HOST: ${HOST:-${DB_PORT_5432_TCP_ADDR:-postgres}} +# DB_PORT: ${PORT:-${DB_PORT_5432_TCP_PORT:-5432}} +# DB_USER: ${USER:-${DB_ENV_POSTGRES_USER:-${POSTGRES_USER:-odoo}}} +# DB_PASSWORD: ${PASSWORD:-${DB_ENV_POSTGRES_PASSWORD:-${POSTGRES_PASSWORD:-odoo}}} +# DB_NAME: ${DB_NAME:-${DATABASE:-${DB_ENV_POSTGRES_DATABASE:-odoo}}} +# ADMIN_PASSWD: ${ADMIN_PASSWD:-admin} +# CSV_INTERNAL_SEP: ${CSV_INTERNAL_SEP:-,} +# DB_MAXCONN: ${DB_MAXCONN:-64} +# DB_TEMPLATE: ${DB_TEMPLATE:-template1} +# DBFILTER: ${DBFILTER:-.*} +# DEBUG_MODE: ${DEBUG_MODE:-False} +# EMAIL_FROM: ${EMAIL_FROM:-False} +# LIMIT_MEMORY_HARD: ${LIMIT_MEMORY_HARD:-2684354560} +# LIMIT_MEMORY_SOFT: ${LIMIT_MEMORY_SOFT:-2147483648} +# LIMIT_REQUEST: ${LIMIT_REQUEST:-8192} +# LIMIT_TIME_CPU: ${LIMIT_TIME_CPU:-60} +# LIMIT_TIME_REAL: ${LIMIT_TIME_REAL:-120} +# LIST_DB: ${LIST_DB:-True} +# LOG_DB: ${LOG_DB:-False} +# LOG_HANDLER: ${LOG_HANDLER:-[:INFO]} +# LOG_LEVEL: ${LOG_LEVEL:-info} +# LOGFILE: ${LOGFILE:-None} +# LONGPOLLING_PORT: ${LONGPOLLING_PORT:-8072} +# MAX_CRON_THREADS: ${MAX_CRON_THREADS:-2} +# OSV_MEMORY_AGE_LIMIT: ${OSV_MEMORY_AGE_LIMIT:-1.0} +# OSV_MEMORY_COUNT_LIMIT: ${OSV_MEMORY_COUNT_LIMIT:-False} +# SMTP_PASSWORD: ${SMTP_PASSWORD:-False} +# SMTP_PORT: ${SMTP_PORT:-25} +# SMTP_SERVER: ${SMTP_SERVER:-localhost} +# SMTP_SSL: ${SMTP_SSL:-False} +# SMTP_USER: ${SMTP_USER:-False} +# WORKERS: ${WORKERS:-0} +# XMLRPC: ${XMLRPC:-True} +# XMLRPC_INTERFACE: ${XMLRPC_INTERFACE:-} +# XMLRPC_PORT: ${XMLRPC_PORT:-8069} +# XMLRPCS: ${XMLRPCS:-True} +# XMLRPCS_INTERFACE: ${XMLRPCS_INTERFACE:-} +# XMLRPCS_PORT: ${XMLRPCS_PORT:-8071} ports: - "8069:8069" - "8071:8071" diff --git a/18.0/entrypoint.sh b/18.0/entrypoint.sh index 7abce51cd..6d71d8d07 100755 --- a/18.0/entrypoint.sh +++ b/18.0/entrypoint.sh @@ -51,9 +51,7 @@ fi # Substitute environment variables into the config file # and write them back to the Odoo config -export CONFIG_CONTENT; -CONFIG_CONTENT=$(envsubst < /etc/odoo/odoo.conf) -echo "$CONFIG_CONTENT" > /etc/odoo/odoo.conf +envsubst < /etc/odoo/odoo.conf > /etc/odoo/odoo_docker.conf case "$1" in -- | odoo) From 899adb9c4ab1844abffde508ed63c9cc4a5a8264 Mon Sep 17 00:00:00 2001 From: CodeByKyle Date: Mon, 10 Feb 2025 21:03:06 -0500 Subject: [PATCH 10/18] Update the docker compose file to comment out unused env values --- 18.0/docker-compose.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/18.0/docker-compose.yml b/18.0/docker-compose.yml index 87e57e676..364690cb3 100644 --- a/18.0/docker-compose.yml +++ b/18.0/docker-compose.yml @@ -8,11 +8,11 @@ services: container_name: odoo environment: ADDONS_PATH: ${ADDONS_PATH:-/mnt/extra-addons} -# DATA_DIR: ${DATA_DIR:-/var/lib/odoo} -# DB_HOST: ${HOST:-${DB_PORT_5432_TCP_ADDR:-postgres}} -# DB_PORT: ${PORT:-${DB_PORT_5432_TCP_PORT:-5432}} -# DB_USER: ${USER:-${DB_ENV_POSTGRES_USER:-${POSTGRES_USER:-odoo}}} -# DB_PASSWORD: ${PASSWORD:-${DB_ENV_POSTGRES_PASSWORD:-${POSTGRES_PASSWORD:-odoo}}} + DATA_DIR: ${DATA_DIR:-/var/lib/odoo} + DB_HOST: ${HOST:-${DB_PORT_5432_TCP_ADDR:-postgres}} + DB_PORT: ${PORT:-${DB_PORT_5432_TCP_PORT:-5432}} + DB_USER: ${USER:-${DB_ENV_POSTGRES_USER:-${POSTGRES_USER:-odoo}}} + DB_PASSWORD: ${PASSWORD:-${DB_ENV_POSTGRES_PASSWORD:-${POSTGRES_PASSWORD:-odoo}}} # DB_NAME: ${DB_NAME:-${DATABASE:-${DB_ENV_POSTGRES_DATABASE:-odoo}}} # ADMIN_PASSWD: ${ADMIN_PASSWD:-admin} # CSV_INTERNAL_SEP: ${CSV_INTERNAL_SEP:-,} From 0a728d93fe9e7b66edcaa5d13ac123a79d8d294a Mon Sep 17 00:00:00 2001 From: CodeByKyle Date: Mon, 10 Feb 2025 21:07:44 -0500 Subject: [PATCH 11/18] Change the default config path to use the odoo_docker.conf file --- 18.0/wait-for-psql.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/18.0/wait-for-psql.py b/18.0/wait-for-psql.py index 2581ac0c9..a4d1b0b5a 100755 --- a/18.0/wait-for-psql.py +++ b/18.0/wait-for-psql.py @@ -16,7 +16,7 @@ class DatabaseConnectionError(Exception): pass if __name__ == '__main__': - default_config_path = os.getenv('ODOO_RC', '/etc/odoo/odoo.conf') + default_config_path = os.getenv('ODOO_RC', '/etc/odoo/odoo_docker.conf') arg_parser = argparse.ArgumentParser() arg_parser.add_argument('--config', type=str, default=default_config_path) From fcfeb41f25d5728dbd52371f62f66366411b238b Mon Sep 17 00:00:00 2001 From: CodeByKyle Date: Mon, 10 Feb 2025 21:30:47 -0500 Subject: [PATCH 12/18] Simplify the docker compose environments; forgot to add new DB vars (DB_HOST, DB_PORT, DB_USER, DB_PASSWORD) as possible environment vars --- 18.0/docker-compose.yml | 10 +++++----- 18.0/entrypoint.sh | 12 +++++++----- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/18.0/docker-compose.yml b/18.0/docker-compose.yml index 364690cb3..fdc3db7af 100644 --- a/18.0/docker-compose.yml +++ b/18.0/docker-compose.yml @@ -9,11 +9,11 @@ services: environment: ADDONS_PATH: ${ADDONS_PATH:-/mnt/extra-addons} DATA_DIR: ${DATA_DIR:-/var/lib/odoo} - DB_HOST: ${HOST:-${DB_PORT_5432_TCP_ADDR:-postgres}} - DB_PORT: ${PORT:-${DB_PORT_5432_TCP_PORT:-5432}} - DB_USER: ${USER:-${DB_ENV_POSTGRES_USER:-${POSTGRES_USER:-odoo}}} - DB_PASSWORD: ${PASSWORD:-${DB_ENV_POSTGRES_PASSWORD:-${POSTGRES_PASSWORD:-odoo}}} -# DB_NAME: ${DB_NAME:-${DATABASE:-${DB_ENV_POSTGRES_DATABASE:-odoo}}} + DB_HOST: ${DB_HOST:-db} + DB_PORT: ${DB_PORT:-5432} + DB_USER: ${DB_USER:-odoo} + DB_PASSWORD: ${DB_PASSWORD:-odoo} +# DB_NAME: ${DB_NAME:-postgres} # ADMIN_PASSWD: ${ADMIN_PASSWD:-admin} # CSV_INTERNAL_SEP: ${CSV_INTERNAL_SEP:-,} # DB_MAXCONN: ${DB_MAXCONN:-64} diff --git a/18.0/entrypoint.sh b/18.0/entrypoint.sh index 6d71d8d07..6b1313c11 100755 --- a/18.0/entrypoint.sh +++ b/18.0/entrypoint.sh @@ -5,10 +5,10 @@ set -e # Setup default configuration values export ADDONS_PATH=${ADDONS_PATH:-/mnt/extra-addons} export DATA_DIR=${DATA_DIR:-/var/lib/odoo} -export DB_HOST=${HOST:=${DB_PORT_5432_TCP_ADDR:='db'}} -export DB_PORT=${PORT:=${DB_PORT_5432_TCP_PORT:=5432}} -export DB_USER=${USER:=${DB_ENV_POSTGRES_USER:=${POSTGRES_USER:='odoo'}}} -export DB_PASSWORD=${PASSWORD:=${DB_ENV_POSTGRES_PASSWORD:=${POSTGRES_PASSWORD:='odoo'}}} +export DB_HOST=${DB_HOST:=${HOST:=${DB_PORT_5432_TCP_ADDR:='db'}}} +export DB_PORT=${DB_PORT:=${PORT:=${DB_PORT_5432_TCP_PORT:=5432}}} +export DB_USER=${DB_USER:=${USER:=${DB_ENV_POSTGRES_USER:=${POSTGRES_USER:='odoo'}}}} +export DB_PASSWORD=${DB_PASSWORD:=${PASSWORD:=${DB_ENV_POSTGRES_PASSWORD:=${POSTGRES_PASSWORD:='odoo'}}}} export DB_NAME=${DB_NAME:-'postgres'} export ADMIN_PASSWD=${ADMIN_PASSWD:-admin} export CSV_INTERNAL_SEP=${CSV_INTERNAL_SEP:-,} @@ -44,6 +44,8 @@ export XMLRPCS=${XMLRPCS:-True} export XMLRPCS_INTERFACE=${XMLRPCS_INTERFACE:-} export XMLRPCS_PORT=${XMLRPCS_PORT:-8071} +echo $DB_HOST + # Set the password file environment variable if [ -v PASSWORD_FILE ]; then DB_PASSWORD="$(< $PASSWORD_FILE)" @@ -51,7 +53,7 @@ fi # Substitute environment variables into the config file # and write them back to the Odoo config -envsubst < /etc/odoo/odoo.conf > /etc/odoo/odoo_docker.conf +envsubst < /etc/odoo/odoo.conf > "${ODOO_RC}" case "$1" in -- | odoo) From b5c9fd110870793150785c77022eed0230c47411 Mon Sep 17 00:00:00 2001 From: CodeByKyle Date: Mon, 10 Feb 2025 21:31:29 -0500 Subject: [PATCH 13/18] Remove echo --- 18.0/entrypoint.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/18.0/entrypoint.sh b/18.0/entrypoint.sh index 6b1313c11..751c37f66 100755 --- a/18.0/entrypoint.sh +++ b/18.0/entrypoint.sh @@ -44,8 +44,6 @@ export XMLRPCS=${XMLRPCS:-True} export XMLRPCS_INTERFACE=${XMLRPCS_INTERFACE:-} export XMLRPCS_PORT=${XMLRPCS_PORT:-8071} -echo $DB_HOST - # Set the password file environment variable if [ -v PASSWORD_FILE ]; then DB_PASSWORD="$(< $PASSWORD_FILE)" From 10f18396a934e80e31c2f613b478b138d8df7003 Mon Sep 17 00:00:00 2001 From: CodeByKyle Date: Tue, 11 Feb 2025 01:36:21 -0500 Subject: [PATCH 14/18] Rename osv_memory_age_limit to transient_age_limit --- 18.0/docker-compose.yml | 68 ++++++++++++++++++++--------------------- 18.0/entrypoint.sh | 2 +- 18.0/odoo.conf | 68 ++++++++++++++++++++--------------------- 3 files changed, 69 insertions(+), 69 deletions(-) diff --git a/18.0/docker-compose.yml b/18.0/docker-compose.yml index fdc3db7af..b01f585b1 100644 --- a/18.0/docker-compose.yml +++ b/18.0/docker-compose.yml @@ -13,40 +13,40 @@ services: DB_PORT: ${DB_PORT:-5432} DB_USER: ${DB_USER:-odoo} DB_PASSWORD: ${DB_PASSWORD:-odoo} -# DB_NAME: ${DB_NAME:-postgres} -# ADMIN_PASSWD: ${ADMIN_PASSWD:-admin} -# CSV_INTERNAL_SEP: ${CSV_INTERNAL_SEP:-,} -# DB_MAXCONN: ${DB_MAXCONN:-64} -# DB_TEMPLATE: ${DB_TEMPLATE:-template1} -# DBFILTER: ${DBFILTER:-.*} -# DEBUG_MODE: ${DEBUG_MODE:-False} -# EMAIL_FROM: ${EMAIL_FROM:-False} -# LIMIT_MEMORY_HARD: ${LIMIT_MEMORY_HARD:-2684354560} -# LIMIT_MEMORY_SOFT: ${LIMIT_MEMORY_SOFT:-2147483648} -# LIMIT_REQUEST: ${LIMIT_REQUEST:-8192} -# LIMIT_TIME_CPU: ${LIMIT_TIME_CPU:-60} -# LIMIT_TIME_REAL: ${LIMIT_TIME_REAL:-120} -# LIST_DB: ${LIST_DB:-True} -# LOG_DB: ${LOG_DB:-False} -# LOG_HANDLER: ${LOG_HANDLER:-[:INFO]} -# LOG_LEVEL: ${LOG_LEVEL:-info} -# LOGFILE: ${LOGFILE:-None} -# LONGPOLLING_PORT: ${LONGPOLLING_PORT:-8072} -# MAX_CRON_THREADS: ${MAX_CRON_THREADS:-2} -# OSV_MEMORY_AGE_LIMIT: ${OSV_MEMORY_AGE_LIMIT:-1.0} -# OSV_MEMORY_COUNT_LIMIT: ${OSV_MEMORY_COUNT_LIMIT:-False} -# SMTP_PASSWORD: ${SMTP_PASSWORD:-False} -# SMTP_PORT: ${SMTP_PORT:-25} -# SMTP_SERVER: ${SMTP_SERVER:-localhost} -# SMTP_SSL: ${SMTP_SSL:-False} -# SMTP_USER: ${SMTP_USER:-False} -# WORKERS: ${WORKERS:-0} -# XMLRPC: ${XMLRPC:-True} -# XMLRPC_INTERFACE: ${XMLRPC_INTERFACE:-} -# XMLRPC_PORT: ${XMLRPC_PORT:-8069} -# XMLRPCS: ${XMLRPCS:-True} -# XMLRPCS_INTERFACE: ${XMLRPCS_INTERFACE:-} -# XMLRPCS_PORT: ${XMLRPCS_PORT:-8071} + DB_NAME: ${DB_NAME:-postgres} + ADMIN_PASSWD: ${ADMIN_PASSWD:-admin} + CSV_INTERNAL_SEP: ${CSV_INTERNAL_SEP:-,} + DB_MAXCONN: ${DB_MAXCONN:-64} + DB_TEMPLATE: ${DB_TEMPLATE:-template1} + DBFILTER: ${DBFILTER:-.*} + DEBUG_MODE: ${DEBUG_MODE:-False} + EMAIL_FROM: ${EMAIL_FROM:-False} + LIMIT_MEMORY_HARD: ${LIMIT_MEMORY_HARD:-2684354560} + LIMIT_MEMORY_SOFT: ${LIMIT_MEMORY_SOFT:-2147483648} + LIMIT_REQUEST: ${LIMIT_REQUEST:-8192} + LIMIT_TIME_CPU: ${LIMIT_TIME_CPU:-60} + LIMIT_TIME_REAL: ${LIMIT_TIME_REAL:-120} + LIST_DB: ${LIST_DB:-True} + LOG_DB: ${LOG_DB:-False} + LOG_HANDLER: ${LOG_HANDLER:-[:INFO]} + LOG_LEVEL: ${LOG_LEVEL:-info} + LOGFILE: ${LOGFILE:-None} + LONGPOLLING_PORT: ${LONGPOLLING_PORT:-8072} + MAX_CRON_THREADS: ${MAX_CRON_THREADS:-2} + OSV_MEMORY_AGE_LIMIT: ${OSV_MEMORY_AGE_LIMIT:-1.0} + OSV_MEMORY_COUNT_LIMIT: ${OSV_MEMORY_COUNT_LIMIT:-False} + SMTP_PASSWORD: ${SMTP_PASSWORD:-False} + SMTP_PORT: ${SMTP_PORT:-25} + SMTP_SERVER: ${SMTP_SERVER:-localhost} + SMTP_SSL: ${SMTP_SSL:-False} + SMTP_USER: ${SMTP_USER:-False} + WORKERS: ${WORKERS:-0} + XMLRPC: ${XMLRPC:-True} + XMLRPC_INTERFACE: ${XMLRPC_INTERFACE:-} + XMLRPC_PORT: ${XMLRPC_PORT:-8069} + XMLRPCS: ${XMLRPCS:-True} + XMLRPCS_INTERFACE: ${XMLRPCS_INTERFACE:-} + XMLRPCS_PORT: ${XMLRPCS_PORT:-8071} ports: - "8069:8069" - "8071:8071" diff --git a/18.0/entrypoint.sh b/18.0/entrypoint.sh index 751c37f66..f37fdb380 100755 --- a/18.0/entrypoint.sh +++ b/18.0/entrypoint.sh @@ -29,7 +29,7 @@ export LOG_LEVEL=${LOG_LEVEL:-info} export LOGFILE=${LOGFILE:-None} export LONGPOLLING_PORT=${LONGPOLLING_PORT:-8072} export MAX_CRON_THREADS=${MAX_CRON_THREADS:-2} -export OSV_MEMORY_AGE_LIMIT=${OSV_MEMORY_AGE_LIMIT:-1.0} +export TRANSIENT_AGE_LIMIT=${TRANSIENT_AGE_LIMIT:-1.0} export OSV_MEMORY_COUNT_LIMIT=${OSV_MEMORY_COUNT_LIMIT:-False} export SMTP_PASSWORD=${SMTP_PASSWORD:-False} export SMTP_PORT=${SMTP_PORT:-25} diff --git a/18.0/odoo.conf b/18.0/odoo.conf index 5b2025e57..69fbcea34 100644 --- a/18.0/odoo.conf +++ b/18.0/odoo.conf @@ -6,37 +6,37 @@ db_port = $DB_PORT db_user = $DB_USER db_password = $DB_PASSWORD -; db_name = $DB_NAME -; admin_passwd = $ADMIN_PASSWD -; csv_internal_sep = $CSV_INTERNAL_SEP -; db_maxconn = $DB_MAXCONN -; db_template = $DB_TEMPLATE -; dbfilter = $DBFILTER -; debug_mode = $DEBUG_MODE -; email_from = $EMAIL_FROM -; limit_memory_hard = $LIMIT_MEMORY_HARD -; limit_memory_soft = $LIMIT_MEMORY_SOFT -; limit_request = $LIMIT_REQUEST -; limit_time_cpu = $LIMIT_TIME_CPU -; limit_time_real = $LIMIT_TIME_REAL -; list_db = $LIST_DB -; log_db = $LOG_DB -; log_handler = $LOG_HANDLER -; log_level = $LOG_LEVEL -; logfile = $LOGFILE -; longpolling_port = $LONGPOLLING_PORT -; max_cron_threads = $MAX_CRON_THREADS -; osv_memory_age_limit = $OSV_MEMORY_AGE_LIMIT -; osv_memory_count_limit = $OSV_MEMORY_COUNT_LIMIT -; smtp_password = $SMTP_PASSWORD -; smtp_port = $SMTP_PORT -; smtp_server = $SMTP_SERVER -; smtp_ssl = $SMTP_SSL -; smtp_user = $SMTP_USER -; workers = $WORKERS -; xmlrpc = $XMLRPC -; xmlrpc_interface = $XMLRPC_INTERFACE -; xmlrpc_port = $XMLRPC_PORT -; xmlrpcs = $XMLRPCS -; xmlrpcs_interface = $XMLRPCS_INTERFACE -; xmlrpcs_port = $XMLRPCS_PORT +;db_name = $DB_NAME +;admin_passwd = $ADMIN_PASSWD +;csv_internal_sep = $CSV_INTERNAL_SEP +;db_maxconn = $DB_MAXCONN +;db_template = $DB_TEMPLATE +;dbfilter = $DBFILTER +;debug_mode = $DEBUG_MODE +;email_from = $EMAIL_FROM +;limit_memory_hard = $LIMIT_MEMORY_HARD +;limit_memory_soft = $LIMIT_MEMORY_SOFT +;limit_request = $LIMIT_REQUEST +;limit_time_cpu = $LIMIT_TIME_CPU +;limit_time_real = $LIMIT_TIME_REAL +;list_db = $LIST_DB +;log_db = $LOG_DB +;log_handler = $LOG_HANDLER +;log_level = $LOG_LEVEL +;logfile = $LOGFILE +;longpolling_port = $LONGPOLLING_PORT +;max_cron_threads = $MAX_CRON_THREADS +;transient_age_limit = $TRANSIENT_AGE_LIMIT +;osv_memory_count_limit = $OSV_MEMORY_COUNT_LIMIT +;smtp_password = $SMTP_PASSWORD +;smtp_port = $SMTP_PORT +;smtp_server = $SMTP_SERVER +;smtp_ssl = $SMTP_SSL +;smtp_user = $SMTP_USER +;workers = $WORKERS +;xmlrpc = $XMLRPC +;xmlrpc_interface = $XMLRPC_INTERFACE +;xmlrpc_port = $XMLRPC_PORT +;xmlrpcs = $XMLRPCS +;xmlrpcs_interface = $XMLRPCS_INTERFACE +;xmlrpcs_port = $XMLRPCS_PORT From e16ff788710d056c0c21a27c4b996d6bf6a54d5c Mon Sep 17 00:00:00 2001 From: CodeByKyle Date: Tue, 11 Feb 2025 02:43:35 -0500 Subject: [PATCH 15/18] Add support for pg_isready --- 18.0/wait-for-psql.py | 51 +++++++++++++++++-------------------------- 1 file changed, 20 insertions(+), 31 deletions(-) diff --git a/18.0/wait-for-psql.py b/18.0/wait-for-psql.py index a4d1b0b5a..7d420602b 100755 --- a/18.0/wait-for-psql.py +++ b/18.0/wait-for-psql.py @@ -6,6 +6,7 @@ import time import configparser import logging +import subprocess logging.basicConfig( format="%(asctime)s - %(levelname)s - %(message)s", @@ -15,12 +16,22 @@ class DatabaseConnectionError(Exception): pass +def check_postgres_status(host="localhost", port=5432, user="postgres", timeout=30): + result = subprocess.run( + ["pg_isready", "-h", host, "-p", str(port), "-U", user, "-t", str(timeout)], + capture_output=True, + text=True + ) + + return result.stdout.strip(), result.returncode + if __name__ == '__main__': default_config_path = os.getenv('ODOO_RC', '/etc/odoo/odoo_docker.conf') + default_psql_wait_timeout = os.getenv('PSQL_WAIT_TIMEOUT', 30) arg_parser = argparse.ArgumentParser() arg_parser.add_argument('--config', type=str, default=default_config_path) - arg_parser.add_argument('--timeout', type=int, default=5) + arg_parser.add_argument('--timeout', type=int, default=default_psql_wait_timeout) args = arg_parser.parse_args() @@ -30,41 +41,19 @@ class DatabaseConnectionError(Exception): db_host = config.get('options', 'db_host', fallback='localhost') db_port = config.get('options', 'db_port', fallback=5432) db_user = config.get('options', 'db_user', fallback='odoo') - db_password = config.get('options', 'db_password', fallback='odoo') - db_name = config.get('options', 'db_name', fallback='postgres') - - start_time = time.time() - database_list = db_name.split(',') logging.info("Waiting for database(s) to be ready ...") logging.info(f"Host: {db_user}@{db_host}:{db_port}") - logging.info(f"Database(s): {database_list}") logging.info(f"Timeout: {args.timeout} seconds") - for database in database_list: - logging.info(f"Checking database {database} ...") - error = None - - while (time.time() - start_time) < args.timeout: - try: - conn = psycopg2.connect( - user=db_user, - host=db_host, - port=db_port, - password=db_password, - dbname=database - ) - - error = None - conn.close() - - logging.info(f"Database {database} is ready.") - break - except psycopg2.OperationalError as e: - error = e - time.sleep(1) + status, exit_code = check_postgres_status( + host=db_host, + port=db_port, + user=db_user, + timeout=args.timeout + ) - if error: - raise DatabaseConnectionError(f"Database {database} connection failure: {error}") + if exit_code != 0: + raise DatabaseConnectionError(f"Unable to connect to the database. Exit code: {exit_code} - Message: {status}") logging.info("🚀 Database(s) are ready.") \ No newline at end of file From 3ab0c654ca856a1c89af1593495c4104256c378f Mon Sep 17 00:00:00 2001 From: CodeByKyle Date: Tue, 11 Feb 2025 02:53:09 -0500 Subject: [PATCH 16/18] Document PSQL_WAIT_TIMEOUT in the docker config. Remove the hard-coded timeout in the entrypoint.sh file --- 18.0/docker-compose.yml | 1 + 18.0/entrypoint.sh | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/18.0/docker-compose.yml b/18.0/docker-compose.yml index b01f585b1..3c6e539dc 100644 --- a/18.0/docker-compose.yml +++ b/18.0/docker-compose.yml @@ -47,6 +47,7 @@ services: XMLRPCS: ${XMLRPCS:-True} XMLRPCS_INTERFACE: ${XMLRPCS_INTERFACE:-} XMLRPCS_PORT: ${XMLRPCS_PORT:-8071} + PSQL_WAIT_TIMEOUT: ${PSQL_WAIT_TIMEOUT:-30} ports: - "8069:8069" - "8071:8071" diff --git a/18.0/entrypoint.sh b/18.0/entrypoint.sh index f37fdb380..71cd900ca 100755 --- a/18.0/entrypoint.sh +++ b/18.0/entrypoint.sh @@ -43,6 +43,7 @@ export XMLRPC_PORT=${XMLRPC_PORT:-8069} export XMLRPCS=${XMLRPCS:-True} export XMLRPCS_INTERFACE=${XMLRPCS_INTERFACE:-} export XMLRPCS_PORT=${XMLRPCS_PORT:-8071} +export PSQL_WAIT_TIMEOUT=${PSQL_WAIT_TIMEOUT:-30} # Set the password file environment variable if [ -v PASSWORD_FILE ]; then @@ -59,12 +60,12 @@ case "$1" in if [[ "$1" == "scaffold" ]] ; then exec odoo "$@" else - wait-for-psql.py --timeout=30 + wait-for-psql.py exec odoo "$@" fi ;; -*) - wait-for-psql.py --timeout=30 + wait-for-psql.py exec odoo "$@" ;; *) From ffe732cfc214b27ba1681f3f23495a6f85632733 Mon Sep 17 00:00:00 2001 From: CodeByKyle Date: Tue, 11 Feb 2025 02:59:20 -0500 Subject: [PATCH 17/18] Remove unused imports --- 18.0/wait-for-psql.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/18.0/wait-for-psql.py b/18.0/wait-for-psql.py index 7d420602b..59aecce31 100755 --- a/18.0/wait-for-psql.py +++ b/18.0/wait-for-psql.py @@ -1,11 +1,8 @@ #!/usr/bin/env python3 import argparse -import os -import psycopg2 -import sys -import time import configparser import logging +import os import subprocess logging.basicConfig( @@ -13,9 +10,11 @@ level=logging.INFO ) + class DatabaseConnectionError(Exception): pass + def check_postgres_status(host="localhost", port=5432, user="postgres", timeout=30): result = subprocess.run( ["pg_isready", "-h", host, "-p", str(port), "-U", user, "-t", str(timeout)], @@ -25,6 +24,7 @@ def check_postgres_status(host="localhost", port=5432, user="postgres", timeout= return result.stdout.strip(), result.returncode + if __name__ == '__main__': default_config_path = os.getenv('ODOO_RC', '/etc/odoo/odoo_docker.conf') default_psql_wait_timeout = os.getenv('PSQL_WAIT_TIMEOUT', 30) @@ -56,4 +56,4 @@ def check_postgres_status(host="localhost", port=5432, user="postgres", timeout= if exit_code != 0: raise DatabaseConnectionError(f"Unable to connect to the database. Exit code: {exit_code} - Message: {status}") - logging.info("🚀 Database(s) are ready.") \ No newline at end of file + logging.info("🚀 Database(s) are ready.") From ff7c7234d25f015c224f98eed4f84b9ab89b9307 Mon Sep 17 00:00:00 2001 From: CodeByKyle Date: Wed, 12 Feb 2025 16:19:06 -0500 Subject: [PATCH 18/18] Fix a potential race condition with ps_isready --- 18.0/wait-for-psql.py | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/18.0/wait-for-psql.py b/18.0/wait-for-psql.py index 59aecce31..b4b1d01cf 100755 --- a/18.0/wait-for-psql.py +++ b/18.0/wait-for-psql.py @@ -4,6 +4,7 @@ import logging import os import subprocess +import time logging.basicConfig( format="%(asctime)s - %(levelname)s - %(message)s", @@ -46,12 +47,22 @@ def check_postgres_status(host="localhost", port=5432, user="postgres", timeout= logging.info(f"Host: {db_user}@{db_host}:{db_port}") logging.info(f"Timeout: {args.timeout} seconds") - status, exit_code = check_postgres_status( - host=db_host, - port=db_port, - user=db_user, - timeout=args.timeout - ) + start_time = time.time() + + status, exit_code = "", 0 + + while time.time() < start_time + args.timeout: + status, exit_code = check_postgres_status( + host=db_host, + port=db_port, + user=db_user, + timeout=args.timeout + ) + + if exit_code == 0: + break + + time.sleep(1) if exit_code != 0: raise DatabaseConnectionError(f"Unable to connect to the database. Exit code: {exit_code} - Message: {status}")