feat: split entrypoint into scripts

This commit is contained in:
Janik von Rotz committed 2025-01-15 10:59:55 +01:00
1 parent a875ff8184
commit db48e169f3
15 files changed
+367 -287

No files matched your search

+2 -1
View File
@@ -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
+21 -4
View File
@@ -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
+8 -234
View File
@@ -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)
+12
View File
@@ -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
+5
View File
@@ -0,0 +1,5 @@
#!/bin/bash
if [ -z "${ODOO_ENTRYPOINT_QUIET_LOGS:-}" ]; then
echo "$@"
fi
+60
View File
@@ -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
+25
View File
@@ -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
+10
View File
@@ -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
File renamed without changes.
+9
View File
@@ -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
+47
View File
@@ -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
+84
View File
@@ -0,0 +1,84 @@
#!/bin/bash
PYTHON_SCRIPT=$(cat <<EOF
# Set python vars from env vars
smtp_host = '$ODOO_MAIL_SMTP_HOST'
smtp_port = ${ODOO_MAIL_SMTP_PORT:="587"}
smtp_encryption = '${ODOO_MAIL_SMTP_ENCRYPTION:="starttls"}'
smtp_from_filter = '${ODOO_MAIL_SMTP_FROM_FILTER:=""}'
imap_host = '$ODOO_MAIL_IMAP_HOST'
imap_port = ${ODOO_MAIL_IMAP_PORT:="993"}
imap_ssl = ${ODOO_MAIL_IMAP_SSL:="True"}
mail_user = '$ODOO_MAIL_USER'
mail_password = '$ODOO_MAIL_PASSWORD'
mail_catchall_alias = '$ODOO_MAIL_CATCHALL_ALIAS'
mail_catchall_domain = '$ODOO_MAIL_CATCHALL_DOMAIN'
mail_default_from = '$ODOO_MAIL_DEFAULT_FROM'
# Setup outgoing mail server
if smtp_host:
ir_mail_server = {
'name': smtp_host,
'smtp_host': smtp_host,
'smtp_port': smtp_port,
'smtp_user': mail_user,
'smtp_pass': mail_password,
'smtp_encryption': smtp_encryption,
'from_filter': smtp_from_filter
}
ir_mail_server_id = env['ir.mail_server'].search([('name', '=', smtp_host)], limit=1)
if ir_mail_server_id:
ir_mail_server_id.write(ir_mail_server)
else:
env['ir.mail_server'].create(ir_mail_server)
env.cr.commit()
# Setup incoming mail server
if imap_host:
fetchmail_server = {
'name': imap_host,
'server': imap_host,
'port': imap_port,
'user': mail_user,
'password': mail_password,
'is_ssl': imap_ssl,
'state': 'done'
}
fetchmail_server_id = env['fetchmail.server'].search([('name', '=', imap_host)], limit=1)
if fetchmail_server_id:
fetchmail_server_id.write(fetchmail_server)
else:
env['fetchmail.server'].create(fetchmail_server)
env.cr.commit()
# Setup system parameters
if mail_catchall_alias:
mail_catchall_alias_id = env['ir.config_parameter'].search([('key', '=', 'mail.catchall.alias')], limit=1)
if not mail_catchall_alias_id:
env['ir.config_parameter'].create({'key': 'mail.catchall.alias', 'value': mail_catchall_alias})
if mail_catchall_alias_id.value != mail_catchall_alias:
env['ir.config_parameter'].search([('key', '=', 'mail.catchall.alias')], limit=1).write({'value': mail_catchall_alias})
env.cr.commit()
if mail_catchall_domain:
mail_catchall_domain_id = env['ir.config_parameter'].search([('key', '=', 'mail.catchall.domain')], limit=1)
if not mail_catchall_domain_id:
env['ir.config_parameter'].create({'key': 'mail.catchall.domain', 'value': mail_catchall_domain})
if mail_catchall_domain_id.value != mail_catchall_domain:
env['ir.config_parameter'].search([('key', '=', 'mail.catchall.domain')], limit=1).write({'value': mail_catchall_domain})
env.cr.commit()
if mail_default_from:
mail_default_from_id = env['ir.config_parameter'].search([('key', '=', 'mail.default.from')], limit=1)
if not mail_default_from_id:
env['ir.config_parameter'].create({'key': 'mail.default.from', 'value': mail_default_from})
if mail_default_from_id.value != mail_default_from:
env['ir.config_parameter'].search([('key', '=', 'mail.default.from')], limit=1).write({'value': mail_default_from})
env.cr.commit()
EOF)
entrypoint-log "$ME: Setup mail server configuation for database $DATABASE."
exec (echo "$PYTHON_SCRIPT" |
odoo shell "${DB_ARGS[@]}" --database "$ODOO_DATABASE" --config "$ODOO_RC" --stop-after-init --no-http) || true
+1 -1
View File
@@ -2,4 +2,4 @@ ODOO_REVISION=16.0.20241029
ODOO_REF=fada7499ba88216b54c0f56b14634730b042cd60
ODOO_ENTERPRISE_REF=236eae24baf2608c4839dea97b1bc3e6ca405ba2
ODOO_THEME_REF=f5aa311c568e9e903aba0b640c612644f488c260
ODOO_DOCKER_REF=odoo@sha256:69de6d996f925fd38c859b6bfcb989f56617e02807d72946a1054d790ccde717"
ODOO_DOCKER_REF=odoo@sha256:69de6d996f925fd38c859b6bfcb989f56617e02807d72946a1054d790ccde717
+82 -46
View File
@@ -1051,57 +1051,93 @@ function setup-mail() {
activate-venv
set-addons-path
IR_MAIL_SERVER="{'name':'Mailpit','smtp_host':'localhost','smtp_port':1025}"
FETCHMAIL_SERVER=""
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="{'name':'$ODOO_MAIL_SMTP_HOST','smtp_host':'$ODOO_MAIL_SMTP_HOST','smtp_port':$ODOO_MAIL_SMTP_PORT,'smtp_user':'$ODOO_MAIL_USERNAME','smtp_pass':'$ODOO_MAIL_PASSWORD','smtp_encryption':'$ODOO_MAIL_SMTP_ENCRYPTION','from_filter':'$ODOO_MAIL_SMTP_FROM_FILTER'}"
fi
if [ -n "$IR_MAIL_SERVER" ]; then
echo "Setup outgoing mail server $ODOO_MAIL_SMTP_HOST for database $DATABASE."
IR_MAIL_SERVER_ID=$(echo "print(env['ir.mail_server'].search([('name', '=', '$ODOO_MAIL_SMTP_HOST')], limit=1).id)" | odoo shell --database "$DATABASE" --config "$ODOO_RC" --addons-path="$ADDONS_PATH" --no-http)
if [ "$IR_MAIL_SERVER_ID" = "False" ]; then
echo "env['ir.mail_server'].create($IR_MAIL_SERVER);env.cr.commit()" |
odoo shell --database "$DATABASE" --config "$ODOO_RC" --addons-path="$ADDONS_PATH" --no-http
fi
fi
PYTHON_SCRIPT=$(cat <<EOF
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="{'name':'$ODOO_MAIL_IMAP_HOST','server':'$ODOO_MAIL_IMAP_HOST','port':$ODOO_MAIL_IMAP_PORT,'user':'$ODOO_MAIL_USERNAME','password':'$ODOO_MAIL_PASSWORD','is_ssl':$ODOO_MAIL_IMAP_SSL}"
fi
# Set python vars from env vars
smtp_host = '$ODOO_MAIL_SMTP_HOST'
smtp_port = ${ODOO_MAIL_SMTP_PORT:="587"}
smtp_encryption = '${ODOO_MAIL_SMTP_ENCRYPTION:="starttls"}'
smtp_from_filter = '${ODOO_MAIL_SMTP_FROM_FILTER:=""}'
imap_host = '$ODOO_MAIL_IMAP_HOST'
imap_port = ${ODOO_MAIL_IMAP_PORT:="993"}
imap_ssl = ${ODOO_MAIL_IMAP_SSL:="True"}
mail_user = '$ODOO_MAIL_USER'
mail_password = '$ODOO_MAIL_PASSWORD'
mail_catchall_alias = '$ODOO_MAIL_CATCHALL_ALIAS'
mail_catchall_domain = '$ODOO_MAIL_CATCHALL_DOMAIN'
mail_default_from = '$ODOO_MAIL_DEFAULT_FROM'
if [ -n "$FETCHMAIL_SERVER" ]; then
FETCHMAIL_SERVER_ID=$(echo "print(env['fetchmail.server'].search([('name', '=', '$ODOO_MAIL_SMTP_HOST')], limit=1).id)" | odoo shell --database "$DATABASE" --config "$ODOO_RC" --addons-path="$ADDONS_PATH" --no-http)
if [ "$FETCHMAIL_SERVER_ID" = "False" ]; then
echo "Setup incoming mail server $ODOO_MAIL_IMAP_HOST for database $DATABASE."
echo "rec=env['fetchmail.server'].create($FETCHMAIL_SERVER);rec.button_confirm_login();env.cr.commit()" |
odoo shell --database "$DATABASE" --config "$ODOO_RC" --addons-path="$ADDONS_PATH" --no-http
fi
fi
# Default SMTP host is Mailpit
if not smtp_host:
smtp_host = localhost
smtp_port = 1025
smtp_encryption = 'none'
if [ -n "$MAIL_CATCHALL_ALIAS" ]; then
echo "Update system parameter mail.catchall.alias with value $MAIL_CATCHALL_ALIAS."
echo "env['ir.config_parameter'].search([('key', '=', 'mail.catchall.alias')], limit=1).write({'value': '$MAIL_CATCHALL_ALIAS'});env.cr.commit()" |
odoo shell --database "$DATABASE" --config "$ODOO_RC" --addons-path="$ADDONS_PATH" --no-http
fi
# Setup outgoing mail server
if smtp_host:
ir_mail_server = {
'name': smtp_host,
'smtp_host': smtp_host,
'smtp_port': smtp_port,
'smtp_user': mail_user,
'smtp_pass': mail_password,
'smtp_encryption': smtp_encryption,
'from_filter': smtp_from_filter
}
ir_mail_server_id = env['ir.mail_server'].search([('name', '=', smtp_host)], limit=1)
if ir_mail_server_id:
ir_mail_server_id.write(ir_mail_server)
else:
env['ir.mail_server'].create(ir_mail_server)
env.cr.commit()
if [ -n "$MAIL_DEFAULT_FROM" ]; then
echo "Update system parameter mail.default.from with value $MAIL_DEFAULT_FROM."
echo "env['ir.config_parameter'].search([('key', '=', 'mail.default.from')], limit=1).write({'value': '$MAIL_DEFAULT_FROM'});env.cr.commit()" |
odoo shell --database "$DATABASE" --config "$ODOO_RC" --addons-path="$ADDONS_PATH" --no-http
fi
# Setup incoming mail server
if imap_host:
fetchmail_server = {
'name': imap_host,
'server': imap_host,
'port': imap_port,
'user': mail_user,
'password': mail_password,
'is_ssl': imap_ssl,
'state': 'done'
}
fetchmail_server_id = env['fetchmail.server'].search([('name', '=', imap_host)], limit=1)
if fetchmail_server_id:
fetchmail_server_id.write(fetchmail_server)
else:
env['fetchmail.server'].create(fetchmail_server)
env.cr.commit()
if [ -n "$MAIL_CATCHALL_DOMAIN" ]; then
echo "Update system parameter mail.catchall.domain with value $MAIL_CATCHALL_DOMAIN."
echo "env['ir.config_parameter'].search([('key', '=', 'mail.catchall.domain')], limit=1).write({'value': '$MAIL_CATCHALL_DOMAIN'});env.cr.commit()" |
odoo shell --database "$DATABASE" --config "$ODOO_RC" --addons-path="$ADDONS_PATH" --no-http
fi
# Setup system parameters
if mail_catchall_alias:
mail_catchall_alias_id = env['ir.config_parameter'].search([('key', '=', 'mail.catchall.alias')], limit=1)
if not mail_catchall_alias_id:
env['ir.config_parameter'].create({'key': 'mail.catchall.alias', 'value': mail_catchall_alias})
if mail_catchall_alias_id.value != mail_catchall_alias:
env['ir.config_parameter'].search([('key', '=', 'mail.catchall.alias')], limit=1).write({'value': mail_catchall_alias})
env.cr.commit()
if mail_catchall_domain:
mail_catchall_domain_id = env['ir.config_parameter'].search([('key', '=', 'mail.catchall.domain')], limit=1)
if not mail_catchall_domain_id:
env['ir.config_parameter'].create({'key': 'mail.catchall.domain', 'value': mail_catchall_domain})
if mail_catchall_domain_id.value != mail_catchall_domain:
env['ir.config_parameter'].search([('key', '=', 'mail.catchall.domain')], limit=1).write({'value': mail_catchall_domain})
env.cr.commit()
if mail_default_from:
mail_default_from_id = env['ir.config_parameter'].search([('key', '=', 'mail.default.from')], limit=1)
if not mail_default_from_id:
env['ir.config_parameter'].create({'key': 'mail.default.from', 'value': mail_default_from})
if mail_default_from_id.value != mail_default_from:
env['ir.config_parameter'].search([('key', '=', 'mail.default.from')], limit=1).write({'value': mail_default_from})
env.cr.commit()
EOF)
echo "Setup mail server configuation for database $DATABASE."
echo "$PYTHON_SCRIPT" | odoo shell --database "$DATABASE" --config "$ODOO_RC" --addons-path="$ADDONS_PATH" --no-http
}
function setup-mail-sql() {