From 40775c684295f25dd43b8f46bf94488824b919cc Mon Sep 17 00:00:00 2001 From: Oliver Date: Thu, 4 Sep 2025 19:51:20 +0200 Subject: [PATCH] first spin --- app/sbin/start/ODOO_18 | 248 +++++++++---------------------- app/sbin/start/ODOO_18.lib | 110 ++++++++++++++ app/templates/docker-compose.yml | 10 +- app/templates/pg_hba.conf | 3 + app/update | 14 ++ 5 files changed, 204 insertions(+), 181 deletions(-) create mode 100644 app/sbin/start/ODOO_18.lib create mode 100644 app/templates/pg_hba.conf diff --git a/app/sbin/start/ODOO_18 b/app/sbin/start/ODOO_18 index 74e0966..ac57191 100755 --- a/app/sbin/start/ODOO_18 +++ b/app/sbin/start/ODOO_18 @@ -1,183 +1,77 @@ -#/bin/bash -echo "Start container ODOO_18: $UUID"" +#!/bin/bash -export PATH=/4SERVER/sbin:$PATH -SERVER_IP=$( ip -4 addr show eth0 | awk '/inet/ {print $2}' | cut -d/ -f1 ) -echo "SERVER_IP $SERVER_IP" +# Load functions +source /4server/sbin/start/ODOO_18.lib -if [ -z "$1" ]; then - exit 0 -else - BASEURL="/4SERVER/data/$1/" +# Config variables +UUID="${UUID:-default}" +BRANCH="${BRANCH:-main}" +STAGING="${STAGING:-false}" + +POSTGRES_HOST="${POSTGRES_HOST:-beedb}" +POSTGRES_PORT="${POSTGRES_PORT:-5432}" +POSTGRES_ADMIN_USER="${POSTGRES_ADMIN_USER:-1gtT0sf8klB9lDbYZD9}" +POSTGRES_ADMIN_PASSWORD="${POSTGRES_ADMIN_PASSWORD:-ZpSwWNafyy9GhY2gzHw}" +ODOO_DB_USER="${UUID}" +export ODOO_DB_PASSWORD=$(echo "$SECRET" | jq -r '.psql') + +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/" +ETC_DIR="$BASEURL/etc/" +INSTALL_DIR="$BASEURL/install/" +SSH_DIR="$BASEURL/.ssh/" +HUGO_DIR="$BASEURL/git-server/local/hugo" + +SERVER_IP=$(ip -4 addr show eth0 | awk '/inet/ {print $2}' | cut -d/ -f1) + +dump_config + +# Main flow +check_and_create_db + +DOMAIN_LABEL=$(check_domains "$UUID.odoo4projects.com" "$SERVER_IP") +DOMAIN_LABEL="$UUID.odoo4projects.com" + + +PORT=$((RANDOM%1000+2200)) + +doas docker stop "$UUID" 2>/dev/null +doas docker rm "$UUID" 2>/dev/null + +EXTRA_DOCKER_PARAMETER="" +if [ -d "$HUGO_DIR" ]; then + EXTRA_DOCKER_PARAMETER="-v $HUGO_DIR:/mnt/hugo" fi - -DOMAIN="$UUID.odoo4projects.com $DOMAIN" -CLIENT_DOMAIN=$(cat ${BASEURL}etc/domain) -echo "CLIENT_DOMAIN: $CLIENT_DOMAIN" -echo "" -if [[ -n "$CLIENT_DOMAIN" ]]; then - DOMAIN+=" www.$CLIENT_DOMAIN $CLIENT_DOMAIN" -fi -echo "Domains: $DOMAIN" - - -NEW=0 -if [ ! -d "$BASEURL" ]; then - echo "NEW CLIENT !!!" - echo "Wait for DNS to update" - - WAIT=true - START_TIME=$(date +%s) - while $WAIT; do - nslookup "$1.odoo4projects.com" > /dev/null 2>&1 - if [ $? -eq 0 ]; then - echo "Domain $DOMAIN resolved successfully." - WAIT=false - fi - - CURRENT_TIME=$(date +%s) - ELAPSED_TIME=$((CURRENT_TIME - START_TIME)) - if [ $ELAPSED_TIME -ge 120 ]; then - echo "Timeout reached. Domain $DOMAIN could not be resolved." - WAIT=false - fi - sleep 5 - done - NEW=1 -fi - -echo "Get valid DNS entries:" -filtered_domains="" - -for domain in $DOMAIN; do -nslookup_output=$(nslookup "$domain" 2>/dev/null) -status=$? - -echo "DOMAIN: $domain $status" -if [[ $status -eq 0 ]]; then - #ns_ip=$(echo "$nslookup_output" | grep 'Address:' | tail -n1 | awk '{print $2}') - ns_ip=$(echo "$nslookup_output" | grep -Eo 'Address: ([0-9]{1,3}\.){3}[0-9]{1,3}' | awk '{print $2}' | tail -n1) - - echo "NS IP $ns_ip" - if [[ "$ns_ip" == "$SERVER_IP" ]]; then - filtered_domains+=" $domain" - echo "Domain added $filtered_domains" - fi - else - echo "Failed to nslookup $domain -- $ns_ip" - fi -done - -filtered_domains=$(echo "$filtered_domains" | xargs) -echo "Filtered domains: $filtered_domains" - - -DOMAIN_LABEL="" - -for domain in $filtered_domains; do - if [ -z "$DOMAIN_LABEL" ]; then - DOMAIN_LABEL="traefik.http.routers.$1.rule=Host(\`$domain\`)" - else - DOMAIN_LABEL+=" || Host(\`$domain\`)" - fi -done - - - -echo $DOMAIN_LABEL - -echo "end domains" - -exit 0 - - echo "BASEURL: $BASEURL" - PORT=$((CONTRACT_ID + 2200)) - echo "CREATING PORT $PORT" - UUID="${1:-default}" - 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/$1" - GIT_DIR="${BASEURL}git-server/" - ETC_DIR="${BASEURL}etc/" - INSTALL_DIR="${BASEURL}install/" - SSH_DIR="${BASEURL}.ssh/" - HUGO_DIR="${BASEURL}git-server/local/hugo" - - log restoreODOO "DOMAIN_LABEL $DOMAIN_LABEL" - - log restoreODOO "CREATING CONTAINER $UUID" - - echo "Stopping and Deleting Contianer" - d stop $UUID - d container rm $UUID - echo "Done Stopping & Deleting containers Errors above are OK" - - - EXTRA_DOCKER_PARAMETER="" - if [ -d "$HUGO_DIR" ]; then - EXTRA_DOCKER_PARAMETER="-v $HUGO_DIR:/mnt/hugo" - fi -echo "******************" -echo $EXTRA_DOCKER_PARAMETER -echo $HUGO_DIR -echo ***********************"" -# start container - check done in checkContractsBee - sudo docker run -d --name "$UUID" \ - --network docker-compose_4projects \ - --restart=always \ - $EXTRA_DOCKER_PARAMETER \ - -v "$DATA_DIR/odoo-web-data:/var/lib/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 "$CONFIG_DIR:/etc/odoo" \ - -v "$GIT_DIR:/git-server" \ - -v "$ETC_DIR:/mnt/etc" \ - -v "$INSTALL_DIR:/mnt/install" \ - -v "$SSH_DIR:/etc/sshkey" \ - -p "$PORT:22" \ - -e HOST=beedb \ - -e USER=$UUID \ - -e PASSWORD=$UUID \ - -e STAGING=$STAGING \ - --label "$DOMAIN_LABEL" \ - --label "traefik.http.services.$1.loadbalancer.server.port=8069" \ - --label "traefic.http.routers.$1.entrypoints=web, websecure" \ - --label "traefik.http.routers.$1.tls.certresolver=production" \ - --label "traefik.http.routers.$1.tls=true" \ - --label "traefik.http.routers.$1.service=$1" \ - --label "traefik.http.routers.$1_S.entrypoints=web,websecure" \ - --label "traefik.http.routers.$1_S.rule=Host(\`s.$1.odoo4projects.com\`)" \ - --label "traefik.http.routers.$1_S.tls.certresolver=production" \ - --label "traefik.http.routers.$1_S.tls=true" \ - --label "traefik.http.services.$1_S.loadbalancer.server.port=8070" \ - --label "traefik.http.routers.$1_S.service=$1_S" \ - docker.odoo4projects.com/4projects/odoo_18:$BRANCH - sudo chmod 777 $DATA_DIR/odoo-web-data - sudo mkdir $ETC_DIR - sudo chmod 777 $ETC_DIR - sudo chmod 777 $INSTALL_DIR - sudo cp /4PROJECTS/config/odoo_18/odoo.conf $CONFIG_DIR - sudo cp /4PROJECTS/config/odoo_18/staging.conf $CONFIG_DIR - echo "git clone ssh://git@$1.odoo4projects.com:$PORT/git-server/repos/odoo.git" > $ETC_DIR/gitpath - echo "$1" > $ETC_DIR/uuid - d exec -it $1 chown -R odoo /mnt - d exec -it $1 chgrp -R odoo /mnt/ - d exec -it $1 chown -R git /git-server - d exec -it $1 chgrp -R git /git-server - d exec -it $1 chmod -R g+rw /git-server - if [ "$NEW" -eq 1 ]; then - restoreODOO $1 default.zip -echo "here" -restoreODOO ${1}_ default.zip -echo "there" - fi +doas docker run -d --name "$UUID" \ + --network 4server_4projects \ + --restart=always \ + $EXTRA_DOCKER_PARAMETER \ + -v "$DATA_DIR/odoo-web-data:/var/lib/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 "$CONFIG_DIR:/etc/odoo" \ + -v "$GIT_DIR:/git-server" \ + -v "$ETC_DIR:/mnt/etc" \ + -v "$INSTALL_DIR:/mnt/install" \ + -v "$SSH_DIR:/etc/sshkey" \ + -p "$PORT:22" \ + -e HOST="$POSTGRES_HOST" \ + -e USER="$ODOO_DB_USER" \ + -e PASSWORD="$ODOO_DB_PASSWORD" \ + -e STAGING="$STAGING" \ + --label "$DOMAIN_LABEL" \ + --label "traefik.http.services.$UUID.loadbalancer.server.port=8069" \ + docker.odoo4projects.com/4projects/odoo_18:$BRANCH diff --git a/app/sbin/start/ODOO_18.lib b/app/sbin/start/ODOO_18.lib new file mode 100644 index 0000000..d24fc14 --- /dev/null +++ b/app/sbin/start/ODOO_18.lib @@ -0,0 +1,110 @@ +#!/bin/bash + +dump_config (){ +echo "========== Odoo Container Configuration ==========" +echo "UUID: $UUID" +echo "BRANCH: $BRANCH" +echo "STAGING: $STAGING" +echo +echo "PostgreSQL Host: $POSTGRES_HOST" +echo "PostgreSQL Port: $POSTGRES_PORT" +echo "PostgreSQL Admin: $POSTGRES_ADMIN_USER / $POSTGRES_ADMIN_PASSWORD" +echo "ODOO DB User: $ODOO_DB_USER" +echo "ODOO DB Password: $ODOO_DB_PASSWORD" +echo +echo "BASEURL: $BASEURL" +echo "DATA_DIR: $DATA_DIR" +echo "CUSTOM_DIR: $CUSTOM_DIR" +echo "ENTERPRISE_DIR: $ENTERPRISE_DIR" +echo "LOGS_DIR: $LOGS_DIR" +echo "CONFIG_DIR: $CONFIG_DIR" +echo "CC_DIR: $CC_DIR" +echo "BACKUP_DIR: $BACKUP_DIR" +echo "GIT_DIR: $GIT_DIR" +echo "ETC_DIR: $ETC_DIR" +echo "INSTALL_DIR: $INSTALL_DIR" +echo "SSH_DIR: $SSH_DIR" +echo "HUGO_DIR: $HUGO_DIR" +echo +echo "SERVER_IP: $SERVER_IP" +echo "==================================================" + +} + + + +# ----------------------------- +# Function: Create PostgreSQL user +# ----------------------------- + +check_and_create_db() { + +echo "Connecting as $POSTGRES_ADMIN_USER to $POSTGRES_HOST:$POSTGRES_PORT" + +# ----------------------------- +# 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") +if [ "$USER_EXISTS" = "no" ]; then + echo "Creating PostgreSQL user $ODOO_DB_USER..." + 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';" +fi + +# ----------------------------- +# 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") + +if [ "$DB_EXISTS" = "no" ]; then + echo "Creating PostgreSQL database $UUID owned by $ODOO_DB_USER..." + PGPASSWORD="$POSTGRES_ADMIN_PASSWORD" psql -h "$POSTGRES_HOST" -U "$POSTGRES_ADMIN_USER" -p "$POSTGRES_PORT" -d postgres -c "CREATE DATABASE \"$UUID\" OWNER \"$ODOO_DB_USER\";" +fi +} + + + + PGPASSWORD="${POSTGRES_ADMIN_PASSWORD}" psql -h "${POSTGRES_HOST}" -U "${POSTGRES_ADMIN_USER}" -p "${POSTGRES_PORT}" -d postgres </dev/null | grep -Eo 'Address: ([0-9]{1,3}\.){3}[0-9]{1,3}' | awk '{print $2}' | tail -n1) + if [[ "$ns_ip" == "$server_ip" ]]; then + filtered_domains+=" $domain" + fi + done + filtered_domains=$(echo "$filtered_domains" | xargs) + + DOMAIN_LABEL="" + for domain in $filtered_domains; do + if [ -z "$DOMAIN_LABEL" ]; then + DOMAIN_LABEL="traefik.http.routers.$UUID.rule=Host(\`$domain\`)" + else + DOMAIN_LABEL+=" || Host(\`$domain\`)" + fi + done + echo "$DOMAIN_LABEL" +} + diff --git a/app/templates/docker-compose.yml b/app/templates/docker-compose.yml index 79a5bf0..fd418c8 100644 --- a/app/templates/docker-compose.yml +++ b/app/templates/docker-compose.yml @@ -5,11 +5,13 @@ services: restart: always environment: - POSTGRES_DB=postgres - - POSTGRES_PASSWORD=deradmin - - POSTGRES_USER=deradmin1 + - POSTGRES_PASSWORD=ZpSwWNafyy9GhY2gzHw + - POSTGRES_USER=1gtT0sf8klB9lDbYZD9 volumes: - - /4server/data/postgres:/var/lib/postgresql/data/ - - /4server/data/pg_backup/:/BACKUP/ + - /4server/data/postgres/data/:/var/lib/postgresql/data/ + - /4server/data/postgres/pg_backup/:/BACKUP/ + - /4server/data/postgres/etc/:/etc/postgresql/16/main/ + networks: 4projects: ipv4_address: 10.5.0.200 diff --git a/app/templates/pg_hba.conf b/app/templates/pg_hba.conf new file mode 100644 index 0000000..d424dd3 --- /dev/null +++ b/app/templates/pg_hba.conf @@ -0,0 +1,3 @@ +# Example: allow your host to connect to all DBs as any user with password +host all all 10.5.0.1/32 md5 + diff --git a/app/update b/app/update index b91e50b..5298d9f 100755 --- a/app/update +++ b/app/update @@ -7,6 +7,11 @@ rex doas chown 4server:4server /4server rex mkdir -p /4server/data/log template templates/hosts /etc/hosts +### BACKUP DIR +rex doas mkdir -p /BACKUP +rex doas chmod 777 /BACKUP +rex doas chown 4server:4server /BACKUP + template templates/.profile /home/4server/.profile ### PACKAGES @@ -20,6 +25,12 @@ rex doas pip install --root-user-action ignore --break-system-packages --no-cach echo "Running prsync ./sbin" prsync -h "/app/host_vars/hosts" -avz ./sbin/ /4server/sbin/ +### POSTGRESS +rex mkdir -p /4server/data/postgres/etc +template templates/pq_hba.conf /4server/data/postgres/etc/ + + + ### API @@ -42,6 +53,9 @@ rex doas rc-service docker start rex doas rc-update add docker boot +#LOGIN ODOO4PROJECTS DOCKER REPO +rex "echo 'Airbus12docker' | doas docker login docker.odoo4projects.com -u admin --password-stdin" + rex mkdir -p /4server/data/traefik/etc template templates/traefik.yaml /4server/data/traefik/etc/traefik.yaml