This commit is contained in:
Дмитрий Мамедов
2026-06-10 17:26:06 +03:00
parent cd93ddc640
commit 18beb48843
3 changed files with 63 additions and 9 deletions

View File

@@ -18,6 +18,31 @@ step() { echo -e "\n${CYAN}━━━ $1 ━━━${NC}"; }
mark_done() { echo "$1" >> "$PROGRESS_FILE"; }
is_done() { grep -qx "$1" "$PROGRESS_FILE" 2>/dev/null; }
# ─── Find free port (check + increment until free) ──────────────
find_free_port() {
local port=$1 max=$2
max="${max:-65535}"
while [ "$port" -le "$max" ]; do
if ! ss -tlnp "sport = :$port" 2>/dev/null | grep -q .; then
echo "$port"
return 0
fi
port=$((port + 1))
done
echo "$1"
return 1
}
# ─── Update or add a variable in .env ────────────────────────────
set_env() {
local key=$1 val=$2 file="${INSTALL_DIR}/.env"
if grep -q "^${key}=" "$file" 2>/dev/null; then
sed -i "s|^${key}=.*|${key}=${val}|" "$file"
else
echo "${key}=${val}" >> "$file"
fi
}
echo -e "${CYAN}"
echo " ╔══════════════════════════════════════════════╗"
echo " ║ SSO Service — Auto Installer ║"
@@ -180,13 +205,40 @@ set -a; source .env; set +a
# ─── 5. Docker infrastructure ────────────────────────────────────
step "5/8 Starting infrastructure (PostgreSQL, Redis, RabbitMQ)"
# Проверка занятости портов
for port in 5432 6379 5672 15672; do
if ss -tlnp "sport = :$port" 2>/dev/null | grep -q .; then
warn "Port $port is already in use — service may conflict with existing postgres/redis/rabbitmq"
# Проверка и переназначение занятых портов
PORT_MAP=""
for pair in "POSTGRES_PORT:5432" "REDIS_PORT:6379" "RABBITMQ_PORT:5672" "RABBITMQ_UI_PORT:15672"; do
var="${pair%%:*}"
default="${pair#*:}"
current=$(grep "^${var}=" "$INSTALL_DIR/.env" 2>/dev/null | cut -d= -f2) || true
current="${current:-$default}"
if ss -tlnp "sport = :$current" 2>/dev/null | grep -q .; then
warn "Port $current ($var) is busy — finding free port..."
new_port=$(find_free_port "$((current + 1))" 2>/dev/null) || new_port=$((current + 100))
set_env "$var" "$new_port"
info " $var changed: $current$new_port"
PORT_MAP="$PORT_MAP $var=$new_port"
else
info " $var$current"
fi
done
# Если порты изменились — перечитать .env
if [ -n "$PORT_MAP" ]; then
set -a; source "$INSTALL_DIR/.env"; set +a
info "Ports adjusted — re-sourced .env"
fi
# Обновить DATABASE_URL если POSTGRES_PORT изменился
POSTGRES_PORT_CUR=$(grep "^POSTGRES_PORT=" "$INSTALL_DIR/.env" 2>/dev/null | cut -d= -f2)
PG_USER=$(grep "^POSTGRES_USER=" "$INSTALL_DIR/.env" 2>/dev/null | cut -d= -f2)
PG_PASS=$(grep "^POSTGRES_PASSWORD=" "$INSTALL_DIR/.env" 2>/dev/null | cut -d= -f2)
PG_DB=$(grep "^POSTGRES_DB=" "$INSTALL_DIR/.env" 2>/dev/null | cut -d= -f2)
NEW_URL="postgresql://${PG_USER}:${PG_PASS}@localhost:${POSTGRES_PORT_CUR}/${PG_DB}"
set_env "DATABASE_URL" "$NEW_URL"
export DATABASE_URL="$NEW_URL"
# Остановить предыдущие контейнеры (если есть), потом запустить заново
$SUDO docker compose down --remove-orphans 2>/dev/null || true