#!/usr/bin/env bash # Remap host ports in .env when they are already bound (e.g. system Redis on 6379). set -euo pipefail ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" ENV_FILE="${ROOT}/.env" [[ -f "$ENV_FILE" ]] || exit 0 # Do not rewrite .env while the dev stack is already running: published ports would # appear "in use" but belong to our own containers. if command -v docker >/dev/null 2>&1 && docker info >/dev/null 2>&1; then if docker ps --format '{{.Names}}' 2>/dev/null | grep -qE '^yakpanel-(redis|postgres|api|nats|minio|agent-gateway)$'; then exit 0 fi fi port_listening() { local port="$1" if command -v ss >/dev/null 2>&1; then ss -tuln 2>/dev/null | grep -qE ":${port}($|[[:space:]])" && return 0 fi if command -v netstat >/dev/null 2>&1; then netstat -tuln 2>/dev/null | grep -qE ":${port}($|[[:space:]])" && return 0 fi return 1 } get_kv() { grep -E "^${1}=" "$ENV_FILE" 2>/dev/null | tail -1 | cut -d= -f2- | tr -d '\r' } set_kv() { local key="$1" val="$2" if grep -qE "^${key}=" "$ENV_FILE"; then sed -i "s/^${key}=.*/${key}=${val}/" "$ENV_FILE" else echo "${key}=${val}" >> "$ENV_FILE" fi } find_free_port() { local start="$1" local end=$((start + 400)) local p for ((p = start; p <= end; p++)); do if ! port_listening "$p"; then echo "$p" return 0 fi done echo "$start" } remap_key() { local key="$1" local preferred_alt="$2" local p alt p=$(get_kv "$key") [[ -z "$p" ]] && return 0 if ! port_listening "$p"; then return 0 fi alt="$preferred_alt" if port_listening "$alt"; then alt=$(find_free_port "$preferred_alt") fi echo "[yakpanel] Host port ${p} (${key}) is already in use; set ${key}=${alt} in .env" set_kv "$key" "$alt" } remap_key REDIS_PORT 16379 remap_key POSTGRES_PORT 15432 remap_key API_PORT 18080 remap_key NATS_PORT 14222 remap_key NATS_MONITOR_PORT 18222 remap_key MINIO_PORT 19000 remap_key MINIO_CONSOLE_PORT 19001