first spin

This commit is contained in:
Oliver
2025-09-04 19:51:20 +02:00
parent f44758653a
commit 40775c6842
5 changed files with 204 additions and 181 deletions

View File

@@ -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

110
app/sbin/start/ODOO_18.lib Normal file
View File

@@ -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 <<EOF
DO
\$do\$
BEGIN
IF NOT EXISTS (
SELECT
FROM pg_catalog.pg_user
WHERE usename = '${ODOO_DB_USER}') THEN
CREATE USER ${ODOO_DB_USER} WITH PASSWORD '${ODOO_DB_PASSWORD}';
END IF;
END
\$do\$;
EOF
echo "User '${ODOO_DB_USER}' created (or already exists)."
}
# -----------------------------
# Function: Check DNS and build Traefik labels
# -----------------------------
check_domains() {
local domains="$1"
local server_ip="$2"
echo "Checking DNS resolution for domains: $domains"
local filtered_domains=""
for domain in $domains; do
ns_ip=$(nslookup "$domain" 2>/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"
}

View File

@@ -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

View File

@@ -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

View File

@@ -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