Compare commits

..
2 Commits
Author SHA1 Message Date
oliver e03bb926e8 g 2026-10-13 08:58:02 -03:00
oliver ef641e9fe2 hmm 2026-10-13 07:28:31 -03:00
10 changed files with 151 additions and 52 deletions

No files matched your search

+59 -7
View File
@@ -2,16 +2,15 @@
dump_config (){ dump_config (){
echo "========== Odoo Container Configuration ==========" echo "$(date '+%Y-%m-%d %H:%M:%S') ========== Odoo Container Configuration =========="
echo "UUID: $UUID" echo "UUID: $UUID"
echo "BRANCH: $BRANCH" echo "BRANCH: $BRANCH"
echo "STAGING: $STAGING" echo "STAGING: $STAGING"
echo echo
echo "PostgreSQL Host: $POSTGRES_HOST" echo "PostgreSQL Host: $POSTGRES_HOST"
echo "PostgreSQL Port: $POSTGRES_PORT" echo "PostgreSQL Port: $POSTGRES_PORT"
echo "PostgreSQL Admin: $POSTGRES_ADMIN_USER / $POSTGRES_ADMIN_PASSWORD" echo "PostgreSQL Admin: $POSTGRES_ADMIN_USER"
echo "ODOO DB User: $ODOO_DB_USER" echo "ODOO DB User: $ODOO_DB_USER"
echo "ODOO DB Password: $ODOO_DB_PASSWORD"
echo echo
echo "BASEURL: $BASEURL" echo "BASEURL: $BASEURL"
echo "DATA_DIR: $DATA_DIR" echo "DATA_DIR: $DATA_DIR"
@@ -38,26 +37,79 @@ echo "=================================================="
# Function: Create PostgreSQL user # Function: Create PostgreSQL user
# ----------------------------- # -----------------------------
# Run a query as postgres admin. Returns psql's exit status so callers can tell
# "query returned nothing" apart from "could not connect".
pg_admin() {
PGPASSWORD="$POSTGRES_ADMIN_PASSWORD" psql -h "$POSTGRES_HOST" -U "$POSTGRES_ADMIN_USER" -p "$POSTGRES_PORT" -d postgres -tAc "$1"
}
# Wait until Postgres accepts connections (default: up to 60s).
wait_for_postgres() {
local tries="${1:-30}"
local i
for ((i = 1; i <= tries; i++)); do
if pg_admin "SELECT 1;" >/dev/null 2>&1; then
return 0
fi
echo "$(date '+%Y-%m-%d %H:%M:%S') Postgres at $POSTGRES_HOST:$POSTGRES_PORT not reachable yet ($i/$tries), retrying in 2s"
sleep 2
done
return 1
}
check_and_create_db() { check_and_create_db() {
echo "check and create" echo "$(date '+%Y-%m-%d %H:%M:%S') Checking user and database for $UUID (DB user $ODOO_DB_USER) as $POSTGRES_ADMIN_USER on $POSTGRES_HOST:$POSTGRES_PORT"
echo "Connecting as $POSTGRES_ADMIN_USER to $POSTGRES_HOST:$POSTGRES_PORT"
# -----------------------------
# Never guess: if Postgres cannot be queried we must NOT assume the DB is
# missing, because a restore wipes the filestore.
# -----------------------------
if ! wait_for_postgres; then
echo "$(date '+%Y-%m-%d %H:%M:%S') ERROR: cannot connect to Postgres at $POSTGRES_HOST:$POSTGRES_PORT - skipping DB check, NO restore performed"
return 1
fi
# ----------------------------- # -----------------------------
# Check if user exists # Check if user exists
# ----------------------------- # -----------------------------
USER_EXISTS=$(PGPASSWORD="$POSTGRES_ADMIN_PASSWORD" psql -h "$POSTGRES_HOST" -U "$POSTGRES_ADMIN_USER" -p "$POSTGRES_PORT" -d postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname='$ODOO_DB_USER';" | grep -q 1 && echo "yes" || echo "no") USER_EXISTS=$(PGPASSWORD="$POSTGRES_ADMIN_PASSWORD" psql -h "$POSTGRES_HOST" -U "$POSTGRES_ADMIN_USER" -p "$POSTGRES_PORT" -d postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname='$ODOO_DB_USER';" | grep -q 1 && echo "yes" || echo "no")
if [ "$USER_EXISTS" = "no" ]; then if [ "$USER_EXISTS" = "no" ]; then
echo "Creating PostgreSQL user $ODOO_DB_USER..." echo "$(date '+%Y-%m-%d %H:%M:%S') PostgreSQL user $ODOO_DB_USER does not exist, creating it"
PGPASSWORD="$POSTGRES_ADMIN_PASSWORD" psql -h "$POSTGRES_HOST" -U "$POSTGRES_ADMIN_USER" -p "$POSTGRES_PORT" -d postgres -c "CREATE USER \"$ODOO_DB_USER\" WITH PASSWORD '$ODOO_DB_PASSWORD';" PGPASSWORD="$POSTGRES_ADMIN_PASSWORD" psql -h "$POSTGRES_HOST" -U "$POSTGRES_ADMIN_USER" -p "$POSTGRES_PORT" -d postgres -c "CREATE USER \"$ODOO_DB_USER\" WITH PASSWORD '$ODOO_DB_PASSWORD';"
echo "$(date '+%Y-%m-%d %H:%M:%S') CREATE USER $ODOO_DB_USER finished with exit code $?"
else
echo "$(date '+%Y-%m-%d %H:%M:%S') PostgreSQL user $ODOO_DB_USER already exists"
fi fi
# ----------------------------- # -----------------------------
# Check if database exists # Check if database exists
# ----------------------------- # -----------------------------
DB_EXISTS=$(PGPASSWORD="$POSTGRES_ADMIN_PASSWORD" psql -h "$POSTGRES_HOST" -U "$POSTGRES_ADMIN_USER" -p "$POSTGRES_PORT" -d postgres -tAc "SELECT 1 FROM pg_database WHERE datname='$UUID';" | grep -q 1 && echo "yes" || echo "no") DB_RESULT=$(pg_admin "SELECT 1 FROM pg_database WHERE datname='$UUID';")
DB_RC=$?
if [ $DB_RC -ne 0 ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') ERROR: existence query for database $UUID failed (rc=$DB_RC) - NO restore performed"
return 1
fi
if [ "$DB_RESULT" = "1" ]; then
DB_EXISTS="yes"
else
DB_EXISTS="no"
fi
if [ "$DB_EXISTS" = "no" ]; then if [ "$DB_EXISTS" = "no" ]; then
FILESTORE_HOST="/4server/data/$UUID/odoo/odoo-web-data/filestore"
if [ -d "$FILESTORE_HOST" ] && [ -n "$(ls -A "$FILESTORE_HOST" 2>/dev/null)" ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') ERROR: database $UUID not found but a filestore exists at $FILESTORE_HOST - refusing automatic restore of default.zip (would delete the filestore). Restore manually if intended."
return 1
fi
echo "$(date '+%Y-%m-%d %H:%M:%S') Database $UUID does not exist and no filestore found, restoring default.zip"
/4server/sbin/ODOO_19/restore $UUID default.zip /4server/sbin/ODOO_19/restore $UUID default.zip
local restore_rc=$?
echo "$(date '+%Y-%m-%d %H:%M:%S') Restore of default.zip for $UUID finished with exit code $restore_rc"
return $restore_rc
else
echo "$(date '+%Y-%m-%d %H:%M:%S') Database $UUID already exists, nothing to do"
fi fi
} }
+21 -2
View File
@@ -35,6 +35,14 @@ else
fi fi
source /4server/sbin/ODOO_19/ODOO_19.lib
# Abort BEFORE touching anything if Postgres is not reachable
if ! wait_for_postgres; then
echo "ERROR: cannot connect to Postgres at $POSTGRES_HOST:$POSTGRES_PORT - restore aborted, nothing was changed"
exit 1
fi
### DELETE AND CREATE DATABASE ### DELETE AND CREATE DATABASE
PGPASSWORD="$POSTGRES_ADMIN_PASSWORD" psql -h "$POSTGRES_HOST" -U "$POSTGRES_ADMIN_USER" -d postgres -c " PGPASSWORD="$POSTGRES_ADMIN_PASSWORD" psql -h "$POSTGRES_HOST" -U "$POSTGRES_ADMIN_USER" -d postgres -c "
SELECT pg_terminate_backend(pid) FROM pg_stat_activity SELECT pg_terminate_backend(pid) FROM pg_stat_activity
@@ -49,10 +57,21 @@ PGPASSWORD="$POSTGRES_ADMIN_PASSWORD" psql \
-c "ALTER ROLE \"$UUID\" CREATEDB;" -c "ALTER ROLE \"$UUID\" CREATEDB;"
doas docker exec "$UUID" rm -rf /home/odoo/.local/share/Odoo/filestore # Move the old filestore aside instead of deleting it; it is only removed after a successful load
OLD_FS="/home/odoo/.local/share/Odoo/.filestore.pre-restore"
doas docker exec "$UUID" rm -rf "$OLD_FS"
doas docker exec "$UUID" sh -c "[ -d /home/odoo/.local/share/Odoo/filestore ] && mv /home/odoo/.local/share/Odoo/filestore $OLD_FS; true"
doas docker exec "$UUID" rm -rf /root/.local/share/Odoo/filestore doas docker exec "$UUID" rm -rf /root/.local/share/Odoo/filestore
doas docker exec "$UUID" odoo db --db_host beedb -w "$ODOO_DB_PASSWORD" -r "$UUID" load "$UUID" $FILENAME -f if ! doas docker exec "$UUID" odoo db --db_host beedb -w "$ODOO_DB_PASSWORD" -r "$UUID" load "$UUID" $FILENAME -f; then
echo "ERROR: odoo db load failed - putting the old filestore back"
doas docker exec "$UUID" sh -c "[ -d $OLD_FS ] && rm -rf /home/odoo/.local/share/Odoo/filestore && mv $OLD_FS /home/odoo/.local/share/Odoo/filestore; true"
PGPASSWORD="$POSTGRES_ADMIN_PASSWORD" psql \
-h "$POSTGRES_HOST" -U "$POSTGRES_ADMIN_USER" -p "$POSTGRES_PORT" -d postgres \
-c "ALTER ROLE \"$UUID\" NOCREATEDB;"
exit 1
fi
doas docker exec "$UUID" rm -rf "$OLD_FS"
PGPASSWORD="$POSTGRES_ADMIN_PASSWORD" psql \ PGPASSWORD="$POSTGRES_ADMIN_PASSWORD" psql \
-h "$POSTGRES_HOST" -U "$POSTGRES_ADMIN_USER" -p "$POSTGRES_PORT" -d postgres \ -h "$POSTGRES_HOST" -U "$POSTGRES_ADMIN_USER" -p "$POSTGRES_PORT" -d postgres \
+10 -1
View File
@@ -10,7 +10,7 @@ DB_PATH="/4server/data/contracts.db"
get_contract_info() { get_contract_info() {
echo "get_contract_info $UUID" echo "$(date '+%Y-%m-%d %H:%M:%S') Loading contract info for $UUID from $DB_PATH"
# Single CTE: the table is scanned once and all projections come from it # Single CTE: the table is scanned once and all projections come from it
while IFS="=" read -r key value; do while IFS="=" read -r key value; do
@@ -48,4 +48,13 @@ get_contract_info() {
done < <(printf '%s' "$SECRET_LIST" | tr -d '\r\n' | tr '\\' '\n') done < <(printf '%s' "$SECRET_LIST" | tr -d '\r\n' | tr '\\' '\n')
fi fi
export ODOO_DB_PASSWORD=$psql export ODOO_DB_PASSWORD=$psql
if [ -z "$CONTAINERDBID" ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') WARNING: no contract found for $UUID in $DB_PATH"
else
echo "$(date '+%Y-%m-%d %H:%M:%S') Loaded contract for $UUID: DBID=$CONTAINERDBID IMAGE=$IMAGE STATUS=$STATUS CREATED=$CREATED EXPIRES=$EXPIRES"
fi
if [ -z "$ODOO_DB_PASSWORD" ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') WARNING: no psql secret found for $UUID, ODOO_DB_PASSWORD is empty"
fi
} }
+13 -10
View File
@@ -1,5 +1,4 @@
#!/bin/bash #!/bin/bash
echo "START ODOO 17"
# Load functions # Load functions
source /4server/sbin/ODOO_19/ODOO_19.lib source /4server/sbin/ODOO_19/ODOO_19.lib
source /4server/sbin/helpers source /4server/sbin/helpers
@@ -12,9 +11,7 @@ BRANCH="${BRANCH:-release}"
ODOO_DB_USER="${UUID}" ODOO_DB_USER="${UUID}"
#export ODOO_DB_PASSWORD=$(echo "$SECRET" | jq -r '.psql') #export ODOO_DB_PASSWORD=$(echo "$SECRET" | jq -r '.psql')
echo "$(date '+%Y-%m-%d %H:%M:%S') START ODOO 17 UUID=$UUID BRANCH=$BRANCH DBID=$CONTAINERDBID DB_USER=$ODOO_DB_USER HDD=$HDD DOMAIN_SLOTS=$DOMAIN_SLOTS BACKUP_SLOTS=$BACKUP_SLOTS WORKER=$WORKER"
echo "ENV: $HDD $DOMAIN_SLOTS $BACKUP_SLOTS $CONTAINERDBID"
echo "DBID: $CONTAINERDBID"
BASEURL="${BASEURL:-/4server/data/$UUID}" BASEURL="${BASEURL:-/4server/data/$UUID}"
DATA_DIR="$BASEURL/odoo/" DATA_DIR="$BASEURL/odoo/"
@@ -38,25 +35,26 @@ if [ -f "$BASEURL/etc/domain" ]; then
LABEL_DOMAINS+=("$domain") LABEL_DOMAINS+=("$domain")
done < "$BASEURL/etc/domain" done < "$BASEURL/etc/domain"
else else
echo "[DEBUG] No additional domain file found at $BASEURL/etc/domain" echo "$(date '+%Y-%m-%d %H:%M:%S') No custom domain file at $BASEURL/etc/domain, using default domain $UUID.odoo4projects.com only"
fi fi
RULE="" RULE=""
for d in "${LABEL_DOMAINS[@]}"; do for d in "${LABEL_DOMAINS[@]}"; do
RESOLVED_IP=$(nslookup "$d" 2>/dev/null | awk '/^Address: / { print $2 }' | head -n1 || true) RESOLVED_IP=$(nslookup "$d" 2>/dev/null | awk '/^Address: / { print $2 }' | head -n1 || true)
if [ -z "$RESOLVED_IP" ]; then if [ -z "$RESOLVED_IP" ]; then
echo "[DEBUG] Could not resolve $d, skipping" echo "$(date '+%Y-%m-%d %H:%M:%S') Domain $d does not resolve, skipping"
continue continue
fi fi
if [ "$RESOLVED_IP" = "$SERVER_IP" ]; then if [ "$RESOLVED_IP" = "$SERVER_IP" ]; then
RULE+=" || Host(\`$d\`)" RULE+=" || Host(\`$d\`)"
echo "$(date '+%Y-%m-%d %H:%M:%S') Domain $d resolves to $RESOLVED_IP (server IP), added to Traefik rule"
else else
echo "[DEBUG] Skipping $d (does not match SERVER_IP $SERVER_IP)" echo "$(date '+%Y-%m-%d %H:%M:%S') Domain $d resolves to $RESOLVED_IP but server IP is $SERVER_IP, skipping"
fi fi
done done
RULE="${RULE# || }" RULE="${RULE# || }"
DOMAIN_LABEL="traefik.http.routers.$UUID.rule=$RULE" DOMAIN_LABEL="traefik.http.routers.$UUID.rule=$RULE"
echo "[DEBUG] Final Traefik label: $DOMAIN_LABEL" echo "$(date '+%Y-%m-%d %H:%M:%S') Traefik label for $UUID: $DOMAIN_LABEL"
docker exec "$UUID" mkdir -p /var/lib/odoo/.local/share/Odoo/ docker exec "$UUID" mkdir -p /var/lib/odoo/.local/share/Odoo/
docker exec "$UUID" ln -s /home/odoo/.local/share/Odoo/filestore /var/lib/odoo/.local/share/Odoo/filestore docker exec "$UUID" ln -s /home/odoo/.local/share/Odoo/filestore /var/lib/odoo/.local/share/Odoo/filestore
@@ -64,9 +62,7 @@ docker exec "$UUID" ln -s /home/odoo/.local/share/Odoo/filestore /var/lib/odoo/.
find "$BASEURL" -type d -exec chmod 777 {} \; find "$BASEURL" -type d -exec chmod 777 {} \;
PORT=$((CONTAINERDBID + 2200)) PORT=$((CONTAINERDBID + 2200))
echo "PORT $PORT"
mkdir -p ${ETC_DIR} mkdir -p ${ETC_DIR}
echo "GITPATH ${ETC_DIR}gitpath"
touch ${ETC_DIR}gitpath touch ${ETC_DIR}gitpath
mkdir -p ${GIT_DIR}keys mkdir -p ${GIT_DIR}keys
@@ -74,13 +70,16 @@ touch ${GIT_DIR}keys/id_rsa.pub
echo "git clone \"ssh://git@${UUID}.odoo4projects.com:${PORT}/git-server/repos/odoo.git\"" > "${ETC_DIR}/gitpath" echo "git clone \"ssh://git@${UUID}.odoo4projects.com:${PORT}/git-server/repos/odoo.git\"" > "${ETC_DIR}/gitpath"
echo "$(date '+%Y-%m-%d %H:%M:%S') Wrote git clone path for $UUID to ${ETC_DIR}gitpath (SSH port $PORT)"
echo "$(date '+%Y-%m-%d %H:%M:%S') Stopping and removing existing container $UUID (if any)"
docker stop "$UUID" 2>/dev/null docker stop "$UUID" 2>/dev/null
docker rm "$UUID" 2>/dev/null docker rm "$UUID" 2>/dev/null
EXTRA_DOCKER_PARAMETER="" EXTRA_DOCKER_PARAMETER=""
echo "$(date '+%Y-%m-%d %H:%M:%S') Starting container $UUID from docker.odoo4projects.com/4projects/odoo_17:$BRANCH (SSH port $PORT, network 4server_4projects)"
docker run -d --name "$UUID" \ docker run -d --name "$UUID" \
--network 4server_4projects \ --network 4server_4projects \
--restart=always \ --restart=always \
@@ -112,7 +111,9 @@ docker run -d --name "$UUID" \
--label "traefik.http.routers.$UUID.tls=true" \ --label "traefik.http.routers.$UUID.tls=true" \
--label "traefik.http.routers.$UUID.service=$UUID" \ --label "traefik.http.routers.$UUID.service=$UUID" \
docker.odoo4projects.com/4projects/odoo_17:$BRANCH docker.odoo4projects.com/4projects/odoo_17:$BRANCH
echo "$(date '+%Y-%m-%d %H:%M:%S') docker run for $UUID finished with exit code $?"
echo "$(date '+%Y-%m-%d %H:%M:%S') Preparing filestore and fixing ownership in container $UUID"
docker exec "$UUID" mkdir -p /var/lib/odoo/.local/share/Odoo docker exec "$UUID" mkdir -p /var/lib/odoo/.local/share/Odoo
docker exec "$UUID" rm -rf /var/lib/odoo/.local/share/Odoo/filestore docker exec "$UUID" rm -rf /var/lib/odoo/.local/share/Odoo/filestore
docker exec "$UUID" ln -s /home/odoo/.local/share/Odoo/filestore /var/lib/odoo/.local/share/Odoo/filestore docker exec "$UUID" ln -s /home/odoo/.local/share/Odoo/filestore /var/lib/odoo/.local/share/Odoo/filestore
@@ -124,4 +125,6 @@ docker exec $UUID chown -R odoo:odoo /mnt/*
docker exec $UUID chown odoo:odoo /git-server/keys/id_rsa.pub docker exec $UUID chown odoo:odoo /git-server/keys/id_rsa.pub
echo "$(date '+%Y-%m-%d %H:%M:%S') Checking/creating database for $UUID (user $ODOO_DB_USER)"
check_and_create_db check_and_create_db
echo "$(date '+%Y-%m-%d %H:%M:%S') START ODOO 17 finished for $UUID"
+13 -9
View File
@@ -12,9 +12,7 @@ BRANCH="${BRANCH:-release}"
ODOO_DB_USER="${UUID}" ODOO_DB_USER="${UUID}"
#export ODOO_DB_PASSWORD=$(echo "$SECRET" | jq -r '.psql') #export ODOO_DB_PASSWORD=$(echo "$SECRET" | jq -r '.psql')
echo "$(date '+%Y-%m-%d %H:%M:%S') START ODOO 18 UUID=$UUID BRANCH=$BRANCH DBID=$CONTAINERDBID DB_USER=$ODOO_DB_USER HDD=$HDD DOMAIN_SLOTS=$DOMAIN_SLOTS BACKUP_SLOTS=$BACKUP_SLOTS WORKER=$WORKER"
echo "ENV: $HDD $DOMAIN_SLOTS $BACKUP_SLOTS $CONTAINERDBID"
echo "DBID: $CONTAINERDBID"
BASEURL="${BASEURL:-/4server/data/$UUID}" BASEURL="${BASEURL:-/4server/data/$UUID}"
DATA_DIR="$BASEURL/odoo/" DATA_DIR="$BASEURL/odoo/"
@@ -38,25 +36,26 @@ if [ -f "$BASEURL/etc/domain" ]; then
LABEL_DOMAINS+=("$domain") LABEL_DOMAINS+=("$domain")
done < "$BASEURL/etc/domain" done < "$BASEURL/etc/domain"
else else
echo "[DEBUG] No additional domain file found at $BASEURL/etc/domain" echo "$(date '+%Y-%m-%d %H:%M:%S') No custom domain file at $BASEURL/etc/domain, using default domain $UUID.odoo4projects.com only"
fi fi
RULE="" RULE=""
for d in "${LABEL_DOMAINS[@]}"; do for d in "${LABEL_DOMAINS[@]}"; do
RESOLVED_IP=$(nslookup "$d" 2>/dev/null | awk '/^Address: / { print $2 }' | head -n1 || true) RESOLVED_IP=$(nslookup "$d" 2>/dev/null | awk '/^Address: / { print $2 }' | head -n1 || true)
if [ -z "$RESOLVED_IP" ]; then if [ -z "$RESOLVED_IP" ]; then
echo "[DEBUG] Could not resolve $d, skipping" echo "$(date '+%Y-%m-%d %H:%M:%S') Domain $d does not resolve, skipping"
continue continue
fi fi
if [ "$RESOLVED_IP" = "$SERVER_IP" ]; then if [ "$RESOLVED_IP" = "$SERVER_IP" ]; then
RULE+=" || Host(\`$d\`)" RULE+=" || Host(\`$d\`)"
echo "$(date '+%Y-%m-%d %H:%M:%S') Domain $d resolves to $RESOLVED_IP (server IP), added to Traefik rule"
else else
echo "[DEBUG] Skipping $d (does not match SERVER_IP $SERVER_IP)" echo "$(date '+%Y-%m-%d %H:%M:%S') Domain $d resolves to $RESOLVED_IP but server IP is $SERVER_IP, skipping"
fi fi
done done
RULE="${RULE# || }" RULE="${RULE# || }"
DOMAIN_LABEL="traefik.http.routers.$UUID.rule=$RULE" DOMAIN_LABEL="traefik.http.routers.$UUID.rule=$RULE"
echo "[DEBUG] Final Traefik label: $DOMAIN_LABEL" echo "$(date '+%Y-%m-%d %H:%M:%S') Traefik label for $UUID: $DOMAIN_LABEL"
docker exec "$UUID" mkdir -p /var/lib/odoo/.local/share/Odoo/ docker exec "$UUID" mkdir -p /var/lib/odoo/.local/share/Odoo/
docker exec "$UUID" ln -s /home/odoo/.local/share/Odoo/filestore /var/lib/odoo/.local/share/Odoo/filestore docker exec "$UUID" ln -s /home/odoo/.local/share/Odoo/filestore /var/lib/odoo/.local/share/Odoo/filestore
@@ -64,9 +63,7 @@ docker exec "$UUID" ln -s /home/odoo/.local/share/Odoo/filestore /var/lib/odoo/.
find "$BASEURL" -type d -exec chmod 777 {} \; find "$BASEURL" -type d -exec chmod 777 {} \;
PORT=$((CONTAINERDBID + 2200)) PORT=$((CONTAINERDBID + 2200))
echo "PORT $PORT"
mkdir -p ${ETC_DIR} mkdir -p ${ETC_DIR}
echo "GITPATH ${ETC_DIR}gitpath"
touch ${ETC_DIR}gitpath touch ${ETC_DIR}gitpath
mkdir -p ${GIT_DIR}keys mkdir -p ${GIT_DIR}keys
@@ -74,13 +71,16 @@ touch ${GIT_DIR}keys/id_rsa.pub
echo "git clone \"ssh://git@${UUID}.odoo4projects.com:${PORT}/git-server/repos/odoo.git\"" > "${ETC_DIR}/gitpath" echo "git clone \"ssh://git@${UUID}.odoo4projects.com:${PORT}/git-server/repos/odoo.git\"" > "${ETC_DIR}/gitpath"
echo "$(date '+%Y-%m-%d %H:%M:%S') Wrote git clone path for $UUID to ${ETC_DIR}gitpath (SSH port $PORT)"
echo "$(date '+%Y-%m-%d %H:%M:%S') Stopping and removing existing container $UUID (if any)"
docker stop "$UUID" 2>/dev/null docker stop "$UUID" 2>/dev/null
docker rm "$UUID" 2>/dev/null docker rm "$UUID" 2>/dev/null
EXTRA_DOCKER_PARAMETER="" EXTRA_DOCKER_PARAMETER=""
echo "$(date '+%Y-%m-%d %H:%M:%S') Starting container $UUID from docker.odoo4projects.com/4projects/odoo_18:$BRANCH (SSH port $PORT, network 4server_4projects)"
docker run -d --name "$UUID" \ docker run -d --name "$UUID" \
--network 4server_4projects \ --network 4server_4projects \
--restart=always \ --restart=always \
@@ -112,7 +112,9 @@ docker run -d --name "$UUID" \
--label "traefik.http.routers.$UUID.tls=true" \ --label "traefik.http.routers.$UUID.tls=true" \
--label "traefik.http.routers.$UUID.service=$UUID" \ --label "traefik.http.routers.$UUID.service=$UUID" \
docker.odoo4projects.com/4projects/odoo_18:$BRANCH docker.odoo4projects.com/4projects/odoo_18:$BRANCH
echo "$(date '+%Y-%m-%d %H:%M:%S') docker run for $UUID finished with exit code $?"
echo "$(date '+%Y-%m-%d %H:%M:%S') Preparing filestore and fixing ownership in container $UUID"
docker exec "$UUID" mkdir -p /var/lib/odoo/.local/share/Odoo docker exec "$UUID" mkdir -p /var/lib/odoo/.local/share/Odoo
docker exec "$UUID" rm -rf /var/lib/odoo/.local/share/Odoo/filestore docker exec "$UUID" rm -rf /var/lib/odoo/.local/share/Odoo/filestore
docker exec "$UUID" ln -s /home/odoo/.local/share/Odoo/filestore /var/lib/odoo/.local/share/Odoo/filestore docker exec "$UUID" ln -s /home/odoo/.local/share/Odoo/filestore /var/lib/odoo/.local/share/Odoo/filestore
@@ -124,4 +126,6 @@ docker exec $UUID chown -R odoo:odoo /mnt/*
docker exec $UUID chown odoo:odoo /git-server/keys/id_rsa.pub docker exec $UUID chown odoo:odoo /git-server/keys/id_rsa.pub
echo "$(date '+%Y-%m-%d %H:%M:%S') Checking/creating database for $UUID (user $ODOO_DB_USER)"
check_and_create_db check_and_create_db
echo "$(date '+%Y-%m-%d %H:%M:%S') START ODOO 18 finished for $UUID"
+13 -9
View File
@@ -11,10 +11,8 @@ BRANCH="${BRANCH:-release}"
ODOO_DB_USER="${UUID}" ODOO_DB_USER="${UUID}"
#export ODOO_DB_PASSWORD=$(echo "$SECRET" | jq -r '.psql') #export ODOO_DB_PASSWORD=$(echo "$SECRET" | jq -r '.psql')
echo "***** $ODOO_DB_PASSWORD"
echo "ENV: $HDD $DOMAIN_SLOTS $BACKUP_SLOTS $CONTAINERDBID" echo "$(date '+%Y-%m-%d %H:%M:%S') START ODOO 19 UUID=$UUID BRANCH=$BRANCH DBID=$CONTAINERDBID DB_USER=$ODOO_DB_USER HDD=$HDD DOMAIN_SLOTS=$DOMAIN_SLOTS BACKUP_SLOTS=$BACKUP_SLOTS WORKER=$WORKER"
echo "DBID: $CONTAINERDBID"
BASEURL="${BASEURL:-/4server/data/$UUID}" BASEURL="${BASEURL:-/4server/data/$UUID}"
DATA_DIR="$BASEURL/odoo/" DATA_DIR="$BASEURL/odoo/"
@@ -38,34 +36,33 @@ if [ -f "$BASEURL/etc/domain" ]; then
LABEL_DOMAINS+=("$domain") LABEL_DOMAINS+=("$domain")
done < "$BASEURL/etc/domain" done < "$BASEURL/etc/domain"
else else
echo "[DEBUG] No additional domain file found at $BASEURL/etc/domain" echo "$(date '+%Y-%m-%d %H:%M:%S') No custom domain file at $BASEURL/etc/domain, using default domain $UUID.odoo4projects.com only"
fi fi
RULE="" RULE=""
for d in "${LABEL_DOMAINS[@]}"; do for d in "${LABEL_DOMAINS[@]}"; do
RESOLVED_IP=$(nslookup "$d" 2>/dev/null | awk '/^Address: / { print $2 }' | head -n1 || true) RESOLVED_IP=$(nslookup "$d" 2>/dev/null | awk '/^Address: / { print $2 }' | head -n1 || true)
if [ -z "$RESOLVED_IP" ]; then if [ -z "$RESOLVED_IP" ]; then
echo "[DEBUG] Could not resolve $d, skipping" echo "$(date '+%Y-%m-%d %H:%M:%S') Domain $d does not resolve, skipping"
continue continue
fi fi
if [ "$RESOLVED_IP" = "$SERVER_IP" ]; then if [ "$RESOLVED_IP" = "$SERVER_IP" ]; then
RULE+=" || Host(\`$d\`)" RULE+=" || Host(\`$d\`)"
echo "$(date '+%Y-%m-%d %H:%M:%S') Domain $d resolves to $RESOLVED_IP (server IP), added to Traefik rule"
else else
echo "[DEBUG] Skipping $d (does not match SERVER_IP $SERVER_IP)" echo "$(date '+%Y-%m-%d %H:%M:%S') Domain $d resolves to $RESOLVED_IP but server IP is $SERVER_IP, skipping"
fi fi
done done
RULE="${RULE# || }" RULE="${RULE# || }"
DOMAIN_LABEL="traefik.http.routers.$UUID.rule=$RULE" DOMAIN_LABEL="traefik.http.routers.$UUID.rule=$RULE"
echo "[DEBUG] Final Traefik label: $DOMAIN_LABEL" echo "$(date '+%Y-%m-%d %H:%M:%S') Traefik label for $UUID: $DOMAIN_LABEL"
find "$BASEURL" -type d -exec chmod 777 {} \; find "$BASEURL" -type d -exec chmod 777 {} \;
PORT=$((CONTAINERDBID + 2200)) PORT=$((CONTAINERDBID + 2200))
echo "PORT $PORT"
mkdir -p ${ETC_DIR} mkdir -p ${ETC_DIR}
chmod 777 ${ETC_DIR} chmod 777 ${ETC_DIR}
echo "GITPATH ${ETC_DIR}gitpath"
touch ${ETC_DIR}gitpath touch ${ETC_DIR}gitpath
mkdir -p ${BACKUP_DIR} mkdir -p ${BACKUP_DIR}
@@ -77,13 +74,16 @@ touch ${GIT_DIR}keys/id_rsa.pub
echo "git clone \"ssh://git@${UUID}.odoo4projects.com:${PORT}/git-server/repos/odoo.git\"" > "${ETC_DIR}/gitpath" echo "git clone \"ssh://git@${UUID}.odoo4projects.com:${PORT}/git-server/repos/odoo.git\"" > "${ETC_DIR}/gitpath"
echo "$(date '+%Y-%m-%d %H:%M:%S') Wrote git clone path for $UUID to ${ETC_DIR}gitpath (SSH port $PORT)"
echo "$(date '+%Y-%m-%d %H:%M:%S') Stopping and removing existing container $UUID (if any)"
docker stop "$UUID" 2>/dev/null docker stop "$UUID" 2>/dev/null
docker rm "$UUID" 2>/dev/null docker rm "$UUID" 2>/dev/null
EXTRA_DOCKER_PARAMETER="" EXTRA_DOCKER_PARAMETER=""
echo "$(date '+%Y-%m-%d %H:%M:%S') Starting container $UUID from docker.odoo4projects.com/4projects/odoo_19:$BRANCH (SSH port $PORT, network 4server_4projects)"
docker run -d --name "$UUID" \ docker run -d --name "$UUID" \
--network 4server_4projects \ --network 4server_4projects \
--restart=always \ --restart=always \
@@ -115,11 +115,15 @@ docker run -d --name "$UUID" \
--label "traefik.http.routers.$UUID.tls=true" \ --label "traefik.http.routers.$UUID.tls=true" \
--label "traefik.http.routers.$UUID.service=$UUID" \ --label "traefik.http.routers.$UUID.service=$UUID" \
docker.odoo4projects.com/4projects/odoo_19:$BRANCH docker.odoo4projects.com/4projects/odoo_19:$BRANCH
echo "$(date '+%Y-%m-%d %H:%M:%S') docker run for $UUID finished with exit code $?"
echo "$(date '+%Y-%m-%d %H:%M:%S') Fixing ownership in container $UUID"
docker exec $UUID chown -R odoo:odoo /home/odoo/.local docker exec $UUID chown -R odoo:odoo /home/odoo/.local
docker exec $UUID chown -R odoo:odoo /mnt/* docker exec $UUID chown -R odoo:odoo /mnt/*
docker exec $UUID chown -R git:git /git-server docker exec $UUID chown -R git:git /git-server
chmod 777 /4server/data/$UUID/cc chmod 777 /4server/data/$UUID/cc
echo "$(date '+%Y-%m-%d %H:%M:%S') Checking/creating database for $UUID (user $ODOO_DB_USER)"
check_and_create_db check_and_create_db
echo "$(date '+%Y-%m-%d %H:%M:%S') START ODOO 19 finished for $UUID"
+13 -9
View File
@@ -11,10 +11,8 @@ BRANCH="${BRANCH:-release}"
ODOO_DB_USER="${UUID}" ODOO_DB_USER="${UUID}"
#export ODOO_DB_PASSWORD=$(echo "$SECRET" | jq -r '.psql') #export ODOO_DB_PASSWORD=$(echo "$SECRET" | jq -r '.psql')
echo "***** $ODOO_DB_PASSWORD"
echo "ENV: $HDD $DOMAIN_SLOTS $BACKUP_SLOTS $CONTAINERDBID" echo "$(date '+%Y-%m-%d %H:%M:%S') START ODOO 20 UUID=$UUID BRANCH=$BRANCH DBID=$CONTAINERDBID DB_USER=$ODOO_DB_USER HDD=$HDD DOMAIN_SLOTS=$DOMAIN_SLOTS BACKUP_SLOTS=$BACKUP_SLOTS WORKER=$WORKER"
echo "DBID: $CONTAINERDBID"
BASEURL="${BASEURL:-/4server/data/$UUID}" BASEURL="${BASEURL:-/4server/data/$UUID}"
DATA_DIR="$BASEURL/odoo/" DATA_DIR="$BASEURL/odoo/"
@@ -38,34 +36,33 @@ if [ -f "$BASEURL/etc/domain" ]; then
LABEL_DOMAINS+=("$domain") LABEL_DOMAINS+=("$domain")
done < "$BASEURL/etc/domain" done < "$BASEURL/etc/domain"
else else
echo "[DEBUG] No additional domain file found at $BASEURL/etc/domain" echo "$(date '+%Y-%m-%d %H:%M:%S') No custom domain file at $BASEURL/etc/domain, using default domain $UUID.$HOSTNAME.odoo4projects.com only"
fi fi
RULE="" RULE=""
for d in "${LABEL_DOMAINS[@]}"; do for d in "${LABEL_DOMAINS[@]}"; do
RESOLVED_IP=$(nslookup "$d" 2>/dev/null | awk '/^Address: / { print $2 }' | head -n1 || true) RESOLVED_IP=$(nslookup "$d" 2>/dev/null | awk '/^Address: / { print $2 }' | head -n1 || true)
if [ -z "$RESOLVED_IP" ]; then if [ -z "$RESOLVED_IP" ]; then
echo "[DEBUG] Could not resolve $d, skipping" echo "$(date '+%Y-%m-%d %H:%M:%S') Domain $d does not resolve, skipping"
continue continue
fi fi
if [ "$RESOLVED_IP" = "$SERVER_IP" ]; then if [ "$RESOLVED_IP" = "$SERVER_IP" ]; then
RULE+=" || Host(\`$d\`)" RULE+=" || Host(\`$d\`)"
echo "$(date '+%Y-%m-%d %H:%M:%S') Domain $d resolves to $RESOLVED_IP (server IP), added to Traefik rule"
else else
echo "[DEBUG] Skipping $d (does not match SERVER_IP $SERVER_IP)" echo "$(date '+%Y-%m-%d %H:%M:%S') Domain $d resolves to $RESOLVED_IP but server IP is $SERVER_IP, skipping"
fi fi
done done
RULE="${RULE# || }" RULE="${RULE# || }"
DOMAIN_LABEL="traefik.http.routers.$UUID.rule=$RULE" DOMAIN_LABEL="traefik.http.routers.$UUID.rule=$RULE"
echo "[DEBUG] Final Traefik label: $DOMAIN_LABEL" echo "$(date '+%Y-%m-%d %H:%M:%S') Traefik label for $UUID: $DOMAIN_LABEL"
find "$BASEURL" -type d -exec chmod 777 {} \; find "$BASEURL" -type d -exec chmod 777 {} \;
PORT=$((CONTAINERDBID + 2200)) PORT=$((CONTAINERDBID + 2200))
echo "PORT $PORT"
mkdir -p ${ETC_DIR} mkdir -p ${ETC_DIR}
chmod 777 ${ETC_DIR} chmod 777 ${ETC_DIR}
echo "GITPATH ${ETC_DIR}gitpath"
touch ${ETC_DIR}gitpath touch ${ETC_DIR}gitpath
mkdir -p ${BACKUP_DIR} mkdir -p ${BACKUP_DIR}
@@ -77,13 +74,16 @@ touch ${GIT_DIR}keys/id_rsa.pub
echo "git clone \"ssh://git@${UUID}.${HOSTNAME}.odoo4projects.com:${PORT}/git-server/repos/odoo.git\"" > "${ETC_DIR}/gitpath" echo "git clone \"ssh://git@${UUID}.${HOSTNAME}.odoo4projects.com:${PORT}/git-server/repos/odoo.git\"" > "${ETC_DIR}/gitpath"
echo "$(date '+%Y-%m-%d %H:%M:%S') Wrote git clone path for $UUID to ${ETC_DIR}gitpath (SSH port $PORT)"
echo "$(date '+%Y-%m-%d %H:%M:%S') Stopping and removing existing container $UUID (if any)"
docker stop "$UUID" 2>/dev/null docker stop "$UUID" 2>/dev/null
docker rm "$UUID" 2>/dev/null docker rm "$UUID" 2>/dev/null
EXTRA_DOCKER_PARAMETER="" EXTRA_DOCKER_PARAMETER=""
echo "$(date '+%Y-%m-%d %H:%M:%S') Starting container $UUID from docker.odoo4projects.com/4projects/odoo_20:$BRANCH (SSH port $PORT, network 4server_4projects)"
docker run -d --name "$UUID" \ docker run -d --name "$UUID" \
--network 4server_4projects \ --network 4server_4projects \
--restart=always \ --restart=always \
@@ -115,11 +115,15 @@ docker run -d --name "$UUID" \
--label "traefik.http.routers.$UUID.tls=true" \ --label "traefik.http.routers.$UUID.tls=true" \
--label "traefik.http.routers.$UUID.service=$UUID" \ --label "traefik.http.routers.$UUID.service=$UUID" \
docker.odoo4projects.com/4projects/odoo_20:$BRANCH docker.odoo4projects.com/4projects/odoo_20:$BRANCH
echo "$(date '+%Y-%m-%d %H:%M:%S') docker run for $UUID finished with exit code $?"
echo "$(date '+%Y-%m-%d %H:%M:%S') Fixing ownership in container $UUID"
docker exec $UUID chown -R odoo:odoo /home/odoo/.local docker exec $UUID chown -R odoo:odoo /home/odoo/.local
docker exec $UUID chown -R odoo:odoo /mnt/* docker exec $UUID chown -R odoo:odoo /mnt/*
docker exec $UUID chown -R git:git /git-server docker exec $UUID chown -R git:git /git-server
chmod 777 /4server/data/$UUID/cc chmod 777 /4server/data/$UUID/cc
echo "$(date '+%Y-%m-%d %H:%M:%S') Checking/creating database for $UUID (user $ODOO_DB_USER)"
check_and_create_db check_and_create_db
echo "$(date '+%Y-%m-%d %H:%M:%S') START ODOO 20 finished for $UUID"
+5 -3
View File
@@ -1,10 +1,11 @@
#!/usr/bin/env bash #!/usr/bin/env bash
#--label "traefik.http.routers.${UUID}.middlewares=cors-headers@file" \ #--label "traefik.http.routers.${UUID}.middlewares=cors-headers@file" \
echo "Start N8N container ${UUID}"
# Get the hostname of the machine # Get the hostname of the machine
HOSTNAME=$(hostname) HOSTNAME=$(hostname)
echo "$(date '+%Y-%m-%d %H:%M:%S') START N8N UUID=${UUID} HOST=${HOSTNAME} DOMAIN=${UUID}.odoo4projects.com"
mkdir -p /4server/data/${UUID}/n8n mkdir -p /4server/data/${UUID}/n8n
mkdir -p /4server/data/${UUID}/data mkdir -p /4server/data/${UUID}/data
mkdir -p /4server/data/${UUID}/backup mkdir -p /4server/data/${UUID}/backup
@@ -15,13 +16,14 @@ chmod 777 /4server/data/${UUID}/backup
# Stop the container if it exists # Stop the container if it exists
if docker ps -a --format '{{.Names}}' | grep -q "^${UUID}$"; then if docker ps -a --format '{{.Names}}' | grep -q "^${UUID}$"; then
echo "$(date '+%Y-%m-%d %H:%M') - stopping existing container $UUID" echo "$(date '+%Y-%m-%d %H:%M:%S') Stopping and removing existing container $UUID"
docker stop "$UUID" docker stop "$UUID"
docker rm "$UUID" docker rm "$UUID"
fi fi
echo "$(date '+%Y-%m-%d %H:%M:%S') Starting container $UUID from docker.odoo4projects.com/4projects/n8n:release (data in /4server/data/${UUID}, network 4server_4projects)"
docker run -d \ docker run -d \
--name "$UUID" \ --name "$UUID" \
-p 5678 \ -p 5678 \
@@ -59,4 +61,4 @@ docker run -d \
--network 4server_4projects \ --network 4server_4projects \
docker.odoo4projects.com/4projects/n8n:release docker.odoo4projects.com/4projects/n8n:release
echo "Started $1" echo "$(date '+%Y-%m-%d %H:%M:%S') docker run for $UUID finished with exit code $?"
+1 -1
View File
@@ -1,5 +1,5 @@
listen_addresses = '*' listen_addresses = '*'
max_connections = 150 max_connections = 300
dynamic_shared_memory_type = posix dynamic_shared_memory_type = posix
max_wal_size = 1GB max_wal_size = 1GB
min_wal_size = 80MB min_wal_size = 80MB
+3 -1
View File
@@ -35,7 +35,9 @@ prsync -h "/app/host_vars/hosts" -avz ./sbin/ /4server/sbin/
### POSTGRESS ### POSTGRESS
rex mkdir -p /4server/data/postgres/etc rex mkdir -p /4server/data/postgres/etc
template templates/pq_hba.conf /4server/data/postgres/etc/ template templates/pg_hba.conf /4server/data/postgres/etc/
template templates/postgresql.conf /4server/data/postgres/etc/