feat: split entrypoint into scripts
This commit is contained in:
15 files changed
+367
-287
No files matched your search
+2
-1
@@ -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
@@ -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
@@ -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)
|
||||
|
||||
@@ -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
|
||||
@@ -0,0 +1,5 @@
|
||||
#!/bin/bash
|
||||
|
||||
if [ -z "${ODOO_ENTRYPOINT_QUIET_LOGS:-}" ]; then
|
||||
echo "$@"
|
||||
fi
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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.
@@ -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
|
||||
@@ -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
|
||||
@@ -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
Submodule oca/partner-contact updated: 8945bfb872...6f72f6c744.
@@ -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
|
||||
@@ -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() {
|
||||
|
||||
Reference in new issue
Block a user