From ca2520727d11cd013699d87f12883b3a828428dc Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 10 Oct 2025 17:03:29 -0300 Subject: [PATCH] odoo fucking 17 --- app/sbin/start/ODOO_17 | 116 ++++++++++++++++++++++++++++++++++++++++ app/sbin/startContainer | 7 +++ app/vault/host_vars.img | Bin 26214400 -> 26214400 bytes 3 files changed, 123 insertions(+) create mode 100755 app/sbin/start/ODOO_17 diff --git a/app/sbin/start/ODOO_17 b/app/sbin/start/ODOO_17 new file mode 100755 index 0000000..299fc5b --- /dev/null +++ b/app/sbin/start/ODOO_17 @@ -0,0 +1,116 @@ +#!/bin/bash +echo "START ODOO 17" +# Load functions +source /4server/sbin/ODOO_19/ODOO_19.lib +source /4server/sbin/helpers +get_contract_info + +# Config variables +UUID="${UUID:-default}" +BRANCH="${BRANCH:-release}" + +ODOO_DB_USER="${UUID}" +export ODOO_DB_PASSWORD=$(echo "$SECRET" | jq -r '.psql') + + +echo "ENV: $HDD $DOMAIN_COUNT $BACKUP_SLOTS $CONTAINERDBID" +echo "DBID: $CONTAINERDBID" + +BASEURL="${BASEURL:-/4server/data/$UUID}" +DATA_DIR="$BASEURL/odoo/" +CUSTOM_DIR="$BASEURL/git/$UUID/custom/" +ENTERPRISE_DIR="$BASEURL/git/$UUID/enterprise/" +LOGS_DIR="$BASEURL/logs/" +CONFIG_DIR="$BASEURL/config/" +CC_DIR="$BASEURL/cc/" +BACKUP_DIR="/BACKUP/$UUID" +GIT_DIR="$BASEURL/git-server/" +INSTALL_DIR="$BASEURL/install/" +SSH_DIR="$BASEURL/.ssh/" +ETC_DIR="$BASEURL/etc/" + +SERVER_IP=$(ip -4 addr show eth0 | awk '/inet/ {print $2}' | cut -d/ -f1 | head -n1) + +LABEL_DOMAINS=("$UUID.odoo4projects.com") +if [ -f "$BASEURL/etc/domain" ]; then + while IFS= read -r domain || [[ -n $domain ]]; do + [ -z "$domain" ] && continue + LABEL_DOMAINS+=("$domain") + done < "$BASEURL/etc/domain" +else + echo "[DEBUG] No additional domain file found at $BASEURL/etc/domain" +fi + +RULE="" +for d in "${LABEL_DOMAINS[@]}"; do + RESOLVED_IP=$(nslookup "$d" 2>/dev/null | awk '/^Address: / { print $2 }' | head -n1 || true) + if [ -z "$RESOLVED_IP" ]; then + echo "[DEBUG] Could not resolve $d, skipping" + continue + fi + if [ "$RESOLVED_IP" = "$SERVER_IP" ]; then + RULE+=" || Host(\`$d\`)" + else + echo "[DEBUG] Skipping $d (does not match SERVER_IP $SERVER_IP)" + fi +done +RULE="${RULE# || }" +DOMAIN_LABEL="traefik.http.routers.$UUID.rule=$RULE" +echo "[DEBUG] Final Traefik label: $DOMAIN_LABEL" + +doas docker exec "$UUID" mkdir -p /var/lib/odoo/.local/share/Odoo/ +doas docker exec "$UUID" ln -s /home/odoo/.local/share/Odoo/filestore /var/lib/odoo/.local/share/Odoo/filestore + + +doas find "$BASEURL" -type d -exec chmod 777 {} \; +PORT=$((CONTAINERDBID + 2200)) +echo "PORT $PORT" +chmod 777 $ETC_DIR +chmod 77 $ETC_DIR/gitpath +echo "git clone \"ssh://git@${UUID}.odoo4projects.com:${PORT}/git-server/repos/odoo.git\"" > ${ETC_DIR}/gitpath +echo "GIIIT $ETC_DIR $PORT" + +doas docker stop "$UUID" 2>/dev/null +doas docker rm "$UUID" 2>/dev/null + +EXTRA_DOCKER_PARAMETER="" + +doas docker run -d --name "$UUID" \ + --network 4server_4projects \ + --restart=always \ + $EXTRA_DOCKER_PARAMETER \ + -v "$DATA_DIR/odoo-web-data:/home/odoo/.local/share/Odoo" \ + -v "$CUSTOM_DIR:/mnt/addons/custom" \ + -v "$ENTERPRISE_DIR:/mnt/addons/enterprise" \ + -v "$LOGS_DIR:/mnt/logs" \ + -v "$CC_DIR:/mnt/cc" \ + -v "$BACKUP_DIR:/mnt/backup" \ + -v "$GIT_DIR:/git-server" \ + -v "$INSTALL_DIR:/mnt/install" \ + -v "$SSH_DIR:/etc/sshkey" \ + -v "$ETC_DIR:/mnt/etc" \ + -p "$PORT:22" \ + -e HOST="beedb" \ + -e USER="$ODOO_DB_USER" \ + -e PASSWORD="$ODOO_DB_PASSWORD" \ + -e UUID="$UUID" \ + -e HDD="$HDD" \ + -e DOMAIN_COUNT="$DOMAIN_COUNT" \ + -e BACKUP_SLOTS="$BACKUP_SLOTS" \ + -e WORKER="$WORKER" \ + -e GIT="$GIT" \ + --label "$DOMAIN_LABEL" \ + --label "traefik.http.services.$UUID.loadbalancer.server.port=8069" \ + --label "traefic.http.routers.$UUID.entrypoints=web, websecure" \ + --label "traefik.http.routers.$UUID.tls.certresolver=production" \ + --label "traefik.http.routers.$UUID.tls=true" \ + --label "traefik.http.routers.$UUID.service=$UUID" \ + docker.odoo4projects.com/4projects/odoo_17:$BRANCH + + +doas docker exec $UUID chown -R odoo:odoo /home/odoo/.local +doas docker exec $UUID chown -R odoo:odoo /mnt/* + + + +check_and_create_db diff --git a/app/sbin/startContainer b/app/sbin/startContainer index cc48914..7169787 100755 --- a/app/sbin/startContainer +++ b/app/sbin/startContainer @@ -33,6 +33,13 @@ case "$SECOND_PART" in 003) "$BIN_PATH/start/ODOO_19" ;; + + 004) + "$BIN_PATH/start/ODOO_17" + ;; + + + *) echo "Unknown UUID type: $SECOND_PART" exit 2 diff --git a/app/vault/host_vars.img b/app/vault/host_vars.img index 91ff098f190a5cb3eac6793079229ce32360992a..8aae806a88d2e119896868d88774fcd403ca059a 100644 GIT binary patch delta 7865 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 CbwG&# delta 7865 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 OBn8ufNTy;shyDkxL?}oA