#!/bin/bash # --------------------------------------------------------------------------- # Logging — use these everywhere instead of bare echo # --------------------------------------------------------------------------- log() { echo "$(date '+%Y-%m-%d %H:%M:%S') [INFO] $*"; } warn() { echo "$(date '+%Y-%m-%d %H:%M:%S') [WARN] $*" >&2; } die() { echo "$(date '+%Y-%m-%d %H:%M:%S') [ERROR] $*" >&2; exit 1; } # Resolve the absolute directory of a script. # Always pass ${BASH_SOURCE[0]} — it holds the real path even when the # script is invoked via PATH (unlike $0 which may be just a bare name). # Usage in top-level scripts: SBIN="$(sbin_dir "${BASH_SOURCE[0]}")" # Sub-scripts one level deep: SBIN_ROOT="$(dirname "$(sbin_dir "${BASH_SOURCE[0]}")")" sbin_dir() { dirname "$(realpath "$1")"; } # --------------------------------------------------------------------------- # load_container_config # Sources /4server/data//config/container.env and exports: # SOFTWARE — n8n | ODOO_17 | ODOO_18 | ODOO_19 # DB_NAME — postgres database/user (may differ from CONTAINER_ID for migrations) # --------------------------------------------------------------------------- load_container_config() { local container_id="${1:-$CONTAINER_ID}" local cfg="/4server/data/$container_id/config/container.env" if [ -f "$cfg" ]; then while IFS= read -r line; do case "$line" in ''|'#'*) continue ;; esac local _k="${line%%=*}" local _v="${line#*=}" case "$_k" in *[!A-Z_]*) continue ;; esac export "$_k=$_v" done < "$cfg" else warn "no container.env found at $cfg" fi } # --------------------------------------------------------------------------- # Postgres defaults (overridable via environment) # --------------------------------------------------------------------------- POSTGRES_HOST="${POSTGRES_HOST:-beedb}" POSTGRES_PORT="${POSTGRES_PORT:-5432}" POSTGRES_ADMIN_USER="${POSTGRES_ADMIN_USER:-1gtT0sf8klB9lDbYZD9}" POSTGRES_ADMIN_PASSWORD="${POSTGRES_ADMIN_PASSWORD:-ZpSwWNafyy9GhY2gzHw}" DB_PATH="/4server/data/contracts.db" # --------------------------------------------------------------------------- # get_contract_info # Reads the contracts.db row for $CONTAINER_ID and exports all columns as env vars. # Also parses SECRET_LIST and exports ODOO_DB_PASSWORD from the psql key. # --------------------------------------------------------------------------- get_contract_info() { log "get_contract_info $CONTAINER_ID" while IFS="=" read -r key value; do [ -n "$key" ] && export "$key=$value" done < <(sqlite3 "$DB_PATH" " WITH c AS (SELECT * FROM containers WHERE UUID='$CONTAINER_ID' LIMIT 1) SELECT 'CONTAINER_ID=' || COALESCE(UUID, '') FROM c UNION ALL SELECT 'EXPIRES=' || COALESCE(expires, '') FROM c UNION ALL SELECT 'IMAGE=' || COALESCE(image, '') FROM c UNION ALL SELECT 'STATUS=' || COALESCE(status, '') FROM c UNION ALL SELECT 'CREATED=' || COALESCE(created, '') FROM c UNION ALL SELECT 'SECRET_LIST=' || COALESCE(secret_list, '') FROM c UNION ALL SELECT 'CONTAINERDBID=' || COALESCE(id, '') FROM c UNION ALL SELECT 'GIT=' || COALESCE(git, '') FROM c UNION ALL SELECT 'BACKUP_SLOTS=' || COALESCE(backup_slots, '') FROM c UNION ALL SELECT 'HDD=' || COALESCE(hdd, '') FROM c UNION ALL SELECT 'WORKERS=' || COALESCE(workers, '') FROM c UNION ALL SELECT 'DOMAINS_SLOTS=' || COALESCE(domains_slots, '') FROM c; ") # Parse SECRET_LIST: backslash-separated key=value pairs # %%=* / #*= split on the FIRST = only, so base64 values like tok=ab== are safe if [ -n "$SECRET_LIST" ]; then while IFS= read -r pair || [ -n "$pair" ]; do _key="${pair%%=*}" _value="${pair#*=}" [ -n "$_key" ] && export "$_key=$_value" done < <(printf '%s' "$SECRET_LIST" | tr -d '\r\n' | tr '\\' '\n') fi export ODOO_DB_PASSWORD=$psql }