From db48e169f312bbc0ba48a8c27e2b026d376ea07d Mon Sep 17 00:00:00 2001 From: Janik von Rotz Date: Wed, 15 Jan 2025 10:59:48 +0100 Subject: [PATCH] feat: split entrypoint into scripts --- CHANGELOG.md | 3 +- image/Dockerfile | 25 ++- image/entrypoint.sh | 242 +--------------------------- image/scripts/auto-envsubst | 12 ++ image/scripts/entrypoint-log | 5 + image/scripts/git-clone-addons | 60 +++++++ image/scripts/init-db | 25 +++ image/scripts/odoo-update | 10 ++ image/{ => scripts}/parse-url | 0 image/scripts/python-install | 9 ++ image/scripts/set-odoo-config-env | 47 ++++++ image/scripts/setup-mail | 84 ++++++++++ oca/partner-contact | 2 +- scripts/odoo_revision_16.0.20241029 | 2 +- task | 128 +++++++++------ 15 files changed, 367 insertions(+), 287 deletions(-) create mode 100644 image/scripts/auto-envsubst create mode 100644 image/scripts/entrypoint-log create mode 100644 image/scripts/git-clone-addons create mode 100644 image/scripts/init-db create mode 100644 image/scripts/odoo-update rename image/{ => scripts}/parse-url (100%) create mode 100644 image/scripts/python-install create mode 100644 image/scripts/set-odoo-config-env create mode 100644 image/scripts/setup-mail diff --git a/CHANGELOG.md b/CHANGELOG.md index 24177918..aae1c455 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,11 +9,12 @@ All notable changes to this project will be documented in this file. The format * Build Docker image for `linux/amd64` and `linux/arm64`. * Store and restore `.env` to pass store with `pass-store-dotenv` and `pass-restore-dotenv`. * Init database with selected modules defined `ODOO_INIT_ADDONS`. -* Support mail server configuration from env vars. +* Enable mail server configuration from env vars. ### Updated * Ensure `templates/task` is using `uv. +* Split functions in `entrypoint.sh` into multiple scripts. ## 2025-01-10 diff --git a/image/Dockerfile b/image/Dockerfile index dab8d968..967935bb 100644 --- a/image/Dockerfile +++ b/image/Dockerfile @@ -98,11 +98,28 @@ RUN sed -i "s/FINAL, 0, '')/FINAL, 0, '.$ODOO_DATE')/" /opt/odoo/odoo/release.py # Set env vars ENV ODOO_VERSION=$ODOO_VERSION -# Copy entrypoint script and Odoo configuration file -COPY ./image/odoo.conf.template /etc/odoo/ -COPY ./image/entrypoint.sh / -COPY ./image/parse-url /usr/local/bin/ +# Copy entrypoint scripts and Odoo configuration file + +COPY ./image/scripts/parse-url /usr/local/bin/ RUN chmod +x /usr/local/bin/parse-url +COPY ./image/scripts/entrypoint-log /usr/local/bin/ +RUN chmod +x /usr/local/bin/entrypoint-log +COPY ./image/scripts/git-clone-addons /usr/local/bin/ +RUN chmod +x /usr/local/bin/git-clone-addons +COPY ./image/scripts/set-odoo-config-env /usr/local/bin/ +RUN chmod +x /usr/local/bin/set-odoo-config-env +COPY ./image/scripts/auto-envsubst /usr/local/bin/ +RUN chmod +x /usr/local/bin/auto-envsubst +COPY ./image/scripts/python-install /usr/local/bin/ +RUN chmod +x /usr/local/bin/python-install +COPY ./image/scripts/init-db /usr/local/bin/ +RUN chmod +x /usr/local/bin/init-db +COPY ./image/scripts/setup-mail /usr/local/bin/ +RUN chmod +x /usr/local/bin/setup-mail +COPY ./image/scripts/odoo-update /usr/local/bin/ +RUN chmod +x /usr/local/bin/odoo-update +COPY ./image/entrypoint.sh / +COPY ./image/odoo.conf.template /etc/odoo/ # Create odoo user ARG UID=102 diff --git a/image/entrypoint.sh b/image/entrypoint.sh index 516bb45c..9bec3452 100755 --- a/image/entrypoint.sh +++ b/image/entrypoint.sh @@ -15,153 +15,14 @@ if [ -v PASSWORD_FILE ]; then fi ME=$(basename "$0") - -entrypoint_log() { - if [ -z "${ODOO_ENTRYPOINT_QUIET_LOGS:-}" ]; then - echo "$@" - fi -} -git_clone_addons() { - if [ -n "$ADDONS_GIT_REPOS" ]; then - - # Setup git ssh key - mkdir -p ~/.ssh - if [ -n "$GIT_SSH_PRIVATE_KEY" ]; then - entrypoint_log "Setup SSH key from env vars." - echo "$GIT_SSH_PRIVATE_KEY" > ~/.ssh/id_ed25519 - chmod 600 ~/.ssh/id_ed25519 - eval "$(ssh-agent -s)" - ssh-add ~/.ssh/id_ed25519 - fi +git-clone-addons - # Clone git repo addons into /var/lib/odoo/git - entrypoint_log "Cloning git repos: $ADDONS_GIT_REPOS" - ADDONS_GIT_REPOS=$(echo "$ADDONS_GIT_REPOS" | tr "," "\n") - for ADDON_GIT_REPO in $ADDONS_GIT_REPOS; do - - # Supported urls: - # SSH: git@github.com:OCA/server-tools.git#16.0 - # HTTP: https://github.com/OCA/server-tools.git#16.0 +set-odoo-config-env - GIT_URL=$(echo "$ADDON_GIT_REPO" | cut -d# -f1) - GIT_BRANCH=$(echo "$ADDON_GIT_REPO" | cut -d# -f2) - GIT_HOSTNAME=$(parse-url "$GIT_URL" hostname) - GIT_PATH=$(parse-url "$GIT_URL" path | sed 's/.git//g') - GIT_PATH="/var/lib/odoo/git/$GIT_HOSTNAME/$GIT_PATH" +auto-envsubst - if [ ! -d "$GIT_PATH/.git" ]; then - # Clone git repo and submodules - mkdir -p "$GIT_PATH" - ssh-keyscan -t rsa,dsa "$GIT_HOSTNAME" > ~/.ssh/known_hosts 2>/dev/null - entrypoint_log "$ME: Clone $GIT_URL branch $GIT_BRANCH" - git clone "$GIT_URL" --depth 1 --single-branch --branch "$GIT_BRANCH" "$GIT_PATH" - else - entrypoint_log "$ME: Update $GIT_URL branch $GIT_BRANCH" - git -C "$GIT_PATH" switch "$GIT_BRANCH" - git -C "$GIT_PATH" pull - fi - - if [ -f "$GIT_PATH/.gitmodules" ]; then - echo "$ME: Init and update git submodules in $GIT_PATH" - git -C "$GIT_PATH" submodule update --init --recursive --depth 1 - fi - - # Add git repo to addons path - if [ -n "$ODOO_ADDONS_PATH" ]; then - ODOO_ADDONS_PATH="$ODOO_ADDONS_PATH,$GIT_PATH" - else - ODOO_ADDONS_PATH="$GIT_PATH" - fi - done - - # Remove git ssh key - if [ -n "$GIT_SSH_PRIVATE_KEY" ]; then - ssh-add -d ~/.ssh/id_ed25519 - rm ~/.ssh/id_ed25519 - fi - fi -} - -git_clone_addons - -set_odoo_config_env() { - if [ -n "$ODOO_ADDONS_PATH" ]; then - - entrypoint_log "$ME: Resolve addons path: $ODOO_ADDONS_PATH" - - # Search for module manifest files containing "version.+NN.0" and return list of module paths - ODOO_MODULE_PATH=$(echo "$ODOO_ADDONS_PATH" | tr "," "\n" | xargs -I {} find {} -type f -name "__manifest__.py" | xargs grep -l "version.*${ODOO_VERSION}" | xargs -r dirname | sort -u | tr "\n" ",") - - # Set parent folder of module paths as new addons path - ODOO_MODULE_PATH=$(echo "$ODOO_MODULE_PATH" | tr "," "\n" | xargs -I {} dirname {} | sort -u | tr "\n" "," | sed 's/,$//') - - # Enterprise modules always have version 1.0 - if [[ "$ODOO_ADDONS_PATH" =~ "/mnt/enterprise" ]]; then - ODOO_ADDONS_PATH="/mnt/enterprise,$ODOO_MODULE_PATH" - else - ODOO_ADDONS_PATH="$ODOO_MODULE_PATH" - fi - fi - - GIT_SSH_PRIVATE_KEY=$(echo -e "$GIT_SSH_PRIVATE_KEY" | base64 -w0) - export GIT_SSH_PRIVATE_KEY - export GIT_SSH_PUBLIC_KEY - - : "${ENVIRONMENT:=development}" - export ENVIRONMENT - : "${SERVER_WIDE_MODULES:=web}" - export SERVER_WIDE_MODULES - : "${PROXY_MODE:=False}" - export PROXY_MODE - : "${LOG_LEVEL:=info}" - export LOG_LEVEL - - : "${LIST_DB:=True}" - export LIST_DB - : "${ADMIN_PASSWD:=odoo}" - export ADMIN_PASSWD - : "${DBFILTER:=.*}" - export DBFILTER - - : "${WORKERS:=0}" - export WORKERS - : "${LIMIT_REQUEST:=8192}" - export LIMIT_REQUEST - : "${LIMIT_TIME_CPU:=60}" - export LIMIT_TIME_CPU - : "${LIMIT_TIME_REAL:=120}" - export LIMIT_TIME_REAL -} - -set_odoo_config_env - -auto_envsubst() { - local TEMPLATE_FILE="${ODOO_ENVSUBST_TEMPLATE_FILE:-/etc/odoo/odoo.conf.template}" - local OUTPUT_FILE="${ODOO_ENVSUBST_OUTPUT_FILE:-/etc/odoo/odoo.conf}" - local FILTER="${ODOO_ENVSUBST_FILTER:-}" - - DEFINED_ENVS=$(printf '${%s} ' $(awk "END { for (name in ENVIRON) { print ( name ~ /${FILTER}/ ) ? name : \"\" } }" < /dev/null )) - - if [[ -f "$TEMPLATE_FILE" ]]; then - entrypoint_log "$ME: Running envsubst on $TEMPLATE_FILE to $OUTPUT_FILE" - envsubst "$DEFINED_ENVS" < "$TEMPLATE_FILE" > "$OUTPUT_FILE" - fi -} - -auto_envsubst - -python_install() { - if [ -n "$PYTHON_INSTALL" ]; then - entrypoint_log "$ME: Install python packages: $PYTHON_INSTALL" - uv pip install --no-cache-dir $(echo "$PYTHON_INSTALL" | tr "," " ") - fi - - entrypoint_log "$ME: List python packages:" - uv pip list -} - -python_install +python-install # 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 @@ -185,100 +46,13 @@ check_config "db_port" "$PGPORT" check_config "db_user" "$PGUSER" check_config "db_password" "$PGPASSWORD" -init_db() { - if [ -n "$ODOO_DATABASE" ]; then - : "${ODOO_INIT:=False}" +init-db - entrypoint_log "$ME: Check if database $ODOO_DATABASE exists" - wait-for-psql.py ${DB_ARGS[@]} --timeout=30 - DATABASE_EXISTS=$(exec psql "postgres://$PGUSER:$PGPASSWORD@$PGHOST:$PGPORT/postgres" -tAc "SELECT COUNT(*) FROM pg_database WHERE datname = '$ODOO_DATABASE'") +setup-mail - # If it does not exist, create it - if [ "$DATABASE_EXISTS" = "0" ]; then - entrypoint_log "$ME: Create database $ODOO_DATABASE" - (exec psql "postgres://$PGUSER:$PGPASSWORD@$PGHOST:$PGPORT/postgres" -tAc "CREATE DATABASE $ODOO_DATABASE;") || true - fi +odoo-update - entrypoint_log "$ME: Check if database $ODOO_DATABASE is initialized" - DATABASE_INITIALIZED=$(exec psql "postgres://$PGUSER:$PGPASSWORD@$PGHOST:$PGPORT/$ODOO_DATABASE" -tAc "SELECT COUNT(*) FROM information_schema.tables WHERE table_name = 'ir_module_module'") - - if [ "$ODOO_INIT" = "True" ] && [ "$DATABASE_INITIALIZED" = "0" ]; then - : "${ODOO_INIT_LANG:=en_US}" - : "${ODOO_INIT_ADDONS:=web}" - entrypoint_log "$ME: Initialize database $ODOO_DATABASE with modules: $ODOO_INIT_ADDONS" - (exec odoo "${DB_ARGS[@]}" --database "$ODOO_DATABASE" --init "$ODOO_INIT_ADDONS" --config "$ODOO_RC" --stop-after-init --no-http --load-language "$ODOO_INIT_LANG" --without-demo=all) || true - fi - fi -} - -init_db - -setup_mail() { - - if [ -n "$ODOO_MAIL_SMTP_HOST" ]; then - ODOO_MAIL_SMTP_PORT=${ODOO_MAIL_SMTP_PORT:="587"} - ODOO_MAIL_SMTP_ENCRYPTION=${ODOO_MAIL_SMTP_ENCRYPTION:="starttls"} - ODOO_MAIL_SMTP_FROM_FILTER=${ODOO_MAIL_SMTP_FROM_FILTER:=""} - - IR_MAIL_SERVER_ID=$(psql "postgres://$PGUSER:$PGPASSWORD@$PGHOST:$PGPORT/$DATABASE" -tAc "SELECT id FROM ir_mail_server WHERE name = '$ODOO_MAIL_SMTP_HOST' LIMIT 1") - if [ -z "$IR_MAIL_SERVER_ID" ]; then - entrypoint_log "$ME: Setup outgoing mail server $ODOO_MAIL_SMTP_HOST for database $DATABASE." - psql "postgres://$PGUSER:$PGPASSWORD@$PGHOST:$PGPORT/$DATABASE" -c "INSERT INTO ir_mail_server (name, smtp_host, smtp_port, smtp_user, smtp_pass, smtp_encryption, from_filter) VALUES ('$ODOO_MAIL_SMTP_HOST', '$ODOO_MAIL_SMTP_HOST', $ODOO_MAIL_SMTP_PORT, '$ODOO_MAIL_USERNAME', '$ODOO_MAIL_PASSWORD', '$ODOO_MAIL_SMTP_ENCRYPTION', '$ODOO_MAIL_SMTP_FROM_FILTER')" - fi - fi - - if [ -n "$ODOO_MAIL_IMAP_HOST" ]; then - ODOO_MAIL_IMAP_PORT=${ODOO_MAIL_IMAP_PORT:="993"} - ODOO_MAIL_IMAP_SSL=${ODOO_MAIL_IMAP_SSL:="True"} - - FETCHMAIL_SERVER_ID=$(psql "postgres://$PGUSER:$PGPASSWORD@$PGHOST:$PGPORT/$DATABASE" -tAc "SELECT id FROM fetchmail_server WHERE name = '$ODOO_MAIL_SMTP_HOST' LIMIT 1") - if [ -z "$FETCHMAIL_SERVER_ID" ]; then - entrypoint_log "$ME: Setup incoming mail server $ODOO_MAIL_IMAP_HOST for database $DATABASE." - psql "postgres://$PGUSER:$PGPASSWORD@$PGHOST:$PGPORT/$DATABASE" -c "INSERT INTO fetchmail_server (name, server, port, user, password, is_ssl) VALUES ('$ODOO_MAIL_SMTP_HOST', '$ODOO_MAIL_IMAP_HOST', $ODOO_MAIL_IMAP_PORT, '$ODOO_MAIL_USERNAME', '$ODOO_MAIL_PASSWORD', $ODOO_MAIL_IMAP_SSL)" - fi - fi - - if [ -n "$MAIL_CATCHALL_ALIAS" ]; then - MAIL_CATCHALL_ALIAS_VALUE=$(psql "postgres://$PGUSER:$PGPASSWORD@$PGHOST:$PGPORT/$DATABASE" -tAc "SELECT value FROM ir_config_parameter WHERE key = 'mail.catchall.alias'") - if [ "$MAIL_CATCHALL_ALIAS_VALUE" != "$MAIL_CATCHALL_ALIAS" ]; then - entrypoint_log "$ME: Update system parameter mail.catchall.alias with value $MAIL_CATCHALL_ALIAS." - psql "postgres://$PGUSER:$PGPASSWORD@$PGHOST:$PGPORT/$DATABASE" -c "UPDATE ir_config_parameter SET value = '$MAIL_CATCHALL_ALIAS' WHERE key = 'mail.catchall.alias'" - fi - fi - - if [ -n "$MAIL_DEFAULT_FROM" ]; then - MAIL_DEFAULT_FROM_VALUE=$(psql "postgres://$PGUSER:$PGPASSWORD@$PGHOST:$PGPORT/$DATABASE" -tAc "SELECT value FROM ir_config_parameter WHERE key = 'mail.default.from'") - if [ "$MAIL_DEFAULT_FROM_VALUE" != "$MAIL_DEFAULT_FROM" ]; then - entrypoint_log "$ME: Update system parameter mail.default.from with value $MAIL_DEFAULT_FROM." - psql "postgres://$PGUSER:$PGPASSWORD@$PGHOST:$PGPORT/$DATABASE" -c "UPDATE ir_config_parameter SET value = '$MAIL_DEFAULT_FROM' WHERE key = 'mail.default.from'" - fi - fi - - if [ -n "$MAIL_CATCHALL_DOMAIN" ]; then - MAIL_CATCHALL_DOMAIN_VALUE=$(psql "postgres://$PGUSER:$PGPASSWORD@$PGHOST:$PGPORT/$DATABASE" -tAc "SELECT value FROM ir_config_parameter WHERE key = 'mail.catchall.domain'") - if [ "$MAIL_CATCHALL_DOMAIN_VALUE" != "$MAIL_CATCHALL_DOMAIN" ]; then - entrypoint_log "$ME: Update system parameter mail.catchall.domain with value $MAIL_CATCHALL_DOMAIN." - psql "postgres://$PGUSER:$PGPASSWORD@$PGHOST:$PGPORT/$DATABASE" -c "UPDATE ir_config_parameter SET value = '$MAIL_CATCHALL_DOMAIN' WHERE key = 'mail.catchall.domain'" - fi - fi -} - -setup_mail - -click_odoo_update() { - if [ -n "$ODOO_DATABASE" ]; then - : "${CLICK_ODOO_UPDATE:=False}" - - if [ "$CLICK_ODOO_UPDATE" = "True" ] && [ -n "$ODOO_ADDONS_PATH" ]; then - entrypoint_log "$ME: Run click-odoo-update" - (exec click-odoo-update --addons-path="${ODOO_ADDONS_PATH},${ADDONS_PATH}" -d "$ODOO_DATABASE" ) || true - fi - fi -} - -click_odoo_update - -entrypoint_log "$ME: Running Odoo $ODOO_VERSION as user: $USER" +entrypoint-log "$ME: Running Odoo $ODOO_VERSION as user: $USER" case "$1" in -- | odoo) diff --git a/image/scripts/auto-envsubst b/image/scripts/auto-envsubst new file mode 100644 index 00000000..e81cf1e9 --- /dev/null +++ b/image/scripts/auto-envsubst @@ -0,0 +1,12 @@ +#!/bin/bash + +local TEMPLATE_FILE="${ODOO_ENVSUBST_TEMPLATE_FILE:-/etc/odoo/odoo.conf.template}" +local OUTPUT_FILE="${ODOO_ENVSUBST_OUTPUT_FILE:-/etc/odoo/odoo.conf}" +local FILTER="${ODOO_ENVSUBST_FILTER:-}" + +DEFINED_ENVS=$(printf '${%s} ' $(awk "END { for (name in ENVIRON) { print ( name ~ /${FILTER}/ ) ? name : \"\" } }" < /dev/null )) + +if [[ -f "$TEMPLATE_FILE" ]]; then + entrypoint-log "$ME: Running envsubst on $TEMPLATE_FILE to $OUTPUT_FILE" + envsubst "$DEFINED_ENVS" < "$TEMPLATE_FILE" > "$OUTPUT_FILE" +fi \ No newline at end of file diff --git a/image/scripts/entrypoint-log b/image/scripts/entrypoint-log new file mode 100644 index 00000000..02c0926d --- /dev/null +++ b/image/scripts/entrypoint-log @@ -0,0 +1,5 @@ +#!/bin/bash + +if [ -z "${ODOO_ENTRYPOINT_QUIET_LOGS:-}" ]; then + echo "$@" +fi diff --git a/image/scripts/git-clone-addons b/image/scripts/git-clone-addons new file mode 100644 index 00000000..303ef568 --- /dev/null +++ b/image/scripts/git-clone-addons @@ -0,0 +1,60 @@ +#!/bin/bash + +if [ -n "$ADDONS_GIT_REPOS" ]; then + + # Setup git ssh key + mkdir -p ~/.ssh + if [ -n "$GIT_SSH_PRIVATE_KEY" ]; then + entrypoint-log "Setup SSH key from env vars." + echo "$GIT_SSH_PRIVATE_KEY" > ~/.ssh/id_ed25519 + chmod 600 ~/.ssh/id_ed25519 + eval "$(ssh-agent -s)" + ssh-add ~/.ssh/id_ed25519 + fi + + # Clone git repo addons into /var/lib/odoo/git + entrypoint-log "Cloning git repos: $ADDONS_GIT_REPOS" + ADDONS_GIT_REPOS=$(echo "$ADDONS_GIT_REPOS" | tr "," "\n") + for ADDON_GIT_REPO in $ADDONS_GIT_REPOS; do + + # Supported urls: + # SSH: git@github.com:OCA/server-tools.git#16.0 + # HTTP: https://github.com/OCA/server-tools.git#16.0 + + GIT_URL=$(echo "$ADDON_GIT_REPO" | cut -d# -f1) + GIT_BRANCH=$(echo "$ADDON_GIT_REPO" | cut -d# -f2) + GIT_HOSTNAME=$(parse-url "$GIT_URL" hostname) + GIT_PATH=$(parse-url "$GIT_URL" path | sed 's/.git//g') + GIT_PATH="/var/lib/odoo/git/$GIT_HOSTNAME/$GIT_PATH" + + if [ ! -d "$GIT_PATH/.git" ]; then + # Clone git repo and submodules + mkdir -p "$GIT_PATH" + ssh-keyscan -t rsa,dsa "$GIT_HOSTNAME" > ~/.ssh/known_hosts 2>/dev/null + entrypoint-log "$ME: Clone $GIT_URL branch $GIT_BRANCH" + git clone "$GIT_URL" --depth 1 --single-branch --branch "$GIT_BRANCH" "$GIT_PATH" + else + entrypoint-log "$ME: Update $GIT_URL branch $GIT_BRANCH" + git -C "$GIT_PATH" switch "$GIT_BRANCH" + git -C "$GIT_PATH" pull + fi + + if [ -f "$GIT_PATH/.gitmodules" ]; then + echo "$ME: Init and update git submodules in $GIT_PATH" + git -C "$GIT_PATH" submodule update --init --recursive --depth 1 + fi + + # Add git repo to addons path + if [ -n "$ODOO_ADDONS_PATH" ]; then + ODOO_ADDONS_PATH="$ODOO_ADDONS_PATH,$GIT_PATH" + else + ODOO_ADDONS_PATH="$GIT_PATH" + fi + done + + # Remove git ssh key + if [ -n "$GIT_SSH_PRIVATE_KEY" ]; then + ssh-add -d ~/.ssh/id_ed25519 + rm ~/.ssh/id_ed25519 + fi +fi \ No newline at end of file diff --git a/image/scripts/init-db b/image/scripts/init-db new file mode 100644 index 00000000..96876150 --- /dev/null +++ b/image/scripts/init-db @@ -0,0 +1,25 @@ +#!/bin/bash + +if [ -n "$ODOO_DATABASE" ]; then + : "${ODOO_INIT:=False}" + + entrypoint-log "$ME: Check if database $ODOO_DATABASE exists" + wait-for-psql.py ${DB_ARGS[@]} --timeout=30 + DATABASE_EXISTS=$(exec psql "postgres://$PGUSER:$PGPASSWORD@$PGHOST:$PGPORT/postgres" -tAc "SELECT COUNT(*) FROM pg_database WHERE datname = '$ODOO_DATABASE'") + + # If it does not exist, create it + if [ "$DATABASE_EXISTS" = "0" ]; then + entrypoint-log "$ME: Create database $ODOO_DATABASE" + (exec psql "postgres://$PGUSER:$PGPASSWORD@$PGHOST:$PGPORT/postgres" -tAc "CREATE DATABASE $ODOO_DATABASE;") || true + fi + + entrypoint-log "$ME: Check if database $ODOO_DATABASE is initialized" + DATABASE_INITIALIZED=$(exec psql "postgres://$PGUSER:$PGPASSWORD@$PGHOST:$PGPORT/$ODOO_DATABASE" -tAc "SELECT COUNT(*) FROM information_schema.tables WHERE table_name = 'ir_module_module'") + + if [ "$ODOO_INIT" = "True" ] && [ "$DATABASE_INITIALIZED" = "0" ]; then + : "${ODOO_INIT_LANG:=en_US}" + : "${ODOO_INIT_ADDONS:=web}" + entrypoint-log "$ME: Initialize database $ODOO_DATABASE with modules: $ODOO_INIT_ADDONS" + (exec odoo "${DB_ARGS[@]}" --database "$ODOO_DATABASE" --init "$ODOO_INIT_ADDONS" --config "$ODOO_RC" --stop-after-init --no-http --load-language "$ODOO_INIT_LANG" --without-demo=all) || true + fi +fi \ No newline at end of file diff --git a/image/scripts/odoo-update b/image/scripts/odoo-update new file mode 100644 index 00000000..bbc0b201 --- /dev/null +++ b/image/scripts/odoo-update @@ -0,0 +1,10 @@ +#!/bin/bash + +if [ -n "$ODOO_DATABASE" ]; then + : "${CLICK_ODOO_UPDATE:=False}" + + if [ "$CLICK_ODOO_UPDATE" = "True" ] && [ -n "$ODOO_ADDONS_PATH" ]; then + entrypoint-log "$ME: Run click-odoo-update" + (exec click-odoo-update --addons-path="${ODOO_ADDONS_PATH},${ADDONS_PATH}" -d "$ODOO_DATABASE" ) || true + fi +fi \ No newline at end of file diff --git a/image/parse-url b/image/scripts/parse-url similarity index 100% rename from image/parse-url rename to image/scripts/parse-url diff --git a/image/scripts/python-install b/image/scripts/python-install new file mode 100644 index 00000000..abf134ba --- /dev/null +++ b/image/scripts/python-install @@ -0,0 +1,9 @@ +#!/bin/bash + +if [ -n "$PYTHON_INSTALL" ]; then + entrypoint-log "$ME: Install python packages: $PYTHON_INSTALL" + uv pip install --no-cache-dir $(echo "$PYTHON_INSTALL" | tr "," " ") +fi + +entrypoint-log "$ME: List python packages:" +uv pip list \ No newline at end of file diff --git a/image/scripts/set-odoo-config-env b/image/scripts/set-odoo-config-env new file mode 100644 index 00000000..54605cec --- /dev/null +++ b/image/scripts/set-odoo-config-env @@ -0,0 +1,47 @@ + +if [ -n "$ODOO_ADDONS_PATH" ]; then + + entrypoint-log "$ME: Resolve addons path: $ODOO_ADDONS_PATH" + + # Search for module manifest files containing "version.+NN.0" and return list of module paths + ODOO_MODULE_PATH=$(echo "$ODOO_ADDONS_PATH" | tr "," "\n" | xargs -I {} find {} -type f -name "__manifest__.py" | xargs grep -l "version.*${ODOO_VERSION}" | xargs -r dirname | sort -u | tr "\n" ",") + + # Set parent folder of module paths as new addons path + ODOO_MODULE_PATH=$(echo "$ODOO_MODULE_PATH" | tr "," "\n" | xargs -I {} dirname {} | sort -u | tr "\n" "," | sed 's/,$//') + + # Enterprise modules always have version 1.0 + if [[ "$ODOO_ADDONS_PATH" =~ "/mnt/enterprise" ]]; then + ODOO_ADDONS_PATH="/mnt/enterprise,$ODOO_MODULE_PATH" + else + ODOO_ADDONS_PATH="$ODOO_MODULE_PATH" + fi +fi + +GIT_SSH_PRIVATE_KEY=$(echo -e "$GIT_SSH_PRIVATE_KEY" | base64 -w0) +export GIT_SSH_PRIVATE_KEY +export GIT_SSH_PUBLIC_KEY + +: "${ENVIRONMENT:=development}" +export ENVIRONMENT +: "${SERVER_WIDE_MODULES:=web}" +export SERVER_WIDE_MODULES +: "${PROXY_MODE:=False}" +export PROXY_MODE +: "${LOG_LEVEL:=info}" +export LOG_LEVEL + +: "${LIST_DB:=True}" +export LIST_DB +: "${ADMIN_PASSWD:=odoo}" +export ADMIN_PASSWD +: "${DBFILTER:=.*}" +export DBFILTER + +: "${WORKERS:=0}" +export WORKERS +: "${LIMIT_REQUEST:=8192}" +export LIMIT_REQUEST +: "${LIMIT_TIME_CPU:=60}" +export LIMIT_TIME_CPU +: "${LIMIT_TIME_REAL:=120}" +export LIMIT_TIME_REAL \ No newline at end of file diff --git a/image/scripts/setup-mail b/image/scripts/setup-mail new file mode 100644 index 00000000..13110294 --- /dev/null +++ b/image/scripts/setup-mail @@ -0,0 +1,84 @@ +#!/bin/bash + +PYTHON_SCRIPT=$(cat <