From 678cc61cef076bb119a5dfd64e7374ba38b402b9 Mon Sep 17 00:00:00 2001 From: AIIrondev Date: Tue, 28 Apr 2026 23:05:55 +0200 Subject: [PATCH] Enhance Docker Compose and startup script: implement auto-scaling settings based on server capacity and environment variables for worker configuration --- docker-compose-multitenant.yml | 21 +++++++----- start.sh | 62 +++++++++++++++++++++++++++++++++- 2 files changed, 74 insertions(+), 9 deletions(-) diff --git a/docker-compose-multitenant.yml b/docker-compose-multitenant.yml index 7694953..5f95b29 100644 --- a/docker-compose-multitenant.yml +++ b/docker-compose-multitenant.yml @@ -106,11 +106,16 @@ services: INVENTAR_DELETED_ARCHIVE_FOLDER: /data/deleted-archives # Performance Tuning - INVENTAR_WORKER_CLASS: gevent - INVENTAR_WORKERS: "4" - INVENTAR_THREADS: "2" - INVENTAR_WORKER_TIMEOUT: "30" - INVENTAR_WORKER_CONNECTIONS: "100" + INVENTAR_WORKER_CLASS: ${INVENTAR_WORKER_CLASS:-gevent} + INVENTAR_WORKERS: "${INVENTAR_WORKERS:-4}" + INVENTAR_THREADS: "${INVENTAR_THREADS:-2}" + INVENTAR_WORKER_TIMEOUT: "${INVENTAR_WORKER_TIMEOUT:-30}" + INVENTAR_WORKER_CONNECTIONS: "${INVENTAR_WORKER_CONNECTIONS:-100}" + + # Auto-scaled runtime settings + INVENTAR_APP_CPUS: ${INVENTAR_APP_CPUS:-1.0} + INVENTAR_APP_MEM_LIMIT: ${INVENTAR_APP_MEM_LIMIT:-256m} + INVENTAR_APP_MEM_SWAP_LIMIT: ${INVENTAR_APP_MEM_SWAP_LIMIT:-512m} # Multi-Tenant INVENTAR_MULTITENANT_ENABLED: "true" @@ -131,9 +136,9 @@ services: # Resource Limits (per instance) # With 10 instances: each gets ~150MB, totaling ~1.5GB # Adjust based on server resources - mem_limit: 256m - memswap_limit: 512m - cpus: "1.0" + mem_limit: "${INVENTAR_APP_MEM_LIMIT:-256m}" + memswap_limit: "${INVENTAR_APP_MEM_SWAP_LIMIT:-512m}" + cpus: "${INVENTAR_APP_CPUS:-1.0}" # Health check for load balancer healthcheck: diff --git a/start.sh b/start.sh index c4c6b46..8eb695a 100755 --- a/start.sh +++ b/start.sh @@ -504,12 +504,71 @@ ensure_min_docker_disk_space() { fi } +detect_server_capacity() { + local cpus mem_kb mem_gb app_workers app_cpus app_mem app_mem_swap + + cpus="$(nproc 2>/dev/null || echo 1)" + mem_kb="$(awk '/MemAvailable:/ {print $2; exit}' /proc/meminfo 2>/dev/null || awk '/MemTotal:/ {print $2; exit}' /proc/meminfo || echo 0)" + mem_gb=$(( (mem_kb + 1024*1024 - 1) / (1024*1024) )) + + if [ "$cpus" -ge 8 ] && [ "$mem_gb" -ge 16 ]; then + app_workers=8 + app_cpus="2.0" + app_mem="512m" + app_mem_swap="1024m" + elif [ "$cpus" -ge 4 ] && [ "$mem_gb" -ge 8 ]; then + app_workers=4 + app_cpus="1.0" + app_mem="384m" + app_mem_swap="768m" + elif [ "$cpus" -ge 2 ] && [ "$mem_gb" -ge 4 ]; then + app_workers=2 + app_cpus="0.75" + app_mem="320m" + app_mem_swap="640m" + else + app_workers=1 + app_cpus="0.5" + app_mem="256m" + app_mem_swap="512m" + fi + + if [ -f "$ENV_FILE" ]; then + local env_app_cpus env_app_mem env_app_mem_swap env_workers + env_app_cpus="$(awk -F= '/^INVENTAR_APP_CPUS=/{print $2; exit}' "$ENV_FILE" | tr -d ' ' || true)" + env_app_mem="$(awk -F= '/^INVENTAR_APP_MEM_LIMIT=/{print $2; exit}' "$ENV_FILE" | tr -d ' ' || true)" + env_app_mem_swap="$(awk -F= '/^INVENTAR_APP_MEM_SWAP_LIMIT=/{print $2; exit}' "$ENV_FILE" | tr -d ' ' || true)" + env_workers="$(awk -F= '/^INVENTAR_WORKERS=/{print $2; exit}' "$ENV_FILE" | tr -d ' ' || true)" + + [ -n "$env_app_cpus" ] && app_cpus="$env_app_cpus" + [ -n "$env_app_mem" ] && app_mem="$env_app_mem" + [ -n "$env_app_mem_swap" ] && app_mem_swap="$env_app_mem_swap" + [ -n "$env_workers" ] && app_workers="$env_workers" + fi + + INVENTAR_APP_CPUS="${INVENTAR_APP_CPUS:-$app_cpus}" + INVENTAR_APP_MEM_LIMIT="${INVENTAR_APP_MEM_LIMIT:-$app_mem}" + INVENTAR_APP_MEM_SWAP_LIMIT="${INVENTAR_APP_MEM_SWAP_LIMIT:-$app_mem_swap}" + INVENTAR_WORKERS="${INVENTAR_WORKERS:-$app_workers}" + INVENTAR_THREADS="${INVENTAR_THREADS:-2}" + + echo "Detected host capacity: CPUs=$cpus, RAM=${mem_gb}GB" + echo "Configured app runtime: INVENTAR_WORKERS=$INVENTAR_WORKERS, INVENTAR_APP_CPUS=$INVENTAR_APP_CPUS, INVENTAR_APP_MEM_LIMIT=$INVENTAR_APP_MEM_LIMIT" +} + write_env_file() { cat > "$ENV_FILE" <